
Dead.Letter CVE-2026-45185 EXIM Vulnerability Detection Script
Ein Shell-Skript zur Erkennung, ob ein Linux-System anfällig für CVE-2026-45185 ist, einen Use-After-Free-Fehler im Exim-Mail-Transfer-Agenten, der zu Remote-Codeausführung führen kann.
Konzipiert für den Einsatz in CI/CD-Pipelines, Konfigurationsmanagement-Tools und Ad-hoc-Systemaudits. Erzeugt sowohl menschenlesbare als auch maschinenlesbare (JSON) Ausgabe.
CVE-2026-45185 (Alias: Dead.Letter) ist ein Use-After-Free-Fehler in Exims BDAT-Parsing (Binary Data) für Nachrichtenkörper, der ausgelöst wird, wenn TLS von GnuTLS verarbeitet wird.
Während des TLS-Shutdowns gibt Exim seinen TLS-Übertragungspuffer frei – aber ein verschachtelter BDAT-Empfangswrapper kann weiterhin eingehende Bytes verarbeiten und ungetc() aufrufen, wodurch ein einzelnes \n-Byte in den freigegebenen Bereich geschrieben wird. Dieses Ein-Byte-Schreiben beschädigt die Heap-Allocator-Metadaten, von denen ein Angreifer weitere Speicher-Primitive ableiten und eine Remote-Codeausführung erreichen kann.
| Eigenschaft | Detail |
|---|---|
| CVE | CVE-2026-45185 |
| Alias | Dead.Letter |
| Typ | Use-After-Free (CWE-416) |
| Komponente | Exim BDAT/CHUNKING-Handler (nur GnuTLS-Builds) |
| Angriffsvektor | Netzwerk – nicht authentifiziert, erfordert nur eine TLS-Verbindung und CHUNKING-Erweiterung |
| Betroffene Versionen | Exim 4.97 – 4.99.2, nur GnuTLS-Builds |
| Behoben in | Exim 4.99.3 |
| Entdeckt von | Federico Kirschbaum, XBOW Security Lab (gemeldet am 1. Mai 2026) |
OpenSSL-Builds sind nicht betroffen. Die Schwachstelle betrifft nur Exim, das mit
USE_GNUTLS=yeskompiliert wurde. Wenn Ihr Exim gegen OpenSSL gelinkt ist, sind Sie unabhängig von der Version nicht verwundbar.
Das Skript durchläuft einen Entscheidungsbaum und stoppt und markiert das System als nicht verwundbar, sobald ein definitiv sicherer Zustand bestätigt ist:
Check 1 — Exim-Vorhandensein
Durchsucht $PATH und übliche Installationsorte (/usr/sbin/exim, /usr/sbin/exim4, /usr/local/sbin/exim). Wenn Exim nicht gefunden wird, ist das System nicht verwundbar und das Skript beendet sich sofort.
Check 2 — Exim-Version
Analysiert die exim -bV Ausgabe und vergleicht sie mit dem betroffenen Bereich (4.97 – 4.99.2). Versionen ≥ 4.99.3 werden als gepatcht behandelt. Versionen außerhalb des bekannten Bereichs werden als nicht verwundbar markiert (mit einem Hinweis, falls sie nicht erkannt werden).
Check 3 — TLS-Bibliothek (die kritische Hürde) Verwendet drei Erkennungsmethoden nacheinander:
exim -bV Build-Informationen (zuverlässigste Methode – Exim meldet seine eigenen Kompilierungsmerkmale, z. B. Support for: GnuTLS)ldd Shared-Library-Verknüpfungstrings Binärscan (Fallback)Wenn OpenSSL erkannt wird → Bewertung kippt zu nicht verwundbar unabhängig von der Version. Wenn GnuTLS erkannt wird → die Angriffsfläche wird als vorhanden bestätigt. Wenn keines bestimmt werden kann → Ergebnis ist nicht eindeutig.
Check 4 — CHUNKING/BDAT-Konfiguration (Workaround-Prüfung)
Wird nur ausgeführt, wenn das System zu diesem Zeitpunkt noch als verwundbar markiert ist. Prüft, ob chunking_advertise_hosts explizit auf einen leeren Wert in der Exim-Konfiguration gesetzt wurde, was die BDAT-Ankündigung deaktiviert und den Angriffsvektor blockiert. Behandelt sowohl Einzeldatei-Konfigurationen als auch Debian's Split-Konfigurationslayout (/etc/exim4/conf.d/-Fragmente).
Hinweis: Wenn
chunking_advertise_hostsin der Konfiguration fehlt (Standard), bewirbt Exim CHUNKING an alle Hosts (*). Die Option muss explizit auf einen leeren Wert gesetzt werden, um sie zu deaktivieren.
Check 5 — Informative System-Mitigations Ändert die Bewertung nicht, meldet aber Faktoren, die die Ausnutzbarkeit beeinflussen:
/proc/sys/kernel/randomize_va_space) — sollte 2 seinchecksec-Ausgabe für das Exim-Binär (PIE, RELRO, Stack Canaries), falls checksec installiert istMemoryDenyWriteExecute, NoNewPrivileges, SystemCallFilter/proc-Dateisystem (für ASLR-Prüfung)grep, awk, ldd, headchecksec (optional – für Binär-Härtungsanalyse)systemctl (optional – für systemd-Unit-Inspektion)Debian-exim-Gruppe auf Debian/Ubuntu)chmod +x check_cve_2026_45185.sh
./check_cve_2026_45185.sh
| Flag | Beschreibung |
|---|
| Code | Bedeutung |
|---|---|
0 | Nicht verwundbar (oder ein definitiv sicherer Zustand wurde gefunden) |
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 }}"
# Get just the verdict
./check_cve_2026_45185.sh --json | jq -r '.verdict'
# Check if a specific mitigation was found
./check_cve_2026_45185.sh --json | jq '.mitigations | contains(["aslr=full"])'
# Run across multiple hosts and collect results
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
# From source
# Download 4.99.3 from https://ftp.exim.org/pub/exim/exim4/
# and rebuild with your existing Local/Makefile settings
Überprüfung nach dem Upgrade:
exim -bV | head -1
# Expected: Exim version 4.99.3 ...
Wenn Sie nicht sofort aktualisieren können, deaktiviert das Hinzufügen der folgenden Zeile im Hauptkonfigurationsabschnitt Ihrer Exim-Konfiguration die BDAT-Ankündigung vollständig und blockiert den Angriffsvektor:
chunking_advertise_hosts =
Der leere Wert bedeutet „keine Hosts“ – Exim wird die CHUNKING-Erweiterung nicht mehr in EHLO-Antworten ankündigen. Starten Sie Exim nach dieser Änderung neu:
# Debian / Ubuntu
systemctl restart exim4
# Other systemd systems
systemctl restart exim
Überprüfen, ob CHUNKING nicht mehr angekündigt wird:
# Connect and check the EHLO response — CHUNKING should not appear
echo QUIT | openssl s_client -connect localhost:25 -starttls smtp 2>/dev/null \
| grep -i chunking
# No output = CHUNKING is disabled
Dies ist ein Workaround, keine Lösung. Einige sendende Mailserver verwenden BDAT für die Zustellung großer Nachrichten. Das Deaktivieren kann zu Kompatibilitätsproblemen mit diesen Sendern führen. Aktualisieren Sie so bald wie möglich auf 4.99.3.
Selbst auf einem gepatchten System reduziert das Hinzufügen dieser Direktiven zur Exim-systemd-Unit die Auswirkungen zukünftiger Speicherkorruptions-Schwachstellen:
# /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 und strings zurück, die möglicherweise weniger zuverlässig sind.--json | Ergebnisse als JSON-Objekt ausgeben (siehe unten) |
--quiet | Alle Ausgabe unterdrücken; nur der Exit-Code wird gesetzt |
--no-color | ANSI-Farbcodes deaktivieren (nützlich für Logdateien) |
--help / -h | Nutzungsinformationen anzeigen |
1 |
| Verwundbar |
2 | Nicht eindeutig – ein oder mehrere erforderliche Fakten konnten nicht bestimmt werden; als potenziell verwundbar behandeln |
3 | Skriptfehler oder nicht unterstützte Umgebung |