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.
| Target | Clase | Vector | Privilegio | Alcance |
|---|---|---|---|---|
| CoovaChilli | CWE-78 | EAP-Identity → conup | root / low-priv | WLAN local |
| wifidog | CWE-78 | Host header → iptables | root | Config no por defecto |
| libuhttpd | CWE-121 | If-Modified-Since → date2unix | low-priv | Local / toolchain |
| librtmp | CWE-125 | AMF3 invoke | crash/leak | OOB read |
| mini_httpd htpasswd | CWE-78 | argv[1] → system() | CLI local | Utilidad CLI |
| Webmin cpan | CWE-78 | args → open(CMD,|) | root | Post-auth |
| Usermin find.cgi | CWE-78 | open(FIND,|) | root | Post-auth |
| CUPSF | CWE-78 | cupsICCProfile → foomaticrip | lp | LAN |
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).
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.
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?".
- RCE real demostrado (ejecución de código, no solo crash): CoovaChilli (touch uid 0/1000), wifidog (reverse shell root), libuhttpd (reverse shell low-priv), Webmin cpan (reverse shell), accel-ppp (markers root), CUPSF (id/touch como lp).
- Primitivas de solo lectura / N-day sin cadena a RCE: librtmp (OOB read AMF3, familia de CVE previos), mini_httpd OOB read (heap underflow).
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.
- CoovaChilli: RCE via EAP-Identity → conup (CWE-78) — Un payload en el primer paquete pre-auth del handshake 802.1X viaja por la cadena EAP→RADIUS→script sin sanitizar y acaba en un eval. RCE root o low-priv según el deployment.
- wifidog: RCE root via cabecera Host (CWE-78) — Un único request HTTP pre-auth con Host malicioso termina en un execvp("/bin/sh","-c") que construye iptables. Reverse shell root.
- libuhttpd: Stack Overflow en date2unix (CWE-121) — Un header If-Modified-Since de 220 bytes desborda buf[128] y toma control del RIP con un decoder XOR in-stack.
- Análisis: librtmp AMF3 + mini_httpd htpasswd — Dos primitivas reales: OOB read N-day en el decoder AMF3 y un command injection CLI en htpasswd, con su cadena y limitaciones.
- La Suite Webmin/Usermin/accel-ppp/CUPS — Cuatro sinks de la familia de scripting servers + L2TP y CUPS, con el bypass de confianza X-SSL-Client-* y su corrección de honestidad.
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.