上个月,Qualys的安全研究人员在多种基于Unix的系统上发现名为“Stack Clash”的漏洞,该漏洞能让攻击者在UNIX系统上获得root权限,并接管这台受到攻击的计算机。目前安全研究人员发现了这个缺陷,正与各种供应商合作,尽早发布修复程序。
据 Qualys 的研究人员介绍,这个问题影响了许多 UNIX 系统,如 Linux,OpenBSD,NetBSD,FreeBSD 和Solaris。研究人员仅测试了 i386 和 amd64 平台上的 Stack Clash,并且不排除其他供应商和平台也可能受到影响。
其实,这个问题早在 2005 年就曾首次发现过,随后Linux引进了应对的保护机制(Stack guard page)。而现在的漏洞核心也依旧是自 2005 年以来已经知道问题,在经历补丁修复后该问题在2010年再次发现并得到修补,如今第三次发现存在漏洞。
什么是Stack Clash漏洞这个问题主要涉及内存栈的概念:栈内存是应用程序在计算机 RAM 中执行代码的内存区域。而随着应用程序越变越大,内存区域也“水涨船高”。
现在问题在于,当一个栈内存增长得太多,以至于过于接近另一个程序的栈内存时,可能会出现混淆的问题。应用程序的栈内存接触到堆内存时,如果攻击者可以注入某些数据然后操作堆内存中的存储信息,他就可以覆盖部分堆栈并劫持应用程序中的执行流,相应地,甚至还可以接触到更重要的数据结构。
从 2005 到 2010 年,再到 2017 年,研究人员发现已经可以通过堆栈中泄露的代码来欺骗操作系统。目前,Qualys 研究员已经公开了漏洞的概念验证【见原文报告】,可以看到低层代码能从恶意应用程序的内存堆栈跳转到具有 root访 问权限的合法应用程序的内存区域。
在现在的研究中我们发现stack clash漏洞仍然可以被攻击者利用,尽管现在有 Stack guard page 保护机制,我们仍然发现了多种利用方法,如下所示:
1.使栈内存与其他内存区域冲突:分配内存直至与其他区域冲突
2.绕过 stack guard-page机制:将栈指针从栈中移到其他内存区域中,但不要触及stack guard-page
3.摧毁栈内存或其他内存区域:用另一个内存区域覆盖原来的栈内存数据,或反过来覆盖
漏洞影响该研究团队称他们可以为制作出14个exploit及相应的概念验证攻击程序,针对Linux,OpenBSD,NetBSD,FreeBSD及Solaris系统。
而涉及的软件程序则包括 Debian,Ubuntu 和 CentOS 上的 Sudo ;Debian上的 Exim ;Solaris 11上的 rsh 等等。Red Hat Enterprise Linux 5至7,Enterprise MRG 2.5 和 Virtualization 以及 RHEL Atomic Host 也受Stack Clash 影响。
后续研究当然目前要实现这种攻击的话,攻击者需要本地访问,远程的攻击方法还不清楚。现在利用这个漏洞的攻击方法是经典的权限提升(EoP)漏洞。由于EoP问题需要攻击者已侵入到用户系统中才能进行,一般情况下并不会认为是一个危险的问题。
Qualys 表示,他们会汇总各种操作系统上的 Stack Clash 的 PoC 漏洞,之后会一并公开。所有 PoC 都要求攻击者具有本地访问权限,但研究人员不排除攻击者可以从远程位置(例如通过 HTTP 请求或 JavaScript 代码)利用 Stack Clash 的某些情况。
系统供应商跟进Red Hat 已经为 Stack Clash 漏洞发布了安全修补程序,Qualys 表示其他供应商也会很快跟进提供相应的补丁。
如果用户无法更新,操作系统所有者可以将本地用户和远程服务的 RLIMIT_STACK 和 RLIMIT_AS 设置为低一些的数值。当然,这样设置会导致应用程序的内存变小,因此无意中会对机器的性能产生一定的影响。