
Dead.Letter CVE-2026-45185 Script di rilevamento delle vulnerabilità EXIM
Uno script shell per rilevare se un sistema Linux è vulnerabile a CVE-2026-45185, un use-after-free nell'Exim mail transfer agent che può portare all'esecuzione di codice remota.
Progettato per l'uso in pipeline CI/CD, strumenti di gestione della configurazione e audit di sistema ad hoc. Produce output sia leggibile dall'uomo sia leggibile dalla macchina (JSON).
CVE-2026-45185 (alias: Dead.Letter) è un bug use-after-free nel parsing del corpo dei messaggi BDAT (binary data) di Exim, attivato quando TLS è gestito da GnuTLS.
Durante lo shutdown TLS, Exim libera il proprio buffer di trasferimento TLS —
ma un wrapper di ricezione BDAT annidato può ancora elaborare byte in arrivo
e chiamare ungetc(), scrivendo un singolo byte \n nella regione liberata.
Quella scrittura di un byte corrompe i metadati dell'heap allocator, da cui
un attaccante può ottenere primitive di memoria aggiuntive e raggiungere
l'esecuzione di codice remoto.
| Proprietà | Dettaglio |
|---|---|
| CVE | CVE-2026-45185 |
| Alias | Dead.Letter |
| Tipo | Use-After-Free (CWE-416) |
| Componente | Gestore BDAT/CHUNKING di Exim (solo build GnuTLS) |
| Vettore di attacco | Rete — non autenticato, richiede solo una connessione TLS e l'estensione CHUNKING |
| Versioni vulnerabili | Exim 4.97 – 4.99.2, solo build GnuTLS |
| Corretta in | Exim 4.99.3 |
| Scoperta da | Federico Kirschbaum, XBOW Security Lab (segnalata il 1 maggio 2026) |
Le build OpenSSL non sono vulnerabili. La vulnerabilità è specifica di Exim compilato con
USE_GNUTLS=yes. Se il tuo Exim usa OpenSSL, non sei vulnerabile indipendentemente dalla versione.
Lo script procede attraverso un albero decisionale, fermandosi e marcando il sistema come non vulnerabile non appena viene confermata una condizione sicura definitiva:
Controllo 1 — Presenza di Exim
Cerca in $PATH e nelle posizioni di installazione comuni (/usr/sbin/exim,
/usr/sbin/exim4, /usr/local/sbin/exim). Se Exim non viene trovato, il
sistema non è vulnerabile e lo script termina immediatamente.
Controllo 2 — Versione di Exim
Analizza l'output di exim -bV e lo confronta con l'intervallo vulnerabile
(4.97 – 4.99.2). Le versioni ≥ 4.99.3 sono considerate corrette. Le versioni
al di fuori dell'intervallo noto sono marcate come non vulnerabili (con una
nota se non sono riconosciute).
Controllo 3 — Libreria TLS (il passaggio critico) Usa tre metodi di rilevamento in sequenza:
exim -bV (il più affidabile — Exim riporta le proprie funzionalità di compilazione, es. Support for: GnuTLS)lddstrings (fallback)Se viene rilevato OpenSSL → il verdetto diventa non vulnerabile indipendentemente dalla versione. Se viene rilevato GnuTLS → la superficie di attacco è confermata come presente. Se non è possibile determinare nessuno dei due → il risultato è inconcludente.
Controllo 4 — Configurazione CHUNKING/BDAT (controllo workaround)
Viene eseguito solo se il sistema è ancora marcato come vulnerabile a questo
punto. Verifica se chunking_advertise_hosts è stato esplicitamente impostato
a un valore vuoto nella configurazione di Exim, il che disabilita
l'annuncio di BDAT e blocca il vettore di attacco. Gestisce sia config a file
singolo sia la struttura di configurazione suddivisa di Debian
(frammenti /etc/exim4/conf.d/).
Nota: se
chunking_advertise_hostsè assente dalla configurazione (il default), Exim annuncia CHUNKING a tutti gli host (*). L'opzione deve essere esplicitamente impostata a un valore vuoto per disabilitarlo.
Controllo 5 — Mitigazioni di sistema informative Non modifica il verdetto, ma riporta fattori che influenzano la sfruttabilità:
/proc/sys/kernel/randomize_va_space) — dovrebbe essere 2checksec per il binario Exim (PIE, RELRO, stack canaries) se checksec è installatoMemoryDenyWriteExecute, NoNewPrivileges, SystemCallFilter/proc (per il controllo ASLR)grep, awk, ldd, headchecksec (opzionale — per l'analisi dell'hardening del binario)systemctl (opzionale — per l'ispezione dell'unità systemd)Debian-exim su Debian/Ubuntu)Non sono richieste dipendenze esterne per i controlli principali della vulnerabilità.
chmod +x check_cve_2026_45185.sh
./check_cve_2026_45185.sh
| Flag | Descrizione |
|---|
| Codice | Significato |
|---|---|
0 | Non vulnerabile (o è stata trovata una condizione sicura definitiva) |
CVE-2026-45185 (Dead.Letter) — Exim Vulnerability Assessment
============================================================
[CHECK] Checking for Exim installation...
[WARN] Exim binary found: /usr/sbin/exim4
[CHECK] Checking Exim version...
Detected version: 4.99.1
[FAIL] Exim 4.99.1 is in the vulnerable range (4.97 – 4.99.2).
[CHECK] Checking TLS library linkage (GnuTLS vs OpenSSL)...
[FAIL] Exim is linked against GnuTLS — this build IS affected.
[CHECK] Checking CHUNKING (BDAT) advertisement config...
Config file: /etc/exim4/exim4.conf
[WARN] chunking_advertise_hosts is not disabled — BDAT is active (default advertises to all hosts).
Tip: add 'chunking_advertise_hosts =' (empty value) to your main config to disable BDAT as a workaround.
[CHECK] Checking system-level exploit mitigations (informational)...
[PASS] ASLR: full randomisation (randomize_va_space=2)
glibc version: 2.35 (2.32+ has stronger heap metadata checks)
[WARN] systemd: MemoryDenyWriteExecute not set — recommend adding to unit
[WARN] systemd: NoNewPrivileges not set
------------------------------------------------------------
VERDICT
------------------------------------------------------------
VULNERABLE — CVE-2026-45185
Reason: Exim version 4.99.1 is in vulnerable range 4.97–4.99.2
Recommended actions:
1. Upgrade Exim to 4.99.3 or later (primary fix)
2. As a workaround, set 'chunking_advertise_hosts =' (empty) in exim config
3. Add MemoryDenyWriteExecute=yes and NoNewPrivileges=yes to the systemd unit
4. Ensure ASLR is set to 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 }}"
# Ottieni solo il verdetto
./check_cve_2026_45185.sh --json | jq -r '.verdict'
# Verifica se è stata trovata una mitigazione specifica
./check_cve_2026_45185.sh --json | jq '.mitigations | contains(["aslr=full"])'
# Esegui su più host e raccogli i risultati
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
# Da sorgente
# Scarica 4.99.3 da https://ftp.exim.org/pub/exim/exim4/
# e ricompila con le tue impostazioni Local/Makefile esistenti
Verifica dopo l'aggiornamento:
exim -bV | head -1
# Atteso: Exim version 4.99.3 ...
Se non puoi aggiornare immediatamente, aggiungere la seguente riga alla sezione di configurazione principale del tuo file di configurazione Exim disabilita completamente l'annuncio di BDAT, bloccando il vettore di attacco:
chunking_advertise_hosts =
Il valore vuoto significa "nessun host" — Exim non annuncerà più l'estensione
CHUNKING nelle risposte EHLO. Riavvia Exim dopo aver apportato questa
modifica:
# Debian / Ubuntu
systemctl restart exim4
# Altri sistemi systemd
systemctl restart exim
Verifica che CHUNKING non sia più annunciato:
# Connettiti e controlla la risposta EHLO — CHUNKING non dovrebbe comparire
echo QUIT | openssl s_client -connect localhost:25 -starttls smtp 2>/dev/null \
| grep -i chunking
# Nessun output = CHUNKING è disabilitato
Questo è un workaround, non un fix. Alcuni server di posta mittenti usano BDAT per la consegna di messaggi di grandi dimensioni. Disabilitarlo può causare problemi di compatibilità con quei mittenti. Aggiorna a 4.99.3 il prima possibile.
Anche su un sistema corretto, aggiungere queste direttive all'unità systemd di Exim riduce l'impatto di qualsiasi futura vulnerabilità di corruzione della memoria:
# /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, che possono essere meno affidabili.--json | Restituisce i risultati come oggetto JSON (vedi sotto) |
--quiet | Sopprime tutto l'output; viene impostato solo il codice di uscita |
--no-color | Disabilita i codici colore ANSI (utile per i file di log) |
--help / -h | Stampa le informazioni sull'utilizzo |
1 |
| Vulnerabile |
2 | Inconcludente — non è stato possibile determinare uno o più fatti richiesti; trattare come potenzialmente vulnerabile |
3 | Errore dello script o ambiente non supportato |