
Código oficial del artículo de ISSTA 2026: ¿Es suficiente "Saber que es malicioso"? Evaluación de los LLM para la auditoría de comportamiento de malware de grano fino
Artículo: ¿Es “saber que es malicioso” suficiente? Evaluación de LLMs para la auditoría detallada del comportamiento de malware
DOI del artículo: 10.1145/3832187
MalEval es un marco para evaluar informes de comportamiento de malware Android generados por grandes modelos de lenguaje. El código de este repositorio implementa dos rutas de ejecución:
El conjunto de datos publicado se aloja por separado en el repositorio de conjuntos de datos de MalEval en Hugging Face.
El benchmark contiene 255 aplicaciones Android: 200 muestras de malware archivadas, 30 muestras de malware recientes y 25 aplicaciones benignas utilizadas como falsos positivos simulados. Consulta DATA.md para ver los archivos publicados, la procedencia, los derechos y las notas de manipulación segura.
info/ Sample metadata for the benign, MalRadar, and new malware splits.
model_registry.yaml Model/provider configuration for LLM-based stages.
DATA.md Dataset composition, provenance, and access instructions.
LICENSE.txt License scope and third-party-material exclusions.
CITATION.cff Machine-readable citation metadata.
src/ Static analysis, summarization, behavior generation, and metrics code.
El conjunto de datos debe extraerse de modo que el repositorio tenga esta estructura:
MalEval/
|-- info/
|-- src/
`-- artifacts/
|-- apk/
|-- call_chain/
|-- entrypoints/
|-- functions/
|-- meta_info/
|-- reachable_func/
`-- reports/
Usa Python 3.10 o superior. Recomendamos un entorno virtual nuevo:
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install -r requirements.txt
Configura los proveedores de modelos en model_registry.yaml antes de ejecutar las etapas basadas en LLM. Cada entrada de modelo puede almacenar valores literales, como api_key y base_url, o referencias a variables de entorno, como api_key_env y base_url_env.
Ejemplo:
models:
gpt:
provider: openai
model: gpt-5
api_key: <your_openai_key>
base_url: https://api.openai.com/v1
El registro predeterminado incluye entradas para gpt, gpt-5, qwen, deepseek, llama, coder, claude y gemini. Si prefieres variables de entorno, define las variables referenciadas por model_registry.yaml, por ejemplo OPENAI_API_KEY, DEEPSEEK_API_KEY, QWEN3_API_KEY, HUGGINGFACE_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, y .
Esta ruta comienza desde los archivos APK en artifacts/apk/<split>/ y regenera los artefactos de análisis estático. El split debe ser uno de malradar, new o benign.
Ejecutar un APK:
sha=<apk_sha256>
python3 src/preparation/run_static_analysis.py \
--folder malradar \
--apk "$sha" \
--output-root results/static_analysis
Ejecutar un pequeño lote muestreado:
python3 src/preparation/run_static_analysis.py \
--folder malradar \
--sample-size 5 \
--seed 42 \
--output-root results/static_analysis
Los archivos generados se escriben en:
results/static_analysis/entrypoints/
results/static_analysis/call_chain/
results/static_analysis/functions/
results/static_analysis/reachable_func/
Esta ruta comienza desde el directorio artifacts/ publicado. Utiliza los archivos precalculados functions, call_chain, entrypoints, reachable_func y meta_info.
model=gpt
split=malradar
sha=<apk_sha256>
python3 src/preparation/get_functionality_summary.py --model "$model" --folder "$split" --apk "$sha"
Omite --apk para ejecutar el split completo.
python3 src/preparation/get_context_summary.py --model "$model" --folder "$split" --apk "$sha"
python3 src/preparation/get_no_context_summary.py --model "$model" --folder "$split" --apk "$sha"
python3 src/generate_behavior/get_behavior.py --model "$model" --folder "$split" --flag context --apk "$sha"
python3 src/generate_behavior/get_behavior.py --model "$model" --folder "$split" --flag no_context --apk "$sha"
python3 src/generate_behavior/get_meta_behavior.py --model "$model" --folder "$split" --apk "$sha"
Las salidas se escriben en results/summary/, results/context_summary/, results/no_context_summary/, results/behavior/, results/no_context_behavior/ y results/meta_behavior/.
Después de generar los resúmenes y los informes de comportamiento, calcula las métricas con:
python3 src/metrics/run_metrics.py --model "$model" --flag context
python3 src/metrics/run_metrics.py --model "$model" --flag no_context
python3 src/metrics/run_metrics.py --model "$model" --flag meta
Para omitir las llamadas al modelo juez:
python3 src/metrics/run_metrics.py --model "$model" --flag context --skip-eas
También hay scripts de métricas individuales disponibles:
python3 src/metrics/aec_b_f1.py --model "$model" --flag context
python3 src/metrics/fpcr_tpmr_f1c.py --model "$model" --flag context
python3 src/metrics/eas.py --model "$model" --flag context --split malradar --judge-model gpt-5
El árbol fuente se puede verificar sin descargar APKs ni configurar credenciales de modelos:
python3 -m compileall -q src
python3 - <<'PY'
import json
from pathlib import Path
expected = {
"archived_sample_info.json": 200,
"latest_sample_info.json": 30,
"benign_sample_info.json": 25,
}
for name, count in expected.items():
actual = len(json.loads((Path("info") / name).read_text()))
assert actual == count, (name, actual, count)
print("metadata check passed: 200 archived malware + 30 recent malware + 25 benign")
PY
GEMINI_PROJECTGEMINI_LOCATION