15年后:qmail中的远程代码执行(CVE-2005-1513)

2020-05-20 03:55:57

日期:Qualys Security Consulting<;[email protected]>;收件人:[email protected]主题:qmail中的远程代码执行(cve-2005-1513年)Qualys安全顾问15年后:qmail中的远程代码执行(CVE-2005-1513)==Contents==SummaryAnalysisExploitationqmail-verify-cve-2020-3811-CVE-2020-3812MitigationsAcknowledgmentsPatches==Summary==TLDR:2005年,在qmail中发现了三个漏洞,但一直被修复,因为它们被认为。我们最近重新发现了这些漏洞,并能够在默认installation.--In中远程攻击其中一个漏洞。2005年5月,Georgi Guninski发布了64位Qmail Fun&34;,qmail中的三个漏洞:http://www.guninski.com/where_do_you_want_billg_to_go_today_4.htmlSurprisingly,我们在最近的一次qmail审核中重新发现了这些漏洞;它们从未被修复,因为正如qmail';作者Daniel J.Bernstein(在https://cr.yp.to/qmail/guarantee.html):";中)所说的那样,这一主张被拒绝。没有人会给每个qmail-smtpd进程分配GB的内存,所以qmail';认为分配的数组长度适合32位的假设是没有问题的。事实上,每个qmail-smtpd进程的内存消耗在默认情况下都是严格限制的(根据qmail-smtpd的启动脚本);例如,在Debian 10(最新的稳定版本)上,它被限制在大约7MB。不幸的是,我们发现这些漏洞也。作为概念证明,我们开发了一个可靠的、本地的、远程攻击Debian的qmail包的默认配置。此概念验证需要4 GB的磁盘空间和8 GB的内存,并允许攻击者以任何用户的身份执行任意外壳命令,除了root用户(以及一些不拥有其主目录的系统用户)。我们将在不久的将来发布我们的概念验证漏洞。关于我们的新发现,丹尼尔·J·伯恩斯坦发表了以下声明:https://cr.yp.to/qmail/guarantee.html多年来一直提到Qmail的假设,即分配的数组长度适合32位。我在softlimit-m12345678下运行每个qmail服务,并且我建议在其他安装下也这样做。最后,我们还在qmail-verify(例如,debian的qmail包中包含的第三方qmail补丁)中发现了两个小漏洞:cve-2020-3811(绕过邮件地址验证)和cve-2020-3812(本地信息disclosure).==Analysis==We决定利用Georgi Guninski的漏洞)。事实上,在stralloc_readyplus;中有四个潜在的整数溢出;GEN_ALLOC_readyplus()宏(它生成stralloc_readyplus()函数)中有四个潜在的整数溢出,分别位于第21行(n+=x-&>len)、第23行(x->;a=base+n+.)和第24行(x->;a*sizeof(type)):--17#定义GEN_ALLOC_READYPLUS(ta,TYPE,FIELD,LEN,a,i,n,x,base,ta_rplus)\18 int ta_rplus(x,n)寄存器ta*x;寄存器UNSIGNED INT n;\19{REGISTER UNSIGNED INT I;\20 IF(x->字段){\21 i=x->;a;n+=x->;len;\22 IF(n&>i){\23 x->;a=base+n+(n&>3);\24 IF(alloc_re(&;x->字段,i*sizeof(Type),x。\25 x->;a=i;return 0;}\26 return 1;}\27 x->;len=0;\28 return!!(x->;field=(type*)alloc((x->;a=n)*sizeof(Type);}--and,理论上,alloc()函数本身(由alloc_re()函数调用)中有一个整数溢出,行18:--14/*@.l@.*@[email protected]*alloc(N)15 unsign int n;16{17 char*x;18 n=对齐+n-(n&;(对齐-1));/*XXX:可能溢出*/.。20 x=malloc(N);.。22返回x;23}--In实践中,第21行(在GEN_ALLOC_READYPLUS()中)和第18行(在alloc()中)的整数溢出很难触发;而第24行(在GEN_ALLOC_READYPLUS()中)的整数溢出是无关紧要的