Serie: Caza Autónoma de Vulnerabilidades con IA Local

Un ciclo completo de caza con agentes de IA local produjo cinco cadenas de ejecución de código reales, verificadas extremo a extremo —CoovaChilli, wifidog, libuhttpd, librtmp, mini_httpd y la suite Webmin/Usermin/accel-ppp/CUPS—. Este índice reúne el pipeline, los sinks línea a línea, las cadenas de explotación y la evidencia, publicados como divulgación responsable para facilitar el hardening y la concienciación.

/índice_de_la_serie +

00. Los Hallazgos en una Tabla

Esta es la fotografía completa del ciclo. Todos los hallazgos pasaron la validación técnica E2E con evidencia reproducible.

TargetClaseVectorPrivilegioAlcance
CoovaChilliCWE-78EAP-Identity → conuproot / low-privWLAN local
wifidogCWE-78Host header → iptablesrootConfig no por defecto
libuhttpdCWE-121If-Modified-Since → date2unixlow-privLocal / toolchain
librtmpCWE-125AMF3 invokecrash/leakOOB read
mini_httpd htpasswdCWE-78argv[1] → system()CLI localUtilidad CLI
Webmin cpanCWE-78args → open(CMD,|)rootPost-auth
Usermin find.cgiCWE-78open(FIND,|)rootPost-auth
CUPSFCWE-78cupsICCProfile → foomaticriplpLAN

01. La Doctrina de Caza

El motor que generó estos hallazgos no es un fuzzer genérico ni un escáner: es un pipeline multicapa con agentes de IA local que clasifica, audita, valida y documenta. La regla de oro que guía todo el proceso es brutalmente simple: sin crash reproducible no hay hallazgo. Y el error de raíz que se corrigió fue la tentación del análisis estático puro (leer código y opinar) frente a la ingeniería inversa real (construir inputs que rompan el programa).

# Las tácticas de caza que alimentaron los sinks de esta serie T1 CVE→Variant Sweep : tomar un CVE reciente, entender el fix, cazar la misma clase en otros paths T6 Helpers adjacent : el core se endurece; los binarios de un solo propósito casi nunca T7 pppd/scripts admin : scripts que el daemon ejecuta con campos del protocolo sin sanear T8 Trust-bypass family : headers/cookies de proxy → todos los sinks post-auth se vuelven candidatos T9 LTS embedded : la rama dormida que master ya parcheó T10 Heritage protocol : bugs de 1994 copiados durante 30 años sin ser rehechos

Cada hallazgo de esta serie nació de uno de estos patrones. CoovaChilli y la suite Webmin/Usermin son T8 (confianza en la cadena EAP→RADIUS→script y en headers de proxy). wifidog y CUPSF son T7/T6 (scripts admin y helpers). libuhttpd es un sink clásico de bounds. La lección del caza-día 1 —detallada a fondo en la serie Sherlock— es que la IA local procesa cientos de proyectos en paralelo y propone, pero la validación con sanitizers y la construcción de la cadena completa es lo único que separa un crash de un hallazgo.

02. El Pipeline de Validación E2E

El estándar que usé para considerar "demostrado" un hallazgo es el SOP de evidencia E2E en container. Nada de "el código se ve vulnerable": cada fase de la cadena deja un marker y un log que se puede re-verificar. El patrón se aplicó de forma consistente en CoovaChilli, wifidog y libuhttpd.

# La estructura canónica de validación (abreviada) docker run -it --name <target>-e2e debian:12 bash # 1. instalar deps, clonar y compilar el target (con ASAN en los C) # 2. escribir la suite que ejecuta la cadena y deja markers por fase # .m_s01 .. .m_sNN = cada eslabón (leak→write→control→pivot→log) # 3. capturar suite_output.log como evidencia final # 4. verificar el escenario REAL de deployment y el usuario del RCE SUITE_RCE_DEFAULT=usuario_al_que_llega # p.ej. chilli:1000 SUITE_PIVOT_LOG=usuario_al_que_pivota # p.ej. root:0

Dos de sus salidas —el detalle del setuid para scripts shebang y la disparidad nativo/gdb— merecen mención por lo que enseñan. Un helper setuid root eleva el euid de un binario ELF pero no de un script con shebang, porque el kernel preserva el real_uid del intérprete. Eso definió si un hallazgo terminaba en root o no. Y en libuhttpd, la dirección del stack difirió en +0xC0 bytes entre correr bajo ptrace (gdb) y correr nativo, y solo se resolvió reconstruyendo el layout en el run real.

03. Librerías vs Productos: el Umbral Real

Una pregunta recurrente al evaluar estos hallazgos es si una librería (librtmp, libuhttpd) tiene el mismo valor que un producto final. La respuesta honesta es que la línea divisoria no es "es una librería" ni "es un producto", sino "¿puedo demostrar ejecución de código en un escenario de despliegue real donde el código vulnerable sea alcanzable?".

CoovaChilli rindió una cadena completa con ejecución verificada; librtmp solo un leak. Esa diferencia —cadena a RCE frente a primitiva sin completar— define el interés real del hallazgo, independientemente de si es libería o producto.

04. Los Posts Individuales

Cada hallazgo de la serie tiene su análisis completo, con el sink línea a línea, los PoCs y las evidencias E2E.

Sobre esta publicación

Todo el material se publica con fines de divulgación responsable: concienciación, hardening y análisis académico de bugs. Los detalles de exploición se presentan en su forma analítica —mecanismo, sink y cadena— con el criterio de no distribuir un exploit listo para disparar contra producciones sin el correspondiente proceso de divulgación. Los mantenedores de los targets afectados fueron contactados como parte del proceso responsable.