Answers:
堆栈冲突是基于相当古老的技术的一种利用。进程使用的内存分为两个区域- 堆栈和堆。人们通常将堆栈想象为向下增长,而堆则想象为向上增长。当任何一个增长到足以与另一个发生冲突时会发生什么?更一般而言,当堆栈增长到足以占用无关内存空间时会发生什么?最初的漏洞已有12年的历史,Linux内核开发人员使用保护页面临时修复了该漏洞。但是,尽管有防护页面,但Qualys的研究人员还是设法利用了这一点。
Stack Clash漏洞已逐渐引起广泛的关注,首先是在2005年,安全研究员GaëlDelalleau的发现,然后是五年后,研究员Rafal Wojtczuk 发布了Linux漏洞。Linux开发人员 引入了旨在防止堆栈冲突的保护措施,但是今天的研究表明,攻击者绕过该措施相对容易。
Qualys开发的主要概念验证攻击利用索引为CVE-2017-1000364的漏洞。Qualys研究人员还开发了使用Stack Clash来利用单独漏洞的攻击,包括CVE-2017-1000365和CVE-2017-1000367。例如,当与Qualys在Sudo中修复的最近修复的漏洞CVE-2017-1000367结合使用时,本地用户可以利用Sudo在更广泛的OS上获取完整的root特权。到目前为止,Qualys无法使漏洞利用程序远程执行代码。他们调查的唯一远程应用程序是Exim邮件服务器,巧合的是,该服务器无法被利用。Qualys表示,不能排除存在这种远程代码执行漏洞的可能性。Qualys表示将在以后发布概念验证漏洞,
Qualys的详细技术咨询和grsecurity的技术分析提供了更多信息。
由于Linux不会将进程堆栈和堆页面分开,因此有可能将堆栈页面溢出到相邻的堆页面中。这意味着足够深的堆栈(例如,通过递归调用)可能最终会使用堆中的内存。然后,可以写入该堆页面的程序(例如X客户端)可以操纵其中一个调用的返回地址,以跳转到其选择的位置。这意味着客户端可以使服务器运行其选择的代码-任意代码执行-可以利用该代码获取root特权。
上面的描述适用于各种类Unix内核。
虽然Ars Technica的确实注意到在Qualys公司报告中提到的临时解决方法(“设置 硬RLIMIT STACK和RLIMIT_AS 的 本地用户 和 远程服务 到低价值”),它应该指出的是,这并不一定防范此漏洞。当前唯一安全的出路是升级。根据grsecurity分析:
应该清楚的是,仅内核解决该问题的尝试必然总是不完整的,因为真正的问题在于缺乏堆栈探测。由于替代的实际解决方案取决于重建所有用户,因此在可预见的将来,这可能是唯一可行的解决方案。
2010年的漏洞利用了X服务器,其中一个使用了sudo,下一个可能是许多用户级程序中的任何一个,这些程序有时在提升的特权下运行。
Qualys尚未发布任何有关漏洞利用的概念证明代码(他们计划在以后发布)。
与CVE-2017-1000364相关的多个Ubuntu安全公告:
另请注意,CVE跟踪器列出了多个发行版/内核组合作为待解决的修补程序。
通常,最简单的解决方法是尽快将系统更新为最新的内核软件包。
USN的相关内核版本(使用标记为for i in {24..35}; curl -s https://www.ubuntu.com/usn/usn-33$i-1/ | pup 'dl:nth-last-of-type(1)'
):
自2017年5月30日起,USN-3304-1涵盖了上述sudo bug :