Scanner de vulnerabilidade baseado em shell para CVE-2026-45185 (Dead.Letter) no Exim MTA. Detecta use-after-free em builds com GnuTLS, verifica versão, biblioteca TLS e configuração CHUNKING. Produz saída JSON para integração CI/CD.
Um script shell para detectar se um sistema Linux é vulnerável ao CVE-2026-45185, um use-after-free no agente de transferência de correio Exim que pode levar à execução remota de código.
Projetado para uso em pipelines CI/CD, ferramentas de gerenciamento de configuração e auditorias ad-hoc do sistema. Produz saída tanto legível por humanos quanto legível por máquina (JSON).
CVE-2026-45185 (também conhecido como: Dead.Letter) é um bug use-after-free na análise de corpo de mensagem BDAT (dados binários) do Exim, acionado quando o TLS é tratado pelo GnuTLS.
Durante o desligamento do TLS, o Exim libera seu buffer de transferência TLS — mas um invólucro
de recepção BDAT aninhado ainda pode processar bytes recebidos e chamar ungetc(),
escrevendo um único byte \n na região liberada. Essa escrita de um byte corrompe metadados
do alocador de heap, a partir dos quais um invasor pode obter primitivas de memória adicionais
e alcançar execução remota de código.
| Propriedade | Detalhe |
|---|---|
| CVE | CVE-2026-45185 |
| Alias | Dead.Letter |
| Tipo | Use-After-Free (CWE-416) |
| Componente | Manipulador BDAT/CHUNKING do Exim (apenas builds com GnuTLS) |
| Vetor de ataque | Rede — não autenticado, requer apenas uma conexão TLS e a extensão CHUNKING |
| Versões afetadas | Exim 4.97 – 4.99.2, apenas builds com GnuTLS |
| Corrigido em | Exim 4.99.3 |
| Descoberto por | Federico Kirschbaum, XBOW Security Lab (relatado em 1 de maio de 2026) |
Builds com OpenSSL não são afetados. A vulnerabilidade é específica para Exim compilado com
USE_GNUTLS=yes. Se seu Exim possui vínculo com OpenSSL, você não está vulnerável independentemente da versão.
O script funciona através de uma árvore de decisão, parando e marcando o sistema como não vulnerável assim que uma condição segura definitiva é confirmada:
Verificação 1 — Presença do Exim
Pesquisa em $PATH e locais de instalação comuns (/usr/sbin/exim,
/usr/sbin/exim4, /usr/local/sbin/exim). Se o Exim não for encontrado, o sistema
não é vulnerável e o script sai imediatamente.
Verificação 2 — Versão do Exim
Analisa a saída de exim -bV e compara com a faixa afetada
(4.97 – 4.99.2). Versões ≥ 4.99.3 são tratadas como corrigidas. Versões fora da faixa
conhecida são marcadas como não vulneráveis (com uma nota se não forem reconhecidas).
Verificação 3 — Biblioteca TLS (a porta crítica) Usa três métodos de detecção em sequência:
exim -bV (mais confiável — o Exim relata seus próprios recursos de tempo de compilação, ex: Support for: GnuTLS)lddstrings (fallback)Se OpenSSL for detectado → o veredito muda para não vulnerável independentemente da versão. Se GnuTLS for detectado → a superfície de ataque é confirmada como presente. Se nenhum puder ser determinado → o resultado é inconclusivo.
Verificação 4 — Configuração de CHUNKING/BDAT (verificação de workaround)
Só é executada se o sistema ainda estiver marcado como vulnerável neste ponto. Verifica
se chunking_advertise_hosts foi explicitamente definido como um valor vazio
no arquivo de configuração do Exim, o que desabilita a publicidade de BDAT e bloqueia o vetor
de ataque. Lida tanto com arquivos de configuração únicos quanto com layout de configuração
dividida do Debian (fragmentos de /etc/exim4/conf.d/).
Nota: se
chunking_advertise_hostsestiver ausente da configuração (o padrão), o Exim anuncia CHUNKING para todos os hosts (*). A opção deve ser explicitamente definida com um valor vazio para desabilitá-la.
Verificação 5 — Mitigações informacionais do sistema Não altera o veredito, mas relata fatores que afetam a explorabilidade:
/proc/sys/kernel/randomize_va_space) — deve ser 2checksec para o binário do Exim (PIE, RELRO, stack canaries) se checksec estiver instaladoMemoryDenyWriteExecute, NoNewPrivileges, SystemCallFilter/proc (para verificação de ASLR)grep, awk, ldd, headchecksec (opcional — para análise de hardening do binário)systemctl (opcional — para inspeção da unit systemd)Debian-exim no Debian/Ubuntu)Nenhuma dependência externa é necessária para as verificações principais de vulnerabilidade.
chmod +x check_cve_2026_45185.sh
./check_cve_2026_45185.sh
| Flag | Descrição |
|---|---|
--json | Saída dos resultados como um objeto JSON (veja abaixo) |
--quiet | Suprime toda a saída; apenas o código de saída é definido |
--no-color | Desabilita códigos de cor ANSI (útil para arquivos de log) |
--help / -h | Exibe informações de uso |
| Código | Significado |
|---|---|
0 | Não vulnerável (ou uma condição segura definitiva foi encontrada) |
1 | Vulnerável |
2 | Inconclusivo — não foi possível determinar um ou mais fatos necessários; trate como potencialmente vulnerável |
3 | Erro do script ou ambiente não suportado |
CVE-2026-45185 (Dead.Letter) — Avaliação de Vulnerabilidade do Exim
===================================================================
[VERIFICAÇÃO] Verificando instalação do Exim...
[AVISO] Binário do Exim encontrado: /usr/sbin/exim4
[VERIFICAÇÃO] Verificando versão do Exim...
Versão detectada: 4.99.1
[FALHA] Exim 4.99.1 está na faixa vulnerável (4.97 – 4.99.2).
[VERIFICAÇÃO] Verificando vinculação da biblioteca TLS (GnuTLS vs OpenSSL)...
[FALHA] Exim está vinculado ao GnuTLS — este build ESTÁ afetado.
[VERIFICAÇÃO] Verificando configuração de publicidade CHUNKING (BDAT)...
Arquivo de configuração: /etc/exim4/exim4.conf
[AVISO] chunking_advertise_hosts não está desabilitado — BDAT está ativo (por padrão anuncia para todos os hosts).
Dica: adicione 'chunking_advertise_hosts =' (valor vazio) à sua configuração principal para desabilitar BDAT como workaround.
[VERIFICAÇÃO] Verificando mitigações de exploração a nível de sistema (informativo)...
[APROVADO] ASLR: randomização completa (randomize_va_space=2)
Versão do glibc: 2.35 (2.32+ tem verificações de metadados de heap mais fortes)
[AVISO] systemd: MemoryDenyWriteExecute não definido — recomenda-se adicionar à unit
[AVISO] systemd: NoNewPrivileges não definido
------------------------------------------------------------
VEREDITO
------------------------------------------------------------
VULNERÁVEL — CVE-2026-45185
Motivo: Versão do Exim 4.99.1 está na faixa vulnerável 4.97–4.99.2
Ações recomendadas:
1. Atualizar o Exim para 4.99.3 ou posterior (correção principal)
2. Como workaround, defina 'chunking_advertise_hosts =' (vazio) na configuração do exim
3. Adicione MemoryDenyWriteExecute=yes e NoNewPrivileges=yes à unit systemd
4. Certifique-se de que ASLR está em 2: echo 2 > /proc/sys/kernel/randomize_va_space
------------------------------------------------------------
--json)