Scanner di vulnerabilità basato su shell per CVE-2026-45185 (Dead.Letter) in Exim MTA. Rileva l'uso dopo il rilascio (use-after-free) nelle build GnuTLS, verifica la versione, la libreria TLS e la configurazione CHUNKING. Produce output JSON per l'integrazione CI/CD.
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 |
|---|---|
--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 |
| Codice | Significato |
|---|---|
0 | Non vulnerabile (o è stata trovata una condizione sicura definitiva) |
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 |
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"
]
}