liamromanis101/Dead.Letter-CVE-2026-45185
GitHub: liamromanis101/Dead.Letter-CVE-2026-45185
一个纯 Bash 编写的 Exim CVE-2026-45185 远程代码执行漏洞检测脚本,通过多层决策树静态判定系统受影响状态,支持 JSON 输出和 CI/CD 自动化集成。
Stars: 1 | Forks: 2
# CVE-2026-45185 — "Dead.Letter" Exim 漏洞扫描器
一个用于检测 Linux 系统是否受以下漏洞影响的 Shell 脚本:
CVE-2026-45185,这是 Exim 邮件传输代理中的一个释放后重用漏洞,
可导致远程代码执行。
专为在 CI/CD 管道、配置管理工具以及临时系统审计中使用而设计。可生成
人类可读和机器可读(JSON)格式的输出。
## 漏洞详情
**CVE-2026-45185**(别名:*Dead.Letter*)是 Exim 的 BDAT(二进制数据)
消息体解析中的一个释放后重用漏洞,当 TLS 由 GnuTLS 处理时触发。
在 TLS 关闭期间,Exim 会释放其 TLS 传输缓冲区 —— 但嵌套的 BDAT
接收包装器仍可处理传入的字节并调用 `ungetc()`,将单个 `\n` 字节写入
已释放的内存区域。这一个字节的写入会破坏堆分配器元数据,攻击者可
借此获得进一步的内存原语并实现远程代码执行。
| 属性 | 详情 |
|---|---|
| **CVE** | CVE-2026-45185 |
| **别名** | Dead.Letter |
| **类型** | Use-After-Free (CWE-416) |
| **组件** | Exim BDAT/CHUNKING 处理器(仅限 GnuTLS 构建) |
| **攻击向量** | 网络 — 无需身份验证,仅需 TLS 连接和 CHUNKING 扩展 |
| **受影响版本** | Exim 4.97 – 4.99.2,仅限 GnuTLS 构建 |
| **修复版本** | Exim 4.99.3 |
| **发现者** | Federico Kirschbaum, XBOW Security Lab(2026 年 5 月 1 日报告) |
## 脚本检查内容
该脚本通过决策树进行工作,一旦确认明确的安全条件,
就会立即停止并将系统标记为 **不受此漏洞影响**:
**检查 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 库(关键判定点)**
依次使用三种检测方法:
1. `exim -bV` 构建信息(最可靠 — Exim 会报告其自身的编译时特性,例如 `Support for: GnuTLS`)
2. `ldd` 共享库链接情况
3. `strings` 二进制扫描(备选方案)
如果检测到 OpenSSL → 无论版本如何,结果均翻转为 **不受影响**。
如果检测到 GnuTLS → 确认存在攻击面。如果两者均无法确定 → 结果为
**无法判定**。
**检查 4 — CHUNKING/BDAT 配置(缓解方案检查)**
仅在系统此时仍被标记为易受攻击时运行。检查 Exim 配置中
`chunking_advertise_hosts` 是否被显式设置为空值,
这将禁用 BDAT 广告并阻断攻击向量。支持单文件配置和
Debian 的拆分配置布局(`/etc/exim4/conf.d/` 片段)。
**检查 5 — 系统缓解措施(仅供参考)**
不改变最终结论,但会报告影响可利用性的因素:
- ASLR 级别(`/proc/sys/kernel/randomize_va_space`)— 应为 `2`
- glibc 版本 — 2.32 及以上版本具有更强的堆元数据完整性检查
- 如果安装了 `checksec`,将输出 Exim 二进制文件的 `checksec` 结果(PIE、RELRO、stack canaries)
- systemd 单元沙箱配置:`MemoryDenyWriteExecute`、`NoNewPrivileges`、`SystemCallFilter`
## 系统要求
- **Bash** 4.0 或更高版本
- 带有 `/proc` 文件系统的 **Linux**(用于 ASLR 检查)
- 标准 coreutils:`grep`、`awk`、`ldd`、`head`
- `checksec`(可选 — 用于二进制加固分析)
- `systemctl`(可选 — 用于 systemd 单元检查)
- 必须以足够的权限运行,以读取 Exim 配置文件(通常为 root,或 Debian/Ubuntu 上属于 `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 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 输出 (`--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"
]
}
```
## CI/CD 集成
### GitHub Actions
```
- 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
```
### GitLab CI
```
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
```
### Ansible
```
- 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 }}"
```
### 使用 jq 解析 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 '.'
```
## 修复方案
### 主要修复 — 升级 Exim
```
# 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 版本 4.99.3 ...
```
### 临时缓解方案 — 禁用 CHUNKING/BDAT
如果无法立即升级,请在 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 已禁用
```
### 加固 systemd 单元(纵深防御)
即使在已修补的系统上,将以下指令添加到 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
```
## 局限性
- 本脚本仅执行 **静态检测**。它不会尝试利用该漏洞或在目标系统的特定运行时环境下验证可利用性。
- 在无法执行 Exim 二进制文件的系统上(例如容器中的权限限制),TLS 库检测将回退到 `ldd` 和 `strings`,这可能会降低可靠性。
- **低于 4.97** 的 Exim 版本虽不在此特定 CVE 的已知受影响范围内,但已停止维护,且可能存在其他未修补的问题。无论哪种情况,均建议升级。
- 脚本需要对 Exim 配置文件具有读取权限才能检查 CHUNKING 缓解方案。如果在没有足够权限的情况下运行,配置检查步骤将报告无法判定,而不是失败。
## 参考资料
- [The Hacker News — 新的 Exim BDAT 漏洞使 GnuTLS 构建版本面临潜在代码执行风险](https://thehackernews.com/2026/05/new-exim-bdat-vulnerability-exposes.html)
- [Exim 项目 — 安全文档](https://www.exim.org/static/doc/security/)
- [Exim 规范 — CHUNKING (`chunking_advertise_hosts`)](https://www.exim.org/exim-html-current/doc/html/spec_html/ch-main_configuration.html)
- [Exim 规范 — TLS 配置](https://www.exim.org/exim-html-current/doc/html/spec_html/ch-encrypted_smtp_connections_using_tlsssl.html)
- [XBOW Security Lab](https://xbow.com)
标签:BDAT, CISA项目, Cutter, CVE-2026-45185, CWE-416, Exim, GnuTLS, meg, MTA, Shell脚本, SQL, UAF, Use-After-Free, 信息安全, 加密, 堆损坏, 子域名暴力破解, 应用安全, 无线安全, 漏洞扫描器, 系统审计, 编程工具, 网络安全, 网络安全审计, 自动化检测, 远程代码执行, 邮件传输代理, 释放后重用, 隐私保护