En el servidor de correo Exim son críticas (), que puede llevar a la ejecución remota de código en el servidor con privilegios de root al procesar una solicitud especialmente formateada. Se ha señalado la posibilidad de explotación del problema en las versiones desde 4.87 hasta 4.91 inclusive o en una compilación con la opción EXPERIMENTAL_EVENT.
En la configuración predeterminada, un usuario local puede llevar a cabo el ataque sin complicaciones adicionales, ya que se aplica ACL 'verify = recipient', que realiza comprobaciones adicionales para direcciones externas. La realización de un ataque remoto es posible al cambiar la configuración, por ejemplo, al actuar como un MX secundario para otro dominio, eliminar la ACL 'verify = recipient' o realizar ciertos cambios en local_part_suffix). También es posible un ataque remoto si un atacante puede mantener la conexión con el servidor abierta durante 7 días (por ejemplo, enviando un solo byte por minuto para evitar el corte por tiempo de espera). No se descarta que existan vectores de ataque más simples para la explotación remota del problema.
La vulnerabilidad es causada por una comprobación incorrecta de la dirección del destinatario en la función deliver_message(), definida en el archivo /src/deliver.c. A través de la manipulación del formato de la dirección, un atacante puede conseguir que sus datos se inserten en los argumentos del comando invocado a través de la función execv() con privilegios de root. No se requieren técnicas complejas, como las utilizadas en desbordamientos de búfer o corrupción de memoria, solo es necesaria la simple inserción de caracteres.
El problema está relacionado con el uso de la siguiente construcción para la transformación de direcciones:
deliver_localpart = expand_string(
string_sprintf('${local_part:%s}', new->address));
deliver_domain = expand_string(
string_sprintf('${domain:%s}', new->address));
La función expand_string() es un combinador sobrecomplicado, que también reconoce el comando '${run{comando argumentos}', lo que lleva a la ejecución de un procesador externo. Por lo tanto, para el ataque en el contexto de una sesión SMTP, a un usuario local solo le basta con enviar un comando del tipo 'RCPT TO "username+${run{…}}@localhost"', donde localhost es uno de los hosts de la lista de local_domains, y username es el nombre de un usuario local existente.
Si el servidor está funcionando como un relay de correo, basta con enviar el comando ‘RCPT TO «${run{…}}@relaydomain.com»‘, donde relaydomain.com es uno de los hosts enumerados en la sección de configuración relay_to_domains. Dado que por defecto en exim no se aplica el modo de eliminación de privilegios (deliver_drop_privilege = false), los comandos pasados a través de «${run{…}}» se ejecutarán con los privilegios de root.
Es notable que la vulnerabilidad fue en la versión 4.92 lanzada en febrero, sin prestar atención a que la corrección podría conducir a problemas de seguridad. No hay motivos para suponer que los desarrolladores de Exim hayan ocultado deliberadamente la vulnerabilidad, ya que el problema fue resuelto durante un fallo que ocurre al enviar direcciones incorrectas, y la vulnerabilidad fue descubierta por la empresa Qualys durante una auditoría de los cambios en Exim.
La corrección para las versiones anteriores, que todavía se utilizan en las distribuciones, está disponible solo en forma de . Las versiones corregidas para las ramas anteriores que solucionan el problema están programadas para el 11 de junio. Las actualizaciones de paquetes están preparadas para , , . y ofrecen la versión 4.92, en la cual el problema no se presenta. RHEL y CentOS abordan el problema , ya que Exim no se encuentra en su repositorio de paquetes estándar.
Fuente: opennet.ru
