OpenSMTPD 中的一个权限提升和远程代码执行漏洞技术细节
admin
2021-01-24 21:14:55
0

CVE-2020-8794是OpenSMTPD中的一个权限提升和远程代码执行漏洞。该漏洞源于一个越界读,攻击者利用该漏洞可以在有漏洞的系统中执行任意代码。

漏洞简介

2020年2月24日,Qualys研究人员发现了该漏洞,影响OpenSMTPD6.6.4之前的所有版本。作为OpenBSD项目的一部分,OpenSMTPD可以帮助邮件通信来完成邮件信息提取和交付,实现了SMTP协议。

这是2月份发现的第三个OpenSMTPD漏洞,其他两个漏洞分别是CVE-2020-7247和CVE-2020-8793。CVE-2020-7247是一个远程代码执行漏洞,攻击者可以通过专门伪造的SMTPsession来以root权限执行任意命令。攻击者利用CVE-2020-8793漏洞可以使本地用户读取任意系统文件。

CVE-2020-8794来源于OpenSMTPDv5.7.1(2015年12月发布的OpenBSD),攻击者利用该漏洞可以以任意的非root用户运行命令。2018年5月,OpenSMTPD使用新的消息语法后该漏洞的影响进一步扩大,使得攻击者可以以root权限执行命令。

漏洞利用

漏洞位于mta_io函数的mta_session.c中,mta_io函数负责分析来自SMTP服务器的多个回复。当回复的最后一行不满足3位数字/空格/文本的标准格式的话,就会引发越界错误。

如果这种情况发生的话,程序用来读取字符的指针会最终指向‘’后的一个位置。最终,程序会错误地读取,并加入以下行到缓存中。

如果响应消息出现错误,内容就会保存到描述邮件行为的信封中。因为新行字符会加入到其他行中,因此攻击者可以修改内部文件,并修改OpenSMTPD的行为。

OpenSMTPD 中的一个权限提升和远程代码执行漏洞技术细节

图1.mta_io函数中有漏洞的代码

如果回复的最后一行格式不正确,所有其余内容都会加入到replybuf中,p指向空字节后的位置

该漏洞是位于客户端部分的代码而非服务器端,因为客户端只监听localhost,所以要利用漏洞,还需要做一些工作。利用该漏洞有2种方法:客户端和服务器端。

客户端利用更加简单。如果客户端机器发送一个邮件消息给被黑的邮件服务器,服务器就可以用伪造的响应消息回复,伪造的响应消息会引发越界读错误。然后注入以下行到邮件信封中:

OpenSMTPD 中的一个权限提升和远程代码执行漏洞技术细节

图2.注入到邮件信封中的行,命令是攻击者想要执行的任意命令

因为消息类型被修改为MDA(MessageDeliveryAgent),当消息投递失败时,OpenSMTPD就会执行命令,使得攻击者可以在有漏洞的机器上运行任意代码。

服务器端漏洞利用更加复杂。具体包括发送一个消息给SMTP服务器,服务器会反弹给被黑的邮件服务器。被黑的邮件服务器会响应一个临时错误,然后强制服务器奔溃。

服务器重启后,就会执行保存在信息中的命令。

因为服务器可以主动丢弃反弹内容,而开始的时候永久错误是无法发送的,因为并不能执行代码。此外,服务器必须在代码执行之前重启,因为即使消息类型在信封中已经修改了,仍然保存在与老的类型对应的队列中。重设后,所有的内容都会重新检查,消息也会在执行后移动到MDA队列中。

早于2018年5月的老版本也有一个类似的利用方法,主要的不同在于响应邮件消息,格式稍有不同,而且只允许非root用户。

OpenSMTPD 中的一个权限提升和远程代码执行漏洞技术细节

图3.注入老版本信封的代码

漏洞已经在v6.6.4版本中修复了,补丁是加入了一个检查机制来检查最后消息的长度是否大于4。因此,指针p就不能指向空字符外的内容,导致不再读取越界内容。

OpenSMTPD 中的一个权限提升和远程代码执行漏洞技术细节

图4.mta_io函数补丁

相关内容