1. 架构背景:SMTP BDAT 动词与分块传输
在 SMTP 协议的扩展中,BDAT 命令(RFC 3030)用于替代传统的 DATA 命令。其核心逻辑是允许客户端以"分块(Chunking)"的方式传输二进制数据,而无需进行 Base64 编码或寻找特定的结束标识符(如 .)。这种机制旨在提高大数据量传输的效率,减少服务器端的解析开销。
2. 漏洞成因:非法序列导致的释放后使用 (UAF)
该漏洞存在于 Exim 的 receive_msg 函数中。当服务器处理特殊的 BDAT 命令序列时,解析逻辑未能正确维护内存指针的状态:
- •内存重分配机制:Exim 在处理 SMTP 头部和数据时使用动态分配的缓冲区。当接收到 BDAT 请求时,系统会分配一段内存用于存储数据块。
- •非预期状态转换:攻击者通过发送一系列精心构造的 BDAT 命令,中间夹杂着会导致缓冲区重新分配或重置的操作。
- •释放后使用 (Use-After-Free):在某些特定条件下,Exim 可能会释放掉当前正在使用的缓冲区,但全局变量中仍然保留着指向该无效内存地址的指针(Dangling Pointer)。
- •堆溢出与控制流劫持:后续的 BDAT 数据写入操作会直接作用于已释放的堆内存块。通过堆喷射(Heap Spraying)等技术,攻击者可以覆盖关键的函数指针(如 base64_decode 相关的回调),从而实现远程代码执行(RCE)。
3. 技术特征与风险评估
- •攻击向量:网络远程触发(远程未经身份验证)。
- •利用难度:由于现代 Linux 发行版普遍启用了 ASLR(地址空间布局随机化)和 NX(堆栈不可执行),纯粹的漏洞利用需要精准的内存布局控制,但在未打补丁的系统中依然具有极高风险。
- •受影响范围:Exim 4.88 及 4.89 版本(当启用 chunking 支持时,这是默认选项)。
4. 修复与防御建议
- 1.版本升级:立即升级至Exim 4.90或更高版本。
- 2.临时规避:若无法立即升级,可以通过在配置文件中设置 chunking_advertise_hosts =(将其设置为空)来禁用 BDAT 命令的支持,迫使客户端回退到传统的 DATA 模式。
- 3.安全加固:利用 AppArmor 或 SELinux 限制 Exim 进程的系统调用权限。
参考文献
- •Meh Chang (Devcore). (2017).Exim Remote Code Execution (CVE-2017-16943). [Online]. Available at: https://devco.re/blog/2017/12/11/Exim-RCE-advisory-CVE-2017-16943-en/
- •Vadey, G. (Mitre). (2017).CVE-2017-16943 Detail. [Online]. Available at: https://nvd.nist.gov/vuln/detail/CVE-2017-16943
- •Exim Maintainers. (2017).Exim Security Release: CVE-2017-16943 and CVE-2017-16944. [Online]. Available at: https://lists.exim.org/lurker/message/20171125.034842.d1d7514f.en.html
- •RFC 3030. (2000).SMTP Service Extensions for Transmission of Large and Binary MIME Messages. [Online]. Available at: https://tools.ietf.org/html/rfc3030
技术深度解析:微软 Authenticator 移除"密码"管理器的底层逻辑