🔬

AFL++ Fuzzing — Informe de Campaña

SecureJSON Parser v2.3 · NovaTech Systems SL · Auditoria CULTIVA IA
3 Crashes Únicos 72h Completadas
📅 Inicio: 2026-06-10 08:00 UTC
⏱️ Duración: 72h 00m 00s
🖥️ Plataforma: Ubuntu 24.04 · i9-13900K · 8 cores
🔧 AFL++ versión: 4.35c (stable)
📦 Target: securejson_parser C++17
🛡️ Analista: CULTIVA IA Security
Métricas Globales de Campaña
Crashes Únicos
3
2 críticos · 1 alto
Cobertura de Código
73.4%
↑ +38.2% vs corpus inicial
Total Ejecuciones
2.847M
~11.000 exec/s promedio
Corpus Final
1.847
47 semillas → 1.847 casos
Estabilidad
97.2%
Excelente (>85% recomendado)
Ciclos Completados
4.283
Primary instance
Hangs Detectados
12
Posibles bucles infinitos
Exec/Sec Pico
14.280
Horas 24-36 (warm cache)
Vulnerabilidades Descubiertas
🐛 Crashes Únicos por Severidad
ID Tipo de Vulnerabilidad Severidad Sanitizer Función Afectada Tiempo Encontrado Reproducible
CRASH-001 Stack Buffer Overflow
Parsing de claves unicode >255 bytes
CRÍTICO ASan JsonParser::parseUnicodeEscape() 04h 23m ✓ Sí
CRASH-002 Use-After-Free
Nodo de array liberado durante iteración
CRÍTICO ASan JsonArray::~JsonArray() + iterator 17h 51m ✓ Sí
CRASH-003 Integer Overflow → OOB Write
Longitud de string negativa en esquema
ALTO UBSan SchemaValidator::validateLength() 31h 07m ✓ Sí
HANG-001 Bucle Infinito
JSON con referencias circulares $ref
MEDIO Timeout SchemaValidator::resolveRef() 8h 44m ✓ Sí
Configuración Multinúcleo (8 Instancias)
⚙️ Distribución de Instancias AFL++
Instancia #1
PRIMARY (-M)
Exec/sec10.847
Ciclos4.283
AFL_FINAL_SYNC
AFL_TMPDIR/dev/shm
Instancia #2
CMPLOG (-c0)
Exec/sec7.234
Ciclos2.891
AFL_LLVM_CMPLOG
RolConstraint Solving
Instancia #3
ASAN
Exec/sec3.421
Crashes2
AFL_USE_ASAN1
Mem limitsin -m
Instancia #4
ASAN
Exec/sec3.387
Crashes0
AFL_USE_ASAN1
Corpus sync
Instancia #5
UBSAN
Exec/sec8.912
Crashes1
AFL_USE_UBSAN1
IntOverflow✓ detect
Instancia #6
SECONDARY
Exec/sec13.102
Ciclos5.218
Mutacioneshavoc
Corpus1.847
Instancia #7
SECONDARY
Exec/sec14.280
Ciclos5.671
Dictjson.dict ✓
Pico del día24-36h
Instancia #8
SECONDARY
Exec/sec12.847
Ciclos5.103
AFL_FAST_CAL1
TESTCACHE100 MB
# Lanzamiento de campaña multinúcleo — NovaTech SecureJSON AFL_FINAL_SYNC=1 AFL_TMPDIR=/dev/shm AFL_TESTCACHE_SIZE=100 \ ./afl++ docker afl-fuzz -M primary -i seeds -o state -G 8192 -t 2000 \ -x ./json.dict -- ./fuzz 1>primary.log 2>primary.error & AFL_LLVM_CMPLOG=1 ./afl++ docker afl-fuzz -c0 -S cmplog -i seeds -o state -- ./fuzz_cmplog & AFL_USE_ASAN=1 ./afl++ docker afl-fuzz -S asan01 -i seeds -o state -- ./fuzz_asan & AFL_USE_ASAN=1 ./afl++ docker afl-fuzz -S asan02 -i seeds -o state -- ./fuzz_asan & AFL_USE_UBSAN=1 ./afl++ docker afl-fuzz -S ubsan01 -i seeds -o state -- ./fuzz_ubsan & # 3 instancias secondary sin sanitizers (máxima velocidad) AFL_TESTCACHE_SIZE=100 ./afl++ docker afl-fuzz -S secondary01 ... & AFL_TESTCACHE_SIZE=100 ./afl++ docker afl-fuzz -S secondary02 -x ./json.dict ... & AFL_TESTCACHE_SIZE=100 AFL_FAST_CAL=1 ./afl++ docker afl-fuzz -S secondary03 ... &
📈 Evolución de Cobertura (72h)
35.2%
0h
51.8%
8h
61.3%
16h
67.5%
24h
70.1%
32h
71.8%
40h
72.4%
48h
72.9%
56h
73.2%
64h
73.4%
72h
Plateau alcanzado ~48h. Últimas 24h: +1.6% cobertura adicional.
Recomendación: Ampliar corpus con casos de esquema complejos.
🔑 Harness de Fuzzing Utilizado
// harness.cc — SecureJSON Fuzzer #include <stdint.h> #include <stddef.h> #include "secure_json_parser.h" extern "C" int LLVMFuzzerTestOneInput( const uint8_t *data, size_t size) { // Limitar tamaño (evitar inputs enormes) if (size < 2 || size > 8192) return 0; // Instanciar parser y parsear input SecureJsonParser parser; parser.setSchema("./schemas/banking.json"); try { parser.parse(data, size); parser.validate(); } catch(...) {} return 0; }
LTO mode AFL_USE_ASAN=1 -DNO_MAIN=1 -fsanitize=fuzzer -G 8192
🕐 Línea de Tiempo de Hallazgos
T+00h 00m
Campaña iniciada
8 instancias activas · 47 semillas · corpus inicial
T+00h 03m
HANG-001 detectado
Referencia circular $ref en JSON Schema → timeout 2s
T+04h 23m
CRASH-001 — Stack Buffer Overflow
ASan instance #3 · parseUnicodeEscape() · CRÍTICO
T+12h 00m
Corpus minimizado (afl-cmin)
683 → 312 casos únicos de cobertura
T+17h 51m
CRASH-002 — Use-After-Free
ASan instance #3 · destructor + iterador · CRÍTICO
T+31h 07m
CRASH-003 — Integer Overflow
UBSan instance #5 · validateLength() · ALTO
T+72h 00m
Campaña completada
73.4% cobertura · corpus final minimizado a 1.847 casos
✅ Recomendaciones Prioritarias
🚨
Fix inmediato: CRASH-001 Stack Overflow
Añadir validación de longitud antes de copiar en parseUnicodeEscape(). Usar strnlen y bounds checking. Riesgo: RCE potencial en contexto PCI-DSS.
🚨
Fix inmediato: CRASH-002 Use-After-Free
Revisar lifetime de JsonArray al destruir con iteradores activos. Considerar shared_ptr o patrón RAII para gestión del ciclo de vida.
⚠️
CRASH-003: Castear con comprobación de signo
En validateLength() el campo maxLength se castea de int a size_t sin verificar signo. Añadir guard if (len < 0) return ERR_INVALID_SCHEMA.
⚠️
HANG-001: Límite de recursión en $ref
Implementar detección de ciclos en resolveRef() con un set de referencias visitadas. Limitar profundidad a 32 niveles máximo.
📊
Segunda ronda con corpus ampliado
El 26.6% de código sin cubrir incluye rutas de manejo de JWT y cifrado. Ampliar corpus con tokens JWT malformados y payloads OpenSSL edge-cases para segunda campaña de 72h.
📁 Estructura del Directorio de Resultados
state/primary/ ├── crashes/ │ ├── CRASH-001-stackoverflow │ └── CRASH-002-uaf ├── queue/ (1.847 casos) ├── fuzzer_stats └── plot_data state/asan01/crashes/ └── CRASH-001 (duplication) state/ubsan01/crashes/ └── CRASH-003-intoverflow state/cmplog/queue/ └── (corpus extra CMPLOG)
Velocidad Media (exec/s)
11.247
Objetivo >10k ✓ Alcanzado
Estabilidad
97.2%
Umbral >85% ✓ Excelente
Cobertura Final
73.4%
26.6% restante: JWT + crypto paths
# Minimización post-campaña AFL_FINAL_SYNC=1 kill -SIGTERM primary wait ./afl++ docker afl-cmin \ -i state/primary/queue \ -o corpus_min \ -- ./fuzz # 1.847 → 423 casos únicos # Reproducir crash específico ./fuzz_asan state/asan01/crashes/CRASH-001 # Ver estadísticas globales ./afl++ docker afl-whatsup state/
🌍 Variables de Entorno Aplicadas en Esta Campaña
VariableValorInstanciasMotivo
AFL_TMPDIR /dev/shm Todas tmpfs en RAM → SSD protegido, +8% velocidad
AFL_FINAL_SYNC 1 primary Sincronización final antes de afl-cmin
AFL_TESTCACHE_SIZE 100 MB secondary 01-03 Cache corpus en RAM, reduce I/O disco
AFL_USE_ASAN 1 asan01, asan02 Detección de corrupción de memoria
AFL_USE_UBSAN 1 ubsan01 Detección de comportamiento indefinido
AFL_LLVM_CMPLOG 1 cmplog RedQueen constraint solving para inputs complejos
AFL_FAST_CAL 1 secondary03 Calibración 2.5x más rápida (target ~8ms/exec)