Exim CVE-2026-45185:GnuTLS 释放后利用实现未经授权远程代码执行 (Dead.Letter)

发布于: 2026-05-13 • 分类: 安全 / 邮件 / CVE

事件概述

2026年5月11日,XBOW 公开披露了 CVE-2026-45185——Exim(互联网上部署最广泛的邮件传输代理)中的一个严重漏洞。该漏洞代号 "Dead.Letter",是一个无需认证的远程代码执行 (RCE) 漏洞,触发路径是 Exim 的 GnuTLS TLS 处理层中的释放后使用 (Use-After-Free)。最危险的是:该漏洞几乎不需要服务器有任何特殊配置即可被利用,影响 Debian、Ubuntu 及许多其他发行版上基于 GnuTLS 的默认安装

这也是 XBOW 研究员——一位拥有 20 年安全经验、近 10 年专业漏洞利用开发经验的资深人士——首次使用 AI/LLM 工具发现并协助开发完整的漏洞利用链。

漏洞本质:一个字节写向自由

CVE-2026-45185 本质上是一个释放后使用漏洞,在 Exim 的 TLS 关闭过程释放传输缓冲区时触发,而嵌套的 BDAT (RFC 3030 CHUNKING) 接收包装器仍在处理传入字节。利用序列:

  1. TLS 关闭触发释放:Exim 通过 tls_close() 释放 TLS 传输缓冲区 (xfer_buffer)
  2. BDAT 包装器仍在活动:BDAT 接收函数将 TLS 回调保存到"下层行",tls_close() 不会触及这一行
  3. 向已释放内存写入:读取循环调用 bdat_ungetc('\n'),通过 tls_ungetc() 向已释放缓冲区写入一个换行符
  4. 分配器元数据破坏:这一个字节的写入落在 Exim 自定义分配器的元数据上,破坏其内部结构
  5. 从原语到 RCE:利用程序借助分配器破坏获取进一步的读写原语,最终实现完整的远程代码执行

技术深度解析

Exim 的 TLS 架构

客户端通过明文 SMTP 会话发出 STARTTLS 命令时,Exim 的命令调度器调用 tls_server_start()

BDAT 层

BDAT (RFC 3030 CHUNKING) 是一种模态 SMTP 扩展,客户端提前声明邮件正文的大小。Exim 通过维护第二行函数指针 (lwr_receive_*) 来处理。BDAT 块开始时,bdat_push_receive_functions() 将当前行(可能是 TLS 包装器)保存到 lwr_receive_*,并用 BDAT 包装器覆盖顶行。BDAT 包装器将实际 I/O 委托给保存的下层。

关键点:下层行 (lwr_receive_*) 只应由 bdat_push/pop_receive_functions() 操作。没有其他代码路径会触碰它。

释放点

read_message_bdat_smtp() 内部,循环通过 bdat_getc() 读取正文字节,它调用 lwr_receive_getc()(即 tls_getc())。tls_getc() 调用 tls_refill(),后者调用 gnutls_record_recv()。当它返回 0 (TLS EOF):

tls_close(NULL, TLS_NO_SHUTDOWN); // 释放 state->xfer_buffer
return FALSE;

tls_close() 内部,顶层 receive_* 回调被恢复为普通的 smtp_* 函数,但 lwr_receive_*没有被触及xfer_buffer 指针被释放但从未置为 NULL

使用点

bdat_getc() 返回 EOD 后,循环进入 EOD 分支。如果 \r 后面没有 \n,缺失 CRLF 的修复代码触发:

bdat_ungetc('\n');

这调用了保存的 lwr_receive_ungetc()(仍是 tls_ungetc())。tls_ungetc() 通过已释放的指针写入:

ssl_xfer_buffer[--ssl_xfer_buffer_lwm] = ch;

一个 \n 字节被写入已释放的内存,落在分配器元数据上。

从单字节到 RCE

利用链涉及多个阶段:

为什么这很重要:AI 发现的角度

XBOW 的文档不仅技术深度令人印象深刻,更在于它所代表的趋势。研究人员描述了自己近十年的专业漏洞利用开发和二十年的安全从业经历。这是他第一次在漏洞利用开发过程中使用 AI/LLM 工具。

他写道:"在我的整个职业生涯中,我从没读过一行 Exim 的源代码。" Quays 2021 年的 21Nails 文档曾让他"震惊",但他从未真正坐下来研究 Exim 的代码。

这个漏洞是在测试 XBOW 自己的产品——一个 AI 驱动的原生代码漏洞检测工具——的早期阶段发现的。这代表着一个范式转变:能够理解 C 代码完整语义的 AI 工具,现在可以在像 Exim 这样成熟、经过充分审计的代码库中发现微妙的多步骤释放后使用漏洞。

影响范围

Exim 是互联网上部署最广泛的邮件传输代理,处理全球邮件流量的重要部分。该漏洞影响:

无需特殊服务器配置这一事实使其成为 Exim 历史上最高级别的漏洞之一。网络上的未认证攻击者可以发送精心构造的 SMTP 会话触发该漏洞,无需任何凭据或预先访问权限。

修复方案

Exim 维护者已发布修复 CVE-2026-45185 的补丁。截至披露日期:

"Dead.Letter":不仅仅是技术报告

XBOW 的研究人员特意将文档写成既是技术文档也是个人叙事。"Dead.Letter" 这个标题既呼应了邮件语境(死信、无法投递的邮件),也带有文化隐喻。研究者将此次发现描述为一个关于"相遇与错过、破碎的心与无声的背叛、曾经以为永恒的爱最终变成完全不同的事物"的故事——这是对人类安全研究员与正在改变他们手艺的 AI 工具之间关系的沉思。

他希望这份报告能找到"两种读者:为技术深度而来的人,以及为故事而来的人。"

总结

CVE-2026-45185 是互联网邮件基础设施中的一个里程碑式漏洞。一个严重的、未认证的 Exim RCE——由一位从未接触过该代码的资深漏洞利用开发者,使用 AI 工具首次发现。它加入了越来越多的证据,表明 AI 驱动的漏洞研究不是未来趋势而是当前现实,而开源基础设施项目需要适应这种新的威胁格局。