暗藏深层代码之中的十大“长寿”漏洞

安全 漏洞
早期版本的Unix和DOS系统诞生,直到21世纪的今天,这两大操作系统的后裔仍然常伴我们左右。其中一些系统的漏洞暗藏深层代码之中已经数年甚至数十年了。

2021年,某现代计算底层系统中曝出一个漏洞。攻击者可迫使该系统执行任意代码。令人惊讶的是,存在漏洞的代码竟然已有54年历史,而且没有补丁可用,估计以后都不会有补丁推出了。

[[409266]]

不过,这个系统是图灵奖获得者马文·明斯基(Marvin Minsky)在1967年实现的通用图灵机,尽管对计算机科学领域具有重大理论意义,却从未实际构建到实用计算机中。没有补丁似乎无伤大雅。但在明斯基设计出这款图灵机之后十年左右的时间里,早期版本的Unix和DOS系统诞生,直到21世纪的今天,这两大操作系统的后裔仍然常伴我们左右。其中一些系统的漏洞暗藏深层代码之中已经数年甚至数十年了。

下面我们举出十个近年来发现的重大漏洞。

漏洞清单

  • 日产汽车远程信息控制模块基带漏洞
  • sudo堆溢出漏洞Baron Samedit
  • Linux GRUB2 Secure Boot漏洞
  • LioWiki本地文件包含漏洞
  • Domain Time II旁观者(man-on-the-side)攻击
  • Linux SCSI 子系统漏洞
  • Windows DNS服务器远程代码执行漏洞SIGRed
  • PuTTY 堆溢出漏洞
  • win32k.sys漏洞
  • PrintDemon本地提权漏洞

日产汽车远程通信控制模块基带漏洞

年龄:7岁

引入日期:2010

修复日期:2017

早在2011年,安全研究员Ralf-Philipp Weinmann在手机基带处理器中发现了一个最近才引入的隐秘漏洞:黑客可设置虚假手机信号塔,诱骗手机连接此虚假信号塔,然后劫持其网络连接。手机制造商的修复动作不可谓不快,但修复后抛诸脑后的速度也一样快。

这就留下了一个问题:手机并不是使用此类芯片的唯一一种设备。安全公司Eclypsium首席网络安全研究员Jesse Michael表示:“基本上,同样的蜂窝基带芯片组也用在日产聆风和其他多款车型上。”多位研究人员在从废车场淘来的车上实验过后也发现了同样的漏洞。

Michael称:“这个漏洞在多个不同市场领域已经众所周知很久了,比我们在汽车市场中发现它时早了近七年时间。由于广泛存在于多个市场领域且供应链复杂,此前没人意识到汽车也会遭遇和手机一样的漏洞利用。”行业孤岛问题确实值得重视了。

sudo堆溢出漏洞Baron Samedit

年龄:9岁6个月

引入日期:2011年7月

修复日期:2021年1月

sudo命令是Unix管理员工具箱中的重要工具,可以赋予调用者超级用户权限。但“能力越大,责任越大”,很有必要给这条命令设置使用门槛,防止用户在系统中横冲直撞。例如,可以在shell模式下带-c参数调用sudo命令,该参数后跟随的一系列shell命令就能以超级用户权限执行了。但是,此模式容易遭到缓冲区溢出攻击,插入这些指令中的特殊字符会诱使系统将代码写入所分配的内存缓冲区之外,可能使攻击者获得root权限。

一般情况下,sudo会在执行前识别此类特殊字符,从而抵御此类攻击。然而,2011年,sudo中意外插入了一个漏洞,令缓冲区溢出攻击成为可能,而这个漏洞就在众人眼皮子底下潜伏了十年之久。该漏洞并不存在于sudo命令本身,而是藏身在辅助命令sudoedit中。sudoedit命令允许用户以超级用户权限访问和编辑文件,而不授予编辑器程序本身完整的超级用户权限。正如2021年1月Qualys博客中指出的,该漏洞可导致严重的提权攻击,修复迫在眉睫。几乎所有Unix系操作系统均受影响,包括Linux、Solaris和macOS。

Linux GRUB2 Secure Boot漏洞

年龄:10岁

引入日期:2010

修复日期:2020年7月

作为BIOS的替代品引入的时候,UEFI被认为具有相当先进的安全功能,能够对抗操作系统引导加载软件级攻击。个中关键在于UEFI采用了名为Secure Boot的机制,用签名加密证书联锁链验证每个引导加载程序的合法性。UEFI的根证书由微软签名,Linux发行版将其具备经验证证书的引导加载程序放在链的下游。

然而,广为使用的Linux引导加载程序GRUB2不仅具备UEFI就绪证书,还包含了缓冲区溢出漏洞,可被插入其配置文件中的恶意代码利用。(尽管GRUB2自身经过签名,但其可被本地管理员编辑的配置文件并没有经过签名。)安全公司Eclypsium发现了这一漏洞。虽然攻击者需要一定程度的目标机器本地控制权来实施攻击,但只要成功实施了,他们就能确保在每次启动时都能继续控制这台电脑,很难将他们从系统中驱逐出去。

LioWiki本地文件包含漏洞

年龄:11岁11个月

引入日期:2008年11月

修复日期:2020年10月

LionWiki是款采用PHP语言编写的极简维基引擎。不同于很多流行维基引擎,比如维基百科底层引擎,LionWiki不使用数据库,而是完全基于文件的。由于其目标就是简洁,完全基于文件是LionWiki的优势,但也导致了重大漏洞的引入。

从本质上讲,用户通过相应页面URL中的文件和路径名访问特定LionWiki实例下的各种文件。这意味着,借助正确构造的URL,攻击者可以遍历托管此LionWiki实例的服务器上的文件系统。可以通过配置URL过滤来阻止文件系统遍历尝试,但正如信息安全研究所网络靶场工程师June Werner发现的,绕过URL过滤简直太容易了。

Werner指出,尽管多次尝试修复,但该漏洞仍持续存在了很久。“2009年7月就首次推出了一些缓解措施,然后2012年1月又铺开了更广泛的缓解措施。但尽管实施了缓解措施,代码还是无法抵御同类型的攻击。直到2020年10月随着绕过这些缓解措施的方法一起被重新发现,该漏洞在代码中又留存了八年。”

正式上报之后,漏洞被开发人员修复了。

Domain Time II旁观者(man-on-the-side)攻击

年龄:14岁

引入日期:2007

修复日期:2021年4月

如果同一网络上的两台计算机不能就时间问题达成一致,所造成的后果可能从单纯的烦人直到无法收拾的灾难。时间同步问题是计算领域的老生常谈了,目前最成熟的企业解决方案是Domain Time II,这是一款广泛部署在Windows、Linux和Solaris上的闭源应用。

Domain Time II从诞生之日起就存在一个非常严重的漏洞。时不时地,或者在用户可以设置的条件下,这个软件会向其供应商Greyware Automation Products运营的更新服务器发送UDP查询请求。如果服务器回复URL,Domain Time II会以管理员权限运行程序,下载并安装来自此URL的更新。

问题出在哪儿呢?如果恶意黑客抢在Greyware的更新服务器之前成功回复查询请求,那他/她就能发送自己构造的回复,促使Domain Time II下载攻击者想要安装的任何恶意软件。在真正的中间人攻击中,攻击者会双向拦截;相较之下,Domain Time II攻击是所谓的旁观者(man-on-the-side)攻击:攻击者不拦截发往其目标的回复,而是抢在合法回复之前发送他/她自己构造的回复。在实践中,这意味着攻击者需要已掌控目标本地网络上的一台计算机;但此类攻击代表着攻击者可以升级入侵,染指目标主机本地网络上其他更有价值、更安全的机器。发现此漏洞的安全公司Grimm指出,至少早在2007年,这个漏洞就出现在该软件的各个版本中了。

Linux SCSI 子系统漏洞

年龄:15岁

引入日期:2006

修复日期:2021年3月

如果你是怀旧派,那你可能还记得SCSI:上世纪80年代的数据传输标准。或许你的第一块硬盘就是用它接入你的IBM PC或经典Mac机的。直至今日,SCSI在某些环境中仍然在用。而一贯追求灵活性和通用性的Linux更是还为有需求的系统保留着一套扩展SCSI子系统。可以通过自动模块加载功能使用这些模块,其中操作系统在需要时获取并安装所需系统代码。这在你想给Linux机器挂载SCSI硬盘,但又不想费事寻找各种必要支持代码的时候真是非常有用,但也同样有助于攻击者利用代码中的漏洞。

2021年3月,网络安全咨询机构Grimm发布了在Linux SCSI代码中发现的一系列漏洞。其中一个缓冲区溢出漏洞可使普通用户获得root权限,其他漏洞则可造成信息从内核泄漏到用户空间,而且全部漏洞都可用于获取机密信息,或者对受影响机器展开DoS攻击。Grimm称这些漏洞可追溯至2006年,并冷冷指出,“这些漏洞是编程实践缺乏安全考虑的表现,而此类编程实践在此代码开发当时十分普遍。”

Windows DNS服务器远程代码执行漏洞SIGRed

年龄:17岁

引入日期:2003

修复日期:2020

DNS是被低估的互联网骨干系统,计算机通过给定URL解析出关联IP地址就靠DNS了。DNS是层级化的,域名解析请求在DNS金字塔各层间上下流转,找寻能回答“这台计算机在哪儿?”这个问题的DNS服务器。因此,所有主流操作系统都内置了DNS。

2020年,微软披露了其DNS中一个潜伏了17年的关键漏洞,尽管没有证据表明该漏洞曾经被非法利用过。发现此漏洞的Check Point研究人员将之名为为SIGRed。这是个Windows DNS服务器缓冲区溢出漏洞,可被藏身DNS数据包签名中的漏洞利用代码触发。恶意名称服务器可向域名解析请求响应此类数据包,绕过大多数安全防护措施,获取微软DNS服务器的远程访问权限。该攻击还可以蠕虫化,也就是说,可以在没有用户干预的情况下自动传播。

PuTTY 堆溢出漏洞

年龄:20岁9个月

引入日期:1999年1月

修复日期:2019年10月

PuTTY是一款开源免费工具套件,包含串行控制台、终端模拟器和各种网络文件传输应用,还内置了SSH和各类其他加密方案。PuTTY最初是为了将Unix管理员惯用的系统自带工具集引入Windows和经典Mac OS而开发的,但现已扩大了范围,连Unix系统上也在用了。虽然PuTTY旨在保护网络连接,但其核心代码却被曝出暗藏漏洞。该漏洞是另一种形式的缓冲区溢出问题(此处是堆溢出),可由过短SSH密钥触发,造成PuTTY运行崩溃,甚至远程代码执行。

欧盟EU-FOSSA项目发起的漏洞赏金计划中,该漏洞被提交到HackerOne,为提交者赚取了3645美元的赏金,以及来自PuTTY团队的感谢。PuTTT团队指出,早在1999年,此漏洞就出现在PuTTY源代码的早期版本中了。

win32k.sys漏洞

年龄:23岁

引入日期:1996

修复日期:2019

2019年,微软Windows Win32 API曝出两大漏洞。第一个漏洞发现于4月,是一个释放后使用(User-After-Free)漏洞,程序可利用操作系统编码错误访问本应受到保护的系统内存。安全研究人员在发现恶意黑客尝试利用此漏洞获取计算机控制权的过程中检测到了此漏洞。另一个漏洞是藏身于操作系统窗口切换功能中的提权漏洞,在12月份被发现。与前者类似,这个漏洞也是在主动攻击过程中检测到的,当时这些攻击为制造内存泄漏而模拟击键。

两个漏洞都可追溯至Windows操作系统的早期阶段。卡巴斯基高级安全研究员Boris Larin解释道:“问题源于WIN32K随Windows NT 4.0首次亮相的时候,当时多数Win32图形引擎都从用户级转移到内核以提高性能。”虽然这两个具体漏洞已被修复,但微软多年前做出的图形引擎内移决策却影响甚广,而且影响可能还会持续下去。这些年来,Windows中发现的内核安全漏洞恐怕半数以上都得归咎于WIN32K组件。

PrintDemon本地提权漏洞

年龄:24岁

引入日期:1996

修复日期:2020年5月

打印机可谓IT行业常见痛点,因为种类实在是太多了,而且并非由计算机和操作系统供应商制造,用户却期望能够插上就能开始打印。尤其是微软,在其早期阶段就努力想让用户能够相对容易地安装打印机驱动。但近期发现的PrintDemon漏洞表明,微软可能在上世纪90年代走得太远了一点,直到今天还在为此付出代价。

漏洞的核心在于三个事实:非管理员用户可以向Windows机器添加打印机;底层实现机制允许打印到文件而非物理打印设备;Windows上关键打印服务以SYSTEM权限运行。这意味着,只要做对了,就可以构造“打印机”驱动,在文件系统(甚至是特权目录)的任何位置创建文件(甚至是可执行文件)。这么多年来,黑客设计了大量漏洞利用程序利用这些设计缺陷,大名鼎鼎的震网(Stuxnet)也是其中之一。但2020年发现的PrintDemon尤为特殊,而且成型于微软多年来的修复不过是补丁而非完全重构整个打印子系统。正如Winsider描述的,“只需对文件系统做一点点改动,你就可以实现不属于任何进程的文件复制/写入行为,尤其是在重启后。借助一个精心设计的端口名称,你就可以让Spooler进程帮你在磁盘上任意位置放置[可移植可执行]文件。”怎么听都不像是个好消息……

追溯漏洞的年纪有意义吗

这种“长寿”漏洞列表总能让人猛然意识到,原来自己的电脑可能因为克林顿时期的打印机子系统漏洞而被黑。但了解这些已经没有必要立即修复的“老”漏洞是有现实意义的。Grimm首席漏洞研究员Adam Nichols称:“独立研究工作中,我们在找到漏洞时会做的一件事就是尝试确定这个漏洞到底已经存在多久了。遗憾的是,这并非行业标准。不过,其他研究人员有时候也会这么做。多走这一步来查清人们面临被黑风险多久了不算是分内的工作,但我觉得这是研究工作的重要组成部分。”

Sandy Clark的研究显示,普遍的代码重用现象造成了巨大的已知漏洞攻击面,长期使用的代码库中潜伏的漏洞可能最终会演变为漏洞利用程序。这与传统的软件工程教条背道而驰,传统的软件工程教条认为,大多数漏洞会在代码库使用早期遭遇现实问题和攻击时即得到修复。但事实上,用Clark论文标题的话来说,“熟悉会滋生蔑视”。

 

责任编辑:赵宁宁 来源: 数世咨询
相关推荐

2010-12-16 17:38:29

UPS

2021-04-12 09:42:25

漏洞网络安全网络攻击

2019-06-03 08:22:18

2010-11-11 13:44:46

2023-10-08 15:54:12

2020-07-09 11:36:56

漏洞黑客漏洞赏金

2011-12-30 11:16:55

2020-10-30 12:35:55

漏洞黑客网络安全

2022-12-09 15:09:00

2010-06-07 20:48:17

2010-06-07 21:13:38

2024-01-09 16:19:14

2024-01-12 08:00:00

2016-02-15 14:32:38

2024-08-16 21:38:43

Python代码编程

2022-12-29 07:40:58

2020-05-13 15:00:25

漏洞网络安全网络攻击

2018-01-10 08:39:32

2009-03-27 23:25:17

2010-01-26 15:32:43

Scala用法错误
点赞
收藏

51CTO技术栈公众号