Proyecto de Trabajo Fin de Máster orientado a clasificar macros VBA de documentos ofimáticos mediante análisis estático y modelos clásicos de inteligencia artificial. La solución permite analizar código VBA suelto o documentos Office, extraer sus macros, calcular señales de riesgo y devolver una clasificación multiclase útil para un analista SOC.
El objetivo es apoyar la decisión de seguridad ante documentos Office con macros, sin ejecutar el código. El sistema clasifica cada muestra en cuatro niveles:
0 = SEGURA
1 = BAJA SOSPECHA
2 = REVISION RECOMENDADA
3 = ALTO RIESGO
Además de la clase predicha, la salida incluye probabilidades del modelo, señales principales, riesgo estático aproximado y recomendacion operativa.
Documento Office o código VBA
-> extracción de macros
-> extracción de características estáticas
-> modelo IA multiclase
-> API JSON
-> flujo n8n
-> interfaz web para analista SOC
Recomendado:
- Python 3.11 o 3.12.
- Sistema operativo Windows o Ubuntu.
- PowerShell en Windows para los comandos locales.
- n8n opcional si se quiere probar el flujo automatizado completo.
Dependencias Python principales:
- pandas
- scikit-learn
- joblib
- matplotlib
- oletools
Las dependencias están definidas en:
outputs/requirements_modelo.txt
Desde la raíz del repositorio:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r .\outputs\requirements_modelo.txtSi python no funciona en Windows, usar:
py -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r .\outputs\requirements_modelo.txtEn Ubuntu:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r outputs/requirements_modelo.txtEl dataset final multiclase se encuentra en:
outputs/macro_dataset_final_multiclass.csv
Para reentrenar el modelo:
python .\outputs\train_multiclass_macro_classifier.py --dataset .\outputs\macro_dataset_final_multiclass.csvEn Ubuntu:
python outputs/train_multiclass_macro_classifier.py --dataset outputs/macro_dataset_final_multiclass.csvEl entrenamiento genera los resultados en:
outputs/resultados_modelo_multiclase/
Archivos principales generados:
best_multiclass_model.joblib
metrics_summary_multiclass.csv
test_classification_report_multiclass.txt
test_confusion_matrix_multiclass.csv
test_confusion_matrix_multiclass.png
Ejemplo con una macro de prueba:
python .\outputs\predict_multiclass_macro.py --input .\outputs\examples\test_macros\benign\benign_01_format_report.vbaEjemplo con una macro sospechosa:
python .\outputs\predict_multiclass_macro.py --input .\outputs\examples\malicioso.vbaLa salida muestra:
- nivel de riesgo predicho;
- probabilidades por clase;
- riesgo estático aproximado;
- señales principales detectadas;
- recomendacion operativa.
La API permite analizar documentos Office o código VBA mediante peticiones HTTP.
Arranque local:
python .\outputs\office_macro_analysis_api.py --host 127.0.0.1 --port 8092Arranque en Ubuntu Server:
python outputs/office_macro_analysis_api.py --host 0.0.0.0 --port 8092Comprobación:
curl http://127.0.0.1:8092/healthEndpoint principal:
POST /analyze-office
Ejemplo de cuerpo JSON:
{
"file_name": "documento.docm",
"file_base64": "BASE64_DEL_DOCUMENTO"
}La interfaz web permite subir un documento Office o pegar código VBA. La web no clasifica directamente: envia la muestra a n8n y n8n llama a la API del modelo.
Arranque:
python .\web_n8n_office_demo\app.py --webhook-url http://IP_N8N:5678/webhook/analizar-officeAbrir en el navegador:
http://127.0.0.1:8093
Si se quiere probar sin n8n, se puede arrancar la API y llamar directamente al
endpoint /analyze-office.
Flujo recomendado:
Webhook
-> HTTP Request
-> Respond to Webhook
Nodo Webhook:
HTTP Method: POST
Path: analizar-office
Respond: Using Respond to Webhook Node
Nodo HTTP Request:
Method: POST
URL: http://IP_API:8092/analyze-office
Body Content Type: JSON
Cuerpo JSON:
{
"file_name": "{{ $json.body.file_name }}",
"file_base64": "{{ $json.body.file_base64 }}"
}Nodo Respond to Webhook:
Respond With: Text
Response Body: ={{ JSON.stringify($json) }}
Header recomendado: Content-Type: application/json
.
├── outputs/
│ ├── extract_macro_features.py
│ ├── train_multiclass_macro_classifier.py
│ ├── predict_multiclass_macro.py
│ ├── office_macro_analysis_api.py
│ ├── macro_dataset_final_multiclass.csv
│ ├── requirements_modelo.txt
│ ├── examples/
│ └── resultados_modelo_multiclase/
├── web_n8n_office_demo/
│ ├── app.py
├── README.md
El modelo final seleccionado fue gradient_boosting. Sobre el conjunto de test
se obtuvieron los siguientes valores:
accuracy: 0.9826
precision_macro: 0.9749
recall_macro: 0.9842
f1_macro: 0.9791
f1_weighted: 0.9827
Estos resultados pueden reproducirse ejecutando de nuevo el script de entrenamiento sobre el dataset final.
- El sistema realiza análisis estático, no ejecuta macros.
- La clasificación representa una estimación de riesgo, no una confirmación definitiva de malware.
- El dataset combina macros reales, ejemplos controlados y variantes sintéticas, por lo que puede contener sesgos.
- Para uso real debería complementarse con EDR, sandbox, reputacion de origen y validación por analistas.
Este repositorio esta preparado para reproducir:
- la extracción de características estáticas;
- el entrenamiento del modelo multiclase;
- la evaluación con métricas;
- la predicción sobre macros VBA;
- la API de análisis;
- la integración con n8n;
- la interfaz web orientada a analistas SOC.