clamav-milter black-hole-mode RCE (CVE-2007-4560)
CVE-2007-4560 es una ejecución remota de comandos en clamav-milter (anterior a la 0.91.2) cuando se integra con Sendmail en modo --black-hole-mode. Un milter (mail filter) es un programa que Sendmail invoca para cada correo; clamav-milter lo usa para pasar los mensajes por el antivirus ClamAV. El modo --black-hole-mode cambia su comportamiento: en lugar de limitarse a analizar, el milter participa en la entrega y, al hacerlo, construye internamente una línea de comando con la dirección del destinatario.
El problema es que esa dirección no se sanea. Si el destinatario tiene la forma nobody+"|comando", el milter interpola la cadena en una línea de shell y ejecuta el comando. Y como clamav-milter corre normalmente como root, el comando hereda ese contexto: es inyección de comandos directa a root, sin escalada intermedia.
El exploit público (4761.pl) abre una conversación SMTP y coloca dos RCPT TO envenenados. Un payload habitual añade una bind shell a inetd y lo reinicia:
RCPT TO: nobody+"|echo '31337 stream tcp nowait root /bin/sh -i' >> /etc/inetd.conf"
RCPT TO: nobody+"|/etc/init.d/inetd restart"Tras ejecutarlo, cada conexión al puerto 31337 lanza /bin/sh -i como root.
Cómo se llega. La pista decisiva suele venir de la enumeración SNMP: la tabla de procesos delata clamav-milter --black-hole-mode. Sin ese dato, el Sendmail parece un servicio de correo más. La enumeración de usuarios SMTP confirma de paso que el servidor procesa nuestras órdenes crudas.
Por qué pasa. Un componente que ejecuta con privilegios altos (el milter como root) construye una línea de comando con datos controlados por el atacante (el destinatario) sin escaparlos. El modo --black-hole-mode, pensado para descartar correo, convirtió ese campo en un vector de ejecución.
Cómo detectarlo. La firma vive en el log SMTP de Sendmail: comandos RCPT TO: cuyo destinatario tiene la forma nobody+"|comando" (una tubería y un comando dentro de la dirección), algo que ningún cliente de correo legítimo envía. En el host, el patrón es de linaje de procesos: clamav-milter/sendmail (como root) lanzando sh/echo/init.d como hijo, y la modificación de /etc/inetd.conf o un puerto nuevo a la escucha (31337) que un FIM y un netstat delatan. Una conexión saliente o un servicio nuevo tras un correo con destinatario raro cierra la cadena.
Defensa. Actualizar ClamAV a 0.91.2 o superior, no ejecutar el milter como root y evitar --black-hole-mode salvo necesidad real. En general, nunca construir líneas de shell concatenando entradas externas.
Máquinas donde se aplica
- ClamAVProving Grounds Practice