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