
Observador silencioso basado en eBPF para entornos de ejecución contenedorizados, diseñado para sandboxes de análisis de malware y monitoreo de Agentic AI.

Un trazador de seguridad ligero basado en eBPF diseñado específicamente para entornos aislados de análisis de malware. Coloca una muestra en un contenedor aislado y Azazel captura cada llamada al sistema, acceso a archivos, conexión de red y comportamiento sospechoso, y te entrega un flujo JSON limpio de todo lo que sucedió.
Ya sea que estés construyendo un Entorno Aislado de Análisis de Malware automatizado o necesites Monitoreo en Tiempo Real 24/7 para Agentes de IA autónomos, Azazel proporciona telemetría JSON quirúrgica, invisible y lista para IA.
Usage:
azazel [flags]
azazel [command]
Commands:
run-sandbox Ejecuta una muestra de malware en un contenedor Docker aislado y la traza
list-containers Lista los contenedores en ejecución
version Muestra la versión
Global Flags:
-c, --container strings ID(s) de contenedor para filtrar (se pueden especificar varios)
-o, --output string Ruta del archivo de salida (por defecto: stdout)
--pretty Muestra JSON con formato bonito
--stdout También imprime en stdout cuando se especifica --output
-v, --verbose Registro detallado
--no-summary Deshabilita el resumen al salir
-h, --help Ayuda

| Categoría | Eventos | Detalles |
|---|---|---|
| Procesos | process_exec, process_exit, process_clone | Árbol completo de procesos: nombre de archivo, argv, códigos de salida, flags de clonación, PID padre |
| Archivos | file_open, file_write, file_read, file_unlink, file_rename | Rutas, flags, conteo de bytes |
| Red | net_connect, net_bind, net_listen, net_accept, net_sendto, net_dns | Direcciones IPv4/IPv6, puertos, detección de DNS mediante kprobe en udp_sendmsg |
| Seguridad | mmap_exec, ptrace, module_load | Mapeos de memoria W+X, intentos de inyección de procesos, carga de módulos del kernel |
19 puntos de enganche en total — tracepoints en la entrada de syscalls + un kprobe para detección de DNS.
vmlinux.h, funciona en distintas versiones del kernel sin necesidad de recompilarjq, Elasticsearch, Splunk o tu propio pipeline/tmp, acceso a archivos sensibles (/etc/shadow, /proc/self/mem), ptrace, mmap W+X y carga de módulos del kernelCONFIG_DEBUG_INFO_BTF=yVerifica tu kernel:
# Soporte BTF (requerido)
ls /sys/kernel/btf/vmlinux
# Versión del kernel
uname -r
# Clonar
git clone https://github.com/beelzebub-labs/azazel.git
cd azazel
# Construir el contenedor de desarrollo
make docker-dev
# Entrar en él (privilegiado, con PID y espacio de nombres cgroup del host)
make docker-dev-run
# Dentro del contenedor:
make vmlinux # Generar definiciones de tipos del kernel
make generate # Compilar BPF C → enlaces Go
make build # Construir el binario
# Trazar todo, salida a stdout
sudo ./bin/azazel
# Trazar todo, guardar en archivo con JSON bonito
sudo ./bin/azazel --output events.json --pretty
# Trazar solo un contenedor específico
sudo ./bin/azazel --container <container_id> --output events.json
# Listar contenedores en ejecución
sudo ./bin/azazel list-containers
# Dentro del contenedor de desarrollo
make test
Esto compila el binario, inicia el trazador, ejecuta un simulador de comportamiento de malware y luego valida que se hayan capturado todos los tipos de eventos esperados.
Cada evento es una línea JSON individual (NDJSON):
{
"timestamp": "2025-01-15T14:30:22.123456789Z",
"event_type": "process_exec",
"pid": 12345,
"tgid": 12345,
"ppid": 12300,
"uid": 0,
"gid": 0,
"comm": "bash",
"cgroup_id": 6789,
"container_id": "a1b2c3d4e5f6",
"filename": "/tmp/suspicious_binary",
"args": "/tmp/suspicious_binary"
}
{
"timestamp": "2025-01-15T14:30:22.234567890Z",
"event_type": "net_connect",
"pid": 12345,
"tgid": 12345,
"ppid": 12300,
"uid": 0,
"gid": 0,
"comm": "curl",
"cgroup_id": 6789,
"container_id": "a1b2c3d4e5f6",
"sa_family": "AF_INET",
"dst_addr": "93.184.216.34",
"dst_port": 443
}
Cuando el trazador se apaga (Ctrl+C o SIGTERM), imprime un resumen en stderr:
========================================
Resumen de Azazel
========================================
Total de eventos: 1847
Conteos de eventos:
file_open 892
file_write 312
process_exec 47
net_connect 23
...
Alertas de seguridad (3):
[MEDIA] ejecución desde ruta sospechosa: /tmp/suspicious_binary (pid=12345 comm=bash)
[MEDIA] acceso a archivo sensible: /etc/shadow (pid=12346 comm=cat)
[CRÍTICA] memoria mapeada como ESCRITURA+EJECUCIÓN (posible inyección de código/desempaquetado) (pid=12347 comm=malware)
========================================
El archivo docker-compose.yml incluido configura un entorno de análisis completo:

# Iniciar el entorno aislado
docker compose up -d
# Copiar una muestra al entorno aislado
docker cp ./samples/malware.elf sandbox:/tmp/sample
# Ejecutarla
docker exec sandbox /tmp/sample
# Los eventos se escriben en ./output/events.json
cat output/events.json | jq .
# Analizar una muestra de principio a fin: hash → traza → informe
sudo ./analyze.sh ./samples/malware.elf 30
Esto produce:
output/events_<timestamp>.json — flujo de eventos sin procesaroutput/report_<timestamp>.md — informe en Markdown con hashes, resumen de eventos, conexiones de red y alertas de seguridadUsage:
azazel [flags]
azazel [command]
Commands:
list-containers Lista los contenedores en ejecución
version Muestra la versión