OpenSMTPD中的一个权限提升和远程代码执行漏洞技术细节 - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com

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

ang010ela 漏洞 2020-03-20 09:40:00
收藏

导语:​CVE-2020-8794 OpenSMTPD漏洞可以引发root权限提升和远程代码执行。

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

漏洞简介

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

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

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

漏洞利用

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

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

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

Figure 1. Vulnerable code inside mta_io function: If the final line of a reply is in an incorrect format, all the remaining content is also appended to the replybuf since p points to a location after the null byte图 1. mta_io函数中有漏洞的代码

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

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

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

Figure 2. Lines injected into the mail envelope, where the command is an arbitrary one that the attacker wants to execute

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

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

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

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

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

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

Figure 3. Lines injected to envelope for older versions

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

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

Figure 4. The mta_io function patch closes the out-of-bounds read by checking if the length of the string is at least 4 before collecting the message

图 4. mta_io函数补丁

本文翻译自:https://blog.trendmicro.com/trendlabs-security-intelligence/opensmtpd-vulnerability-cve-2020-8794-can-lead-to-root-privilege-escalation-and-remote-code-execution/如若转载,请注明原文地址:
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论