No servidor de e-mail Exim crítica (), que pode levar à execução remota de código no servidor com permissões de root ao processar uma solicitação formatada de maneira específica. A possibilidade de exploração do problema foi observada nas versões de 4.87 a 4.91, inclusive, ou em compilações com a opção EXPERIMENTAL_EVENT.
Na configuração padrão, um ataque pode ser realizado sem dificuldades adicionais por um usuário local, pois utiliza o ACL "verify = recipient", que realiza verificações adicionais para endereços externos. A realização de um ataque remoto é possível ao mudar as configurações, por exemplo, ao atuar como um MX secundário para outro domínio, remover o ACL "verify = recipient" ou fazer alterações específicas no local_part_suffix. Um ataque remoto também é viável se o invasor conseguir manter a conexão com o servidor aberta durante 7 dias (por exemplo, enviando um byte por minuto para contornar a interrupção por tempo limite). Não se pode descartar que existam vetores de ataque mais simples para a exploração remota do problema.
A vulnerabilidade é causada pela verificação incorreta do endereço do destinatário na função deliver_message(), definida no arquivo /src/deliver.c. Através da manipulação da formatação do endereço, o atacante pode conseguir a substituição de seus dados nos argumentos do comando chamado através da função execv() com permissões de root. Não é necessário empregar técnicas complexas utilizadas em estouros de buffer ou corrupção de memória, basta simplesmente a substituição de caracteres.
O problema está relacionado ao uso da construção para a transformação de endereços:
deliver_localpart = expand_string(
string_sprintf("${local_part:%s}", new->address));
deliver_domain = expand_string(
string_sprintf("${domain:%s}", new->address));
A função expand_string() é um combinador excessivamente complexo, incluindo o reconhecimento do comando "${run{comando argumentos}", que leva à execução de um processador externo. Assim, para um ataque no contexto de uma sessão SMTP, basta que um usuário local envie um comando da forma 'RCPT TO "username+${run{…}}@localhost"', onde localhost é um dos hosts da lista local_domains, e username é o nome de um usuário local existente.
Se o servidor estiver funcionando como um relé de e-mail, basta enviar o comando ‘RCPT TO «${run{…}}@relaydomain.com»‘, onde relaydomain.com é um dos hosts listados na seção de configurações relay_to_domains. Como, por padrão, o exim não aplica o modo de queda de privilégios (deliver_drop_privilege = false), os comandos passados através de «${run{…}}» serão executados com privilégios de root.
É notável que a vulnerabilidade foi na versão 4.92 lançada em fevereiro, sem chamar a atenção para o fato de que a correção poderia causar problemas de segurança. Não há motivos para acreditar que houve uma ocultação consciente da vulnerabilidade pelos desenvolvedores do Exim, uma vez que o problema foi resolvido durante de uma falha que ocorria ao transmitir endereços incorretos, e a vulnerabilidade foi identificada pela empresa Qualys durante uma auditoria das mudanças no Exim.
A correção para versões anteriores, que continuam a ser utilizadas nas distribuições, está disponível apenas na forma de . Atualizações corretivas para ramos anteriores com a correção do problema estão programadas para 11 de junho. Pacotes de atualização foram preparados para , , . e fornecem a versão 4.92, na qual o problema não se manifesta. O RHEL e o CentOS lidam com , uma vez que o Exim não faz parte de seu repositório padrão de pacotes.
Fonte: opennet.ru
