
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

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
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
azazel/
├── main.go # Punto de entrada
├── cmd/root.go # CLI (cobra)
├── bpf/tracer.bpf.c # Todos los programas eBPF (archivo único)
├── internal/
│ ├── tracer/
│ │ ├── tracer.go # Núcleo: cargar, adjuntar, leer búfer anular
│ │ └── events.go # Tipos de eventos, structs, análisis
│ ├── container/
│ │ └── resolver.go # Resolución de cgroup → ID de contenedor
│ └── output/
│ └── writer.go # Salida JSON + alertas heurísticas
├── test/
│ ├── simulate_malware.sh # Simulador de comportamiento de malware
│ └── run_tests.sh # Conjunto de pruebas automatizado
├── Dockerfile # Compilación multi-etapa de producción
├── Dockerfile.dev # Contenedor de desarrollo con dependencias de compilación
├── docker-compose.yml # Entorno completo de entorno aislado
├── analyze.sh # Script de análisis automatizado
└── Makefile # Sistema de compilación
Azazel marca automáticamente comportamientos sospechosos:
Todo se compila y ejecuta dentro de un único contenedor Docker con Go, clang, libbpf y bpftool:
make docker-dev # Construir la imagen de desarrollo
make docker-dev-run # Entrar en ella (privilegiado + espacios de nombres del host)
# Dentro del contenedor de desarrollo:
make vmlinux # Generar vmlinux.h a partir del BTF del kernel anfitrión
make generate # bpf2go: compilar BPF C → enlaces Go
make build # Compilar el binario Go
make test # Ciclo completo de pruebas
make check-kernel
Las contribuciones son bienvenidas. Por favor, abre un issue primero para discutir lo que te gustaría cambiar.
# Fork, clona, luego:
make docker-dev
make docker-dev-run
# hack hack hack
make test
GPL-2.0 — consulta LICENSE para más detalles.
Los programas BPF tienen licencia GPL-2.0 (requerida para el acceso a helpers de eBPF). El código Go del espacio de usuario también tiene licencia GPL-2.0.
| 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 |
| Alerta | Severidad | Disparador |
|---|
| Ruta de ejecución sospechosa | Media | Ejecución desde /tmp/, /dev/shm/, /var/tmp/ |
| Herramienta sospechosa | Media | wget, curl, nc, python, base64, memfd: |
| Acceso a archivo sensible | Media | /etc/passwd, /etc/shadow, /etc/sudoers, /etc/ssh/, /proc/self/maps, /proc/self/mem, /etc/ld.so.preload |
| Ptrace | Alta | Cualquier syscall ptrace (inyección de proceso / depuración) |
| Carga de módulo del kernel | Alta | Cualquier syscall finit_module |
| mmap W+X | Crítica | Memoria mapeada como ESCRITURA+EJECUCIÓN simultáneamente (inyección de código, desempaquetado) |
| Problema | Solución |
|---|
operation not permitted al cargar BPF | El contenedor debe ejecutarse con --privileged --pid=host --cgroupns=host |
vmlinux.h: No such file | Ejecutar make vmlinux (requiere /sys/kernel/btf/vmlinux) |
kernel doesn't support BTF | El kernel del anfitrión necesita CONFIG_DEBUG_INFO_BTF=y — verificar con ls /sys/kernel/btf/vmlinux |
| La creación del mapa del búfer anular falla | El kernel debe ser 5.8+, verificar con uname -r |
failed to attach tracepoint | Algunos tracepoints no existen en todos los kernels — el trazador registra una advertencia y continúa |
| No se capturan eventos | Verificar que el trazador se esté ejecutando (ps aux | grep azazel), comprobar que la actividad de prueba ocurre después de que el trazador inicia |
| Componente | Tecnología |
|---|
| Lenguaje | Go 1.24+ |
| Biblioteca eBPF | cilium/ebpf v0.17+ |
| Generación de código BPF | bpf2go (CO-RE, basado en BTF) |
| Programas BPF | C, compilados con clang, usando vmlinux.h |
| CLI | cobra |
| Salida | NDJSON (un objeto JSON por línea) |
| Contenedor | Docker, con docker-compose para orquestación del entorno aislado |