qmail 邮件服务器中的远程可利用漏洞

Qualys 的安全研究人员 节目 机会 操作 qmail邮件服务器中的漏洞, 已知 早在 2005 年(CVE-2005-1513),但仍然没有修补,因为 qmail 的作者认为创建一个可用于攻击默认配置系统的有效漏洞是不现实的。 Qualys 能够准备一个漏洞来反驳这一假设,并允许人们通过发送专门设计的消息来在服务器上启动远程代码执行。

该问题是由 stralloc_readyplus() 函数中的整数溢出引起的,在处理非常大的消息时可能会发生这种情况。 运行需要具有64GB以上虚拟内存的4位系统。 2005 年最初分析该漏洞时,Daniel J. Bernstein 认为,代码中分配数组的大小始终在 32 位值以内的假设是基于没有人为每个进程提供 GB 内存的事实。 在过去的 15 年里,服务器上的 64 位系统已经取代了 32 位系统,提供的内存量和网络带宽也急剧增加。

qmail 软件包维护者考虑了 Bernstein 的注释,并在启动 qmail-smtpd 进程时限制了可用内存(例如,在 Debian 10 中,限制设置为 7MB)。 但Qualys的工程师发现这还不够,除了qmail-smtpd之外,还可以对qmail-local进程进行远程攻击,而qmail-local进程在所有测试的软件包中仍然不受限制。 作为证明,我们准备了一个漏洞原型,适合在默认配置下使用 qmail 攻击 Debian 软件包。
为了在攻击期间组织远程代码执行,服务器需要 4GB 可用磁盘空间和 8GB RAM。
该漏洞允许您以系统中任何用户的权限运行任何 shell 命令,除了 root 和在“/home”目录中没有自己的子目录的系统用户(qmail-local 进程以权限启动)进行交付的本地用户)。

攻击进行
通过发送非常大的邮件消息,包括几个标题行,大小约为 4GB 和 576MB。 在尝试向本地用户传递消息时,在 qmail-local 中处理此类字符串会导致整数溢出。 整数溢出会导致复制数据时缓冲区溢出以及使用 libc 代码覆盖内存页的可能性。 通过操纵传输数据的布局,还可以重写“open()”函数的地址,将其替换为“system()”函数的地址。

接下来,在qmail-local中调用qmesearch()的过程中,通过open()函数打开了“.qmail-extension”文件,从而导致该函数的实际执行
系统(“.qmail-扩展名”)。 但由于文件的“扩展名”部分是根据接收者的地址生成的(例如“localuser-extension@localdomain”),因此攻击者可以通过指定用户“localuser-;command”来安排要发送的命令运行;@localdomain”作为消息的收件人。

在代码分析过程中,在附加的 qmail-verify 补丁中还发现了两个漏洞,该补丁是 Debian 软件包的一部分。 第一个漏洞(CVE-2020-3811)允许您绕过电子邮件地址验证,第二个(CVE-2020-3812)导致本地信息泄露。 特别是,第一个漏洞允许您绕过对漏洞利用中使用的地址正确性的验证来发送命令(该验证不适用于没有域的地址,例如“localuser-;command;”)。 第二个漏洞可用于通过直接调用本地处理程序来检查系统上文件和目录的存在,包括那些只能由 root 访问的文件和目录(qmail-verify 以 root 权限运行)。

为了解决这个问题,Bernstein 建议运行 qmail 进程时对可用内存进行总限制(“softlimit -m12345678”),在这种情况下问题就会被阻止。 作为另一种保护方法,还提到通过“control/databytes”文件限制处理邮件的最大大小(默认情况下,它不是使用默认设置创建的,qmail 仍然容易受到攻击)。 此外,“control/databytes”不能防止系统用户的本地攻击,因为该限制仅被 qmail-smtpd 考虑。

该问题影响包 网络邮件,包含在 Debian 存储库中。 已为此软件包准备了一组补丁,消除了 2005 年以来的旧漏洞(通过向 alloc() 函数代码添加硬内存限制)和 qmail-verify 中的新问题。 分别地 准备好的 qmail-verify 补丁的更新版本。 开发商 分支机构 不是qmail 他们准备了自己的补丁来阻止旧问题,并开始努力消除代码中所有可能的整数溢出。

来源: opennet.ru

添加评论