Análisis: librtmp AMF3 + mini_httpd htpasswd
Dos hallazgos que son primitivas reales pero de impacto limitado:
un OOB read en el decoder AMF3 de librtmp y un command injection en el helper htpasswd de mini_httpd. Este análisis documenta las cadenas, el alcance real y por qué no llegan a ejecución de código en un despliegue remoto típico.
/librtmp_minihttpd +
00. Resumen de Ambos Casos
| Caso | Clase | Primitiva | ¿Cadena a RCE? | Conclusión |
|---|---|---|---|---|
| librtmp AMF3 | CWE-125 | OOB read (fuga) | No | Info-leak, sin ejecución |
| mini_httpd htpasswd | CWE-78 | Command injection | Sí (local) | Utilidad CLI, no alcanzable remota |
01. Caso A — librtmp OOB read AMF3
librtmp es la librería del cliente RTMP usada por rtmpdump y, a través de él, por muchísimos reproductores y utilidades de streaming. El protocolo RTMP encapsula mensajes AMF (Action Message Format) y el tipo 0x14 corresponde a AMF3 INVOKE. El parser de estructuras AMF3 lee valores con un rango mal acotado, produciendo una lectura fuera de límites.
El desencadenante es que el cliente (rtmpdump/aplicación) procesa un mensaje del servidor RTMP. Al ser una lectura fuera de límites, el resultado es una fuga de memoria del heap y, en el mejor caso, un crash del cliente. No hay una cadena directa a ejecución de código arbitraria en las compilaciones típicas. Además, esta zona del código pertenece a una familia de bugs previos de librtmp (por ejemplo el strcpy sin bound en el handler de metadata), que ya fueron corregidos; este sumidero concreto repite el patrón de validación ausente.
Es una primitiva de fuga de memoria en el lado cliente, alcanzable solo contra una aplicación que se conecte a un servidor RTMP malicioso. No escala a RCE, y es variante de un patrón ya corregido en la misma librería.
02. Caso B — mini_httpd htpasswd
mini_httpd es un servidor HTTP mínimo muy usado en sistemas embebidos y routers. Distribuye, junto al daemon, utilidades auxiliares —entre ellas htpasswd, que genera los ficheros de autenticación. El argumento (normalmente el nombre de archivo de passwords) llega a un system() sin validar:
Es un command injection real: el input del usuario llega a sh -c. La limitación crítica es que htpasswd es una utilidad de línea de comandos local —no un daemon que escuche. Para explotarla, un atacante ya necesita ejecución local en el sistema o un servidor CGI/helper que derive su invocación de input remoto, que no es el patrón de despliegue por defecto.
Inyección genuina pero con superficie local: requiere un deploy donde un helper invoque htpasswd con input influenciable, o acceso local previo. No es alcanzable desde internet contra el daemon por defecto.
03. La Lección: Primitiva vs Impacto
Lo que estos dos casos enseñan, junto a los demás de la serie, es que la gravedad de un hallazgo no depende solo de la clase (CWE), sino del encadenamiento a ejecución de código y del despliegue real:
- librtmp es un bug real de lectura fuera de límites que se queda en fuga/crash del cliente, sin camino a RCE.
- mini_httpd htpasswd tiene inyección de comandos real, pero solo alcanzable con ejecución local previa o un helper no-estándar.
En contraste, CoovaChilli, wifidog y libuhttpd demostraron ejecución de código verificada. La diferencia no es el CWE, es la cadena completa y el alcanzamiento del código vulnerable desde una superficie real. Para evaluar un hallazgo hay que preguntarse: ¿el código vulnerable es alcanzable desde donde un atacante puede estar, y convierte eso en ejecución?
04. Referencias
| Referencia | Descripción |
|---|---|
| librtmp | Librería cliente RTMP (rtmpdump) |
| AMF3_ReadNumber/String | Sink del OOB read (packet type 0x14) |
| htpasswd.c:214 | Sink sprintf + system en mini_httpd |
| CWE-125 | Out-of-bounds Read |
| CWE-78 | Improper Neutralization in OS Command |