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){
"cve": "CVE-2026-45185",
"alias": "Dead.Letter",
"host": "mailserver-01",
"timestamp": "2026-05-12T17:00:00Z",
"verdict": "vulnerable",
"reason": "Exim version 4.99.1 is in vulnerable range 4.97–4.99.2",
"exit_code": 1,
"findings": {
"exim_binary": "/usr/sbin/exim4",
"exim_version": "4.99.1",
"exim_version_vulnerable": "true",
"tls_library": "gnutls",
"tls_library_detected": "gnutls",
"exim_config": "/etc/exim4/exim4.conf",
"chunking_advertised": "true",
"aslr_level": "2",
"glibc_version": "2.35"
},
"mitigations": [
"aslr=full"
]
}
- name: Check for CVE-2026-45185
run: |
chmod +x check_cve_2026_45185.sh
./check_cve_2026_45185.sh --json | tee vuln-report.json
exit $(jq '.exit_code' vuln-report.json)
- name: Upload vulnerability report
if: always()
uses: actions/upload-artifact@v4
with:
name: cve-2026-45185-report
path: vuln-report.json
check-exim-vuln:
stage: security
script:
- chmod +x check_cve_2026_45185.sh
- ./check_cve_2026_45185.sh --json > vuln-report.json
artifacts:
when: always
paths:
- vuln-report.json
allow_failure: false
- name: Run CVE-2026-45185 check
script: check_cve_2026_45185.sh --json
register: vuln_check
failed_when: vuln_check.rc == 1
changed_when: false
- name: Show vulnerability report
debug:
msg: "{{ vuln_check.stdout | from_json }}"
# Obter apenas o veredito
./check_cve_2026_45185.sh --json | jq -r '.verdict'
# Verificar se uma mitigação específica foi encontrada
./check_cve_2026_45185.sh --json | jq '.mitigations | contains(["aslr=full"])'
# Executar em vários hosts e coletar resultados
for host in mail1 mail2 mail3; do
ssh "$host" 'bash -s' < check_cve_2026_45185.sh --json
done | jq -s '.'
# Debian / Ubuntu
apt-get update && apt-get install --only-upgrade exim4
# RHEL / CentOS / Fedora
dnf upgrade exim
# A partir da fonte
# Baixe 4.99.3 de https://ftp.exim.org/pub/exim/exim4/
# e reconstrua com suas configurações existentes de Local/Makefile
Verifique após a atualização:
exim -bV | head -1
# Esperado: Exim version 4.99.3 ...
Se não puder atualizar imediatamente, adicionar a seguinte linha à seção de configuração principal do seu arquivo de configuração do Exim desabilita completamente a publicidade de BDAT, bloqueando o vetor de ataque:
chunking_advertise_hosts =
O valor vazio significa "nenhum host" — o Exim não anunciará mais a
extensão CHUNKING nas respostas EHLO. Reinicie o Exim após fazer esta
alteração:
# Debian / Ubuntu
systemctl restart exim4
# Outros sistemas systemd
systemctl restart exim
Verifique se CHUNKING não é mais anunciado:
# Conecte-se e verifique a resposta EHLO — CHUNKING não deve aparecer
echo QUIT | openssl s_client -connect localhost:25 -starttls smtp 2>/dev/null \
| grep -i chunking
# Sem saída = CHUNKING está desabilitado
Isto é um workaround, não uma correção. Alguns servidores de correio remetentes usam BDAT para entrega de mensagens grandes. Desabilitá-lo pode causar problemas de compatibilidade com esses remetentes. Atualize para 4.99.3 o mais rápido possível.
Mesmo em um sistema corrigido, adicionar essas diretivas à unit systemd do Exim reduz o impacto de qualquer futura vulnerabilidade de corrupção de memória:
# /etc/systemd/system/exim4.service.d/hardening.conf
[Service]
NoNewPrivileges=yes
MemoryDenyWriteExecute=yes
ProtectSystem=strict
PrivateTmp=yes
RestrictAddressFamilies=AF_INET AF_INET6
SystemCallFilter=@system-service
systemctl daemon-reload && systemctl restart exim4
ldd e
strings, que podem ser menos confiáveis.