基于 Shell 的漏洞扫描器,针对 Exim MTA 中的 CVE-2026-45185(Dead.Letter)。检测 GnuTLS 构建中的释放后使用,检查版本、TLS 库和 CHUNKING 配置。生成 JSON 输出以用于 CI/CD 集成。
用于检测 Linux 系统是否受 CVE-2026-45185 影响的 Shell 脚本,该漏洞是 Exim 邮件传输代理中的一个释放后使用漏洞,可导致远程代码执行。
专为 CI/CD 管道、配置管理工具和临时系统审计设计。同时输出人类可读和机器可读(JSON)格式的结果。
CVE-2026-45185(别名:Dead.Letter)是 Exim 的 BDAT(二进制数据)消息体解析中的一个释放后使用缺陷,当通过 GnuTLS 处理 TLS 时被触发。
在 TLS 关闭期间,Exim 释放其 TLS 传输缓冲区——但嵌套的 BDAT 接收包装器仍可处理传入字节并调用 ungetc(),将一个 \n 字节写入已释放区域。这个单字节写入会破坏堆分配器元数据,攻击者可借此获得进一步内存操作原语并实现远程代码执行。
| 属性 | 详情 |
|---|
| CVE | CVE-2026-45185 |
| 别名 | Dead.Letter |
| 类型 | 释放后使用(CWE-416) |
| 组件 | Exim BDAT/CHUNKING 处理程序(仅 GnuTLS 构建) |
| 攻击向量 | 网络——未认证,仅需 TLS 连接和 CHUNKING 扩展 |
| 受影响版本 | Exim 4.97 – 4.99.2(仅 GnuTLS 构建) |
| 修复版本 | Exim 4.99.3 |
| 发现者 | Federico Kirschbaum,XBOW 安全实验室(2026年5月1日报告) |
OpenSSL 构建不受影响。 该漏洞仅针对使用
USE_GNUTLS=yes编译的 Exim。如果你的 Exim 链接到 OpenSSL,则无论版本如何都不受影响。
该脚本通过决策树工作,一旦确认明确的安全条件,即停止并将系统标记为不受影响。
检查 1 — Exim 存在性
搜索 $PATH 和常见安装位置(/usr/sbin/exim、/usr/sbin/exim4、/usr/local/sbin/exim)。如果未找到 Exim,系统不受影响并立即退出。
检查 2 — Exim 版本
解析 exim -bV 输出并与受影响范围(4.97 – 4.99.2)比较。版本 ≥ 4.99.3 视为已修补。超出已知范围的版本标记为不受影响(如果版本无法识别则附注说明)。
检查 3 — TLS 库(关键门控) 按顺序使用三种检测方法:
exim -bV 构建信息(最可靠——Exim 报告其自身的编译时特性,如 Support for: GnuTLS)ldd 共享库链接strings 二进制扫描(回退)如果检测到 OpenSSL → 判定转为不受影响,无论版本如何。如果检测到 GnuTLS → 确认攻击面存在。如果两者均无法确定 → 结果为无法判定。
检查 4 — CHUNKING/BDAT 配置(规避措施检查)
仅在系统此时仍标记为受影响时运行。检查 Exim 配置中 chunking_advertise_hosts 是否已明确设置为空值,这将禁用 BDAT 公告并阻止攻击向量。处理单文件配置和 Debian 的分片配置布局(/etc/exim4/conf.d/ 片段)。
注意:如果配置中 缺少
chunking_advertise_hosts(默认情况),Exim 会向所有主机(*)公告 CHUNKING。必须将选项明确设置为空值才能禁用它。
检查 5 — 信息系统级缓解措施 不改变判定,但报告影响可利用性的因素:
/proc/sys/kernel/randomize_va_space)——应为 2checksec,输出 Exim 二进制文件的 checksec 结果(PIE、RELRO、栈保护)MemoryDenyWriteExecute、NoNewPrivileges、SystemCallFilter/proc 文件系统的 Linux(用于 ASLR 检查)grep、awk、ldd、headchecksec(可选——用于二进制加固分析)systemctl(可选——用于 systemd 单元检查)Debian-exim 组的用户)核心漏洞检查不需要外部依赖。
chmod +x check_cve_2026_45185.sh
./check_cve_2026_45185.sh
| 标志 | 描述 |
|---|---|
--json | 以 JSON 对象形式输出结果(见下文) |
--quiet | 抑制所有输出;仅设置退出码 |
--no-color | 禁用 ANSI 颜色代码(用于日志文件) |
--help / -h | 打印使用信息 |
| 代码 | 含义 |
|---|---|
0 | 不受影响(或找到了明确的安全条件) |
1 | 受影响 |
2 | 无法判定——无法确定一个或多个必要信息;视为潜在受影响 |
3 | 脚本错误或不受支持的环境 |
CVE-2026-45185 (Dead.Letter) — Exim 漏洞评估
============================================================
[检查] 检查 Exim 安装...
[警告] 发现 Exim 二进制文件:/usr/sbin/exim4
[检查] 检查 Exim 版本...
检测到版本:4.99.1
[失败] Exim 4.99.1 在受影响范围(4.97 – 4.99.2)内。
[检查] 检查 TLS 库链接(GnuTLS vs OpenSSL)...
[失败] Exim 链接到 GnuTLS — 此构建确实受影响。
[检查] 检查 CHUNKING (BDAT) 公告配置...
配置文件:/etc/exim4/exim4.conf
[警告] chunking_advertise_hosts 未禁用 — BDAT 处于活动状态(默认向所有主机公告)。
提示:在主配置中添加 'chunking_advertise_hosts ='(空值)以禁用 BDAT 作为规避措施。
[检查] 检查系统级漏洞利用缓解措施(参考信息)...
[通过] ASLR:完全随机化(randomize_va_space=2)
glibc 版本:2.35(2.32+ 具有更强的堆元数据检查)
[警告] systemd:未设置 MemoryDenyWriteExecute — 建议添加到单元
[警告] systemd:未设置 NoNewPrivileges
------------------------------------------------------------
判定结果
------------------------------------------------------------
受影响 — CVE-2026-45185
原因:Exim 版本 4.99.1 在受影响范围 4.97–4.99.2 内
建议操作:
1. 将 Exim 升级到 4.99.3 或更高版本(主要修复)
2. 作为规避措施,在 exim 配置中设置 'chunking_advertise_hosts ='(空值)
3. 在 systemd 单元中添加 MemoryDenyWriteExecute=yes 和 NoNewPrivileges=yes
4. 确保 ASLR 设置为 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 }}"
# 仅获取判定结果
./check_cve_2026_45185.sh --json | jq -r '.verdict'
# 检查是否发现了特定缓解措施
./check_cve_2026_45185.sh --json | jq '.mitigations | contains(["aslr=full"])'
# 跨多台主机运行并收集结果
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
# 从源码
# 从 https://ftp.exim.org/pub/exim/exim4/ 下载 4.99.3
# 并使用现有的 Local/Makefile 设置重新构建
升级后验证:
exim -bV | head -1
# 预期输出:Exim version 4.99.3 ...
如果无法立即升级,在 Exim 配置的主配置段中添加以下行可以完全禁用 BDAT 公告,从而阻止攻击向量:
chunking_advertise_hosts =
空值表示“没有主机”——Exim 将不再在 EHLO 响应中公告 CHUNKING 扩展。修改后重启 Exim:
# Debian / Ubuntu
systemctl restart exim4
# 其他 systemd 系统
systemctl restart exim
验证 CHUNKING 不再被公告:
# 连接并检查 EHLO 响应——应不出现 CHUNKING
echo QUIT | openssl s_client -connect localhost:25 -starttls smtp 2>/dev/null \
| grep -i chunking
# 无输出 = CHUNKING 已禁用
这是规避措施,并非修复。 某些发送邮件服务器使用 BDAT 传送大消息。禁用 BDAT 可能导致与这些发送者的兼容性问题。请尽快升级到 4.99.3。
即使在已修补的系统上,在 Exim systemd 单元中添加以下指令可以减少未来任何内存损坏漏洞的影响:
# /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 和 strings,可能不太可靠。