CULTIVA IA / Red Team — NutriFlow SaaS

identificacion-ofensiva-de-bugs · v2.3.1 pre-release audit · 2026-06-16
CRÍTICO ACTIVO AUTORIZADO CULTIVA SECURITY
Resumen Ejecutivo
Críticos
3
RCE + heap overflow
Altos
7
auth bypass + SSRF
Medios
12
info-leaks + logic
Superficies analizadas
4
parser · api · supply-chain · driver
Metodología — Fases de Ejecución
Fase 01
Reconocimiento
  • Enumeración de versiones
  • Mapeo de superficie de ataque
  • CVE database (NVD, OSV)
  • SBOM analysis (syft)
✓ Completado
Fase 02
Análisis Estático
  • CodeQL sobre Python/FastAPI
  • Semgrep: funciones peligrosas C
  • Ghidra: binario nutriparser
  • Patch diffing v2.2 → v2.3
✓ Completado
Fase 03
Análisis Dinámico
  • Frida: hooking runtime iOS/Android
  • DynamoRIO: taint analysis C
  • WinDbg: driver IOCTL
  • eBPF bpftrace: syscalls
⟳ En curso
Fase 04
Fuzzing
  • AFL++ 4.21: harness .ndi parser
  • LibAFL: API HTTP/2 endpoints
  • Nyx snapshot: stateful auth
  • LLM-guided corpus (ChatAFL)
⟳ En curso
Fase 05
Explotación
  • Primitivas: addrof/fakeobj
  • Bypass ASLR via info-leak
  • Payload PoC documentado
  • Reporte + mitigaciones
○ Pendiente
Hallazgos Identificados
ID Severidad Hallazgo CWE Herramientas Descripción Estado
NTR-001 ● CRÍTICO
Heap overflow en parse_ndi_header()
nutriparser · C daemon · parser binario .ndi
CWE-122
AFL++ 4.21 KASAN Ghidra
memcpy sin validación de bounds con campo user-controlled entry.name_len. CVSS 9.8.
● Confirmado
NTR-002 ● CRÍTICO
OOB write vía campo next en ndi_chain
nutriparser · C daemon · parser de cadenas
CWE-787
Semgrep DynamoRIO
Puntero avanzado por campo next sin verificar buf_len remanente. Write-what-where limitado.
◉ PoC activo
NTR-003 ● CRÍTICO
SSRF a metadata AWS IMDSv1
FastAPI · /api/v2/import-diet-url · HTTP endpoint
CWE-918
CodeQL Burp Suite
URL parameter sin validación permite acceso a 169.254.169.254. IMDSv2 no enforced. Credenciales IAM expuestas.
● Confirmado
NTR-004 ▲ ALTO
Auth bypass en IOCTL handler (Windows desktop)
nutri_driver.sys · IOCTL 0x22041C · kernel Windows
CWE-284
WinDbg IDA Pro BinDiff
IOCTL handler omite verificación de token de sesión. Escalada local a SYSTEM mediante llamada directa.
◉ PoC activo
NTR-005 ▲ ALTO
Dependency confusion — paquete interno nutri-core
Supply chain · PyPI · CI/CD pipeline
CWE-1357
syft grype CodeQL
Paquete interno no publicado en PyPI. Nombre reservable por atacante. RCE en build-time via install hook.
● Confirmado
NTR-006 ▲ ALTO
PAC bypass en cliente iOS 17
iOS app · NutriFlow.ipa · Objective-C runtime
CWE-693
Frida objection
Gadget de signing reutilizable en librería de terceros. PAC bypass con firma incorrecta de punteros de función.
◌ Analizando
NTR-007 ◆ MEDIO
Integer truncation en size calc (Android NDK)
libnutricalc.so · Android 14 · ARM64
CWE-190
AFL++ ASan
u32 truncado a u16 en cálculo de tamaño de buffer. MTE probabilístico detectado con tag collision bajo Scudo.
○ Triage
Deep-Dive: NTR-001 — Heap Overflow
9.8
CVSS v3.1 — CRÍTICO
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
RCE
nutriparser/src/ndi_parser.c · línea 247 ⚠ VULNERABLE
// NDI header parser — NutriFlow v2.3.1 int parse_ndi_header(uint8_t *buf, size_t buf_len) { ndi_entry_t *e = (ndi_entry_t *)buf; char label[64]; // fixed-size stack buffer // ⚠ VULN: name_len proviene del archivo sin validar memcpy(label, e->name, e->name_len); // heap overflow! // FIX recomendado: // if (e->name_len > sizeof(label) - 1) return -EINVAL; // memcpy(label, e->name, e->name_len); }
Crash Triage — AFL++ output
==AFL fuzzer crash #0041== KASAN: heap-buffer-overflow in parse_ndi_header Write of size 512 at addr ffff888003a12040 memcpy+0x1f (nutriparser.c:247) parse_ndi_header+0x8c (ndi_parser.c:247) process_diet_file+0x1a3 (api_handler.c:89) Corpus input: crash-0041-minimal.ndi (28 bytes)
Cobertura de Fuzzing — AFL++ Stats
parse_ndi_header()89%
ndi_chain_walker()64%
crypto_decrypt_ndi()31%
api_v2_import_url()47%
ioctl_handler_0x22041C()73%
48,291
Ejecuciones/seg
23
Crashes únicos
1,847
Paths cubiertos
Progreso del Red Team
Reconocimiento completado
2026-06-10 · SBOM generado · 247 deps analizadas
Análisis estático — 3 críticos detectados
2026-06-12 · CodeQL + Semgrep + Ghidra
Fuzzing harness .ndi — crash #0041
2026-06-14 · AFL++ 4.21 + KASAN · heap overflow confirmado
Análisis dinámico — Frida iOS + DynamoRIO
2026-06-16 · En curso · PAC bypass analizando
Explotación + PoC final
Target: 2026-06-20 · NTR-001/003 prioritarios
Entrega informe + parches recomendados
Target: 2026-06-23 · NutriFlow v2.4.0 deadline
Herramientas por Superficie de Ataque
Herramienta Categoría Superficie Acción ejecutada Hallazgo
AFL++ 4.21 Fuzzing Parser .ndi (C) Coverage-guided + CMPLOG + QEMU-mode NTR-001, NTR-002
CodeQL Estático FastAPI Python Query: SSRF + taint analysis sobre URL params NTR-003
Semgrep Pro Estático nutriparser C Regla c-fixed-array-unbounded-copy (custom) NTR-001
Ghidra 11.2 Estático nutriparser binary Decompilación + ML function sig recognition NTR-002
BinDiff 8 Patch Diff nutri_driver.sys v1.4→v1.5 Diff v1.4 (win10) vs v1.5 (win11) → nuevo check faltante NTR-004
syft + grype Supply Chain SBOM completo Generación SBOM · dependency confusion check NTR-005
Frida + objection Dinámico iOS 17 + Android 14 Hook runtime ObjC · intercept crypto calls · PAC gadgets NTR-006
DynamoRIO Dinámico nutriparser C Taint analysis: entrada .ndi → funciones sink NTR-002
ChatAFL (LLM) IA-Asistida API HTTP/2 + parser LLM corpus expansion +38% edge coverage corpus mejorado
Checklist — Parser Binario C
  • Validación bounds antes de memcpy()
    entry.name_len sin verificar contra sizeof(label)
  • Invariante offset+length ≤ buf_len (u64)
    aritmética de next en cadenas sin overflow check
  • ASan/KASAN habilitado en CI
    activado en pipeline de test pero no en prod
  • Stack canaries habilitados
    -fstack-protector-all verificado en binario
  • RELRO completo + PIE activo
    nutriparser compilado sin full RELRO
  • Fuzzing continuo (ClusterFuzzLite CI)
    configurado en GitHub Actions — implementar
  • Crypto writes a arrays fijos con bound check
    crypto_decrypt_ndi() sin límite en destino
Mitigaciones Recomendadas
NTR-001 CRÍTICO Añadir bounds check antes de memcpy
if (e->name_len >= sizeof(label)) return -EINVAL; memcpy(label, e->name, e->name_len); label[e->name_len] = '\0';
NTR-003 CRÍTICO Bloquear SSRF vía allowlist + IMDSv2
# FastAPI · api_handler.py BLOCKED = ["169.254.", "10.", "192.168."] if any(url.startswith(p) for p in BLOCKED): raise HTTPException(400, "URL bloqueada")
NTR-005 ALTO Publicar nutri-core en PyPI (squatting)
Registrar nutri-core en PyPI con paquete vacío + aviso de seguridad. Usar hash pinning en requirements.txt. Configurar private registry (AWS CodeArtifact).