预计阅读本页时间:-
9.7.5 rootkit
rootkit是一个程序或一些程序和文件的集合,它试图隐藏其自身的存在,即使被感染主机的拥有者已经决定对其进行定位和删除。在通常情况下,rootkit包含一些同样具有隐藏性的恶意软件。rootkit可以用我们目前讨论过的任一方法进行安装,包括病毒、蠕虫和间谍软件,也可以通过其他方法进行安装。我们将稍后讨论其中的一种。
1.rootkit的类型
我们讨论目前可能的五种rootkit。根据“rootkit在哪里隐藏自己”,我们自底向上将rootkit分为如下几类:
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
1)固件rootkit。至少从理论上讲,一个rootkit可以通过更新BIOS来隐藏自己在BIOS中。只要主机被引导启动或者一个BIOS函数被调用,这种rootkit就可以获得控制。如果rootkit在每次使用后对自己加密而在每次使用前对自己解密,它就很难被发现。这种rootkit在现实环境下还没有发现。
2)管理程序rootkit。这是一种尤其卑鄙的rootkit,它可以在一个由自己控制的虚拟机中运行整个操作系统和所有应用程序。第一个概念证明“蓝药丸”(blue pill,取自电影《黑客帝国》)在2006年被波兰黑客Joanna Rutkowska提出。这种rootkit通常更改引导顺序以便它能在主机启动时在裸机下执行管理程序,这个管理程序会在一个虚拟机中启动操作系统和所有应用程序。与前一种方法类似,这种方法的优点在于没有任何东西隐藏在操作系统、库或者程序中,因此检查这些地方的rootkit检测程序就显得不足。
3)内核rootkit。目前最常见的rootkit感染操作系统并作为驱动程序或可引导内核模块隐藏于其中。这种rootkit可以轻松地将一个大而复杂且频繁变化的驱动程序替换为一个新的驱动程序,这个新的驱动程序既包含原驱动程序又包含rootkit。
4)库rootkit。另一个rootkit可以隐藏的地方是系统库,如Linux中的libc。这种位置给恶意软件提供了机会去检查系统调用的参数和返回值,并根据自身隐藏的需要更改这些参数和返回值。
5)应用程序rootkit。另一个隐藏rootkit的地方是在大的应用程序中,尤其是那些在运行时会创建很多新文件的应用程序中(如用户分布图、图像预览等)。这些新文件是隐藏rootkit的好地方,没有人会怀疑其存在。
这五种rootkit可以隐藏的位置由图9-30所示。

2.rootkit检测
当硬件、操作系统、库和应用程序不能被信任时,rootkit很难被检测到。例如,一种查找rootkit的明显方法是列举磁盘上的所有文件,但是读取目录的系统调用、调用系统调用的库函数以及列表程序都有潜在的恶意性,并有可能忽略掉与rootkit相关的文件。然而情况也绝非无可救药。
检测一个引导自己的管理程序并在其控制下的虚拟机中运行操作系统和应用程序的rootkit虽然难以处理但也并非不可能。这要求从性能和功能上仔细检查虚拟机和实际机器的细微差异。Garfinkel等(2007)已经提出了一些这样的差异(如下所述),Carpenter等(2007)也讨论了这个话题。
一类检测方法依赖于一个事实:管理程序自身使用物理资源而失去这些资源可以被检测到。例如,管理程序需要使用一些TLB入口,在这些稀缺资源的使用上与虚拟机产生竞争。rootkit检测程序可以向TLB施加压力,观察其性能并与此前在裸机上测量的性能数据进行比较。
另一类检测方法与计时相关,尤其与虚拟输入输出设备的计时相关。假设在实际机器上读出一些PCI设备寄存器需要100个时钟周期,这个时间很容易重现。在一个虚拟环境下,这个寄存器的值来自于内存,它的读取时间依赖于它到底在CPU一级缓存、二级缓存还是实际RAM中。检测程序可以轻易地强迫其在这些状态之间来回移动并测量实际读取时间的变化。注意我们关注的是读取时间的变化而非实际的读取时间。
另一个可以被探查的部分是执行特权指令的时间,尤其是对那些在实际硬件上只需要几个时钟周期而在被模拟时需要几百或几千个时钟周期的特权指令。例如,如果读出某个被保护的CPU寄存器在实际硬件环境下需要1纳秒,那么10亿次软中断和模拟绝不可能在1秒内完成。当然,管理程序可以欺骗报告模拟时间而不报告所有涉及时间的系统调用的实际时间,检测程序可以通过连接提供精确时间基准的远程主机或网站来绕过时间模拟。因为检测程序只需要测量时间间隔(例如,执行10亿次被保护寄存器的读操作需要多少时间),本地时钟和远程时钟的偏移没有关系。
如果没有管理程序被塞入硬件和操作系统之间,那么rootkit可能被隐藏在操作系统中。很难通过引导计算机来检测其存在,因为操作系统是不可信的。例如,rootkit可能安装大量的文件,这些文件的文件名都由“$$$_”起始,当读取代表用户程序的目录时,不报告这些文件的存在。
在这样的环境下检测rootkit的一个方法是从一个可信的外部介质(如CD-ROM/DVD或USB棒)引导计算机,然后磁盘可以被一个反rootkit程序扫描,这时不用担心rootkit会干扰这个扫描。另一个选择是对操作系统中的每个文件做密码散列,这些散列值可以与一个列表中的散列值进行比较,这个列表在系统安装的时候生成并存储于系统外的一个不可被篡改的位置。如果没有预先建立这些散列值,也可以由安装CD-ROM或DVD即时计算得到,或由被比较文件自身进行计算得到。
库和应用程序中的rootkit更难隐藏,当操作系统从一个外部介质装入并可信时,这些库和应用程序的散列值也可以与已知为正确且存储与CD-ROM上的散列值进行比较。
到目前为止,我们讨论的都是被动rootkit,它们不会干扰检测软件。还存在一些主动rootkit,它们查找并破坏检测软件或至少将检测软件更改为永远报告“NO ROOTKITS FOUND!”(没有发现rootkit),这些rootkit要求更复杂的检测方法。幸运的是,到目前为止在现实环境下主动rootkit还没有出现。
在发现rootkit后应该做什么这个问题上存在两种观点。一种观点认为系统管理员应该像处理癌症的外科医生那样非常小心地切除它。另一种观点认为尝试移除rootkit太过危险,可能还有其他碎片隐藏在其他地方,在这一观点下,惟一的解决办法是回复到上一个已知干净的完整备份。如果没有可用的备份,就要求从原始CD-ROM/DVD进行新的安装。
3.Sony rootKit
在2005年,Sony BMG公司发行了一些包含rootkit的音乐CD。这被Mark Russinovich(Windows管理工具网站www.sysinternals.com的共同创始人之一)发现,那时他正在开发一个rootkit检测工具并惊奇地在自己的系统中找到了一个rootkit。他在自己的blog中写下了这件事,这很快传遍了各大媒体和互联网。一些科技论文与此相关(Arnab和Hutchison,2006;Bishop和Frincke,2006;Felten和Halderman,2006;Halderman和Felten,2006;Levine et al.,2006)。这件事导致的轰动直到好几年以后才逐渐停止。以下我们对此事件做简单的描述。
当用户插入CD到一个Windows系统计算机的驱动器中时,Windows查找一个名为autorun.inf的文件,其中包含了一系列要执行的动作,通常包括打开一些CD上的程序(如安装向导)。正常情况下,音乐CD没有这些文件因为即便它们存在也会被单机CD播放器忽略。显然Sony的某个天才认为他可以聪明地通过放置一个autorun.inf文件在一些CD上来防止音乐盗版。当这些CD插入计算机时,就会立即安静地安装一个12MB大小的rootkit。然后一个许可协议被显示,其中没有提到任何关于软件被安装的信息。在显示许可的同时,Sony的软件检查是否有200种已知的复制软件中的任一种正在运行,如果有的话就命令用户停止这些复制软件。如果用户同意许可协议并关闭了所有的复制软件,音乐将可以播放,否则音乐就不能播放。即使用户拒绝协议,rootkit仍然被安装。
这个rootkit的工作方法如下。它向Windows内核插入一系列文件名由“$sys$”起始的文件。这些文件之一是一个过滤器,这个过滤器截取所有向CD-ROM驱动器的系统调用并禁止除Sony的音乐播放器之外的所有程序读取CD。这一动作使得复制CD到硬盘(这是合法的)变得不可能。另一个过滤器截取所有读取文件、进程和注册表列表的调用,并删除所有由“$sys$”起始的项(即便这些项是由与Sony和音乐都完全无关的程序而来的),目的是为了掩盖rootkit。这一方法对于rootkit设计新手来说非常标准。
在Russinovich发现这一rootkit之前,它已经被广泛地安装,这完全不令人惊讶,因为在超过2000万张CD上包含此rootkit。Dan Kaminsky(2006)研究了其广度并发现全世界超过50万个网络中的计算机已经被感染。
当消息传出时,Sony的第一回应是它有权保护其知识产权。在National Public Radio的一次采访中,Sony BMG的全球数字业务主席Thomas Hesse说:“我认为绝大多数人甚至不知道什么是rootkit,那么他们何必那么在意它?”当这一回应激起了公众怒火时,Sony让步并发行了一个补丁来移除对“$sys$”文件的掩盖,但仍保留rootkit。随着压力的增加,Sony最终在其网站上发布了一个卸载程序,但作为获得卸载程序的条件,用户必须提供一个E-mail地址并同意Sony可以在以后向他们发送宣传材料(这些可以被大多数人过滤掉)。
随着故事的终结,人们发现Sony的卸载程序存在技术缺陷,使得被感染的计算机非常容易遭受互联网上的攻击。人们还发现该rootkit包含了从开源项目而来的代码,这违反了这些开源项目的著作权(这些开源项目的著作权要求对其软件的免费使用也发布源代码)。
除了空前的公众关系灾难之外,Sony也面临着法律危机。德克萨斯州控告Sony违反了其反间谍软件法以及欺诈性贸易惯例法(因为即使许可被拒绝rootkit仍然会被安装)。此后在39个州都提起了公诉。在2006年12月,在Sony同意支付425万美元、同意停止在其未来的CD中放入rootkit并授权每位受害者可以下载一个有限的音乐目录下的三张专辑之后,这些诉讼得以解决。在2007年1月,Sony承认其软件秘密监视用户的收听习惯并将其报告回Sony也违反了美国法律。在与公平贸易委员会(FTC)的协议中,Sony同意支付那些计算机遭到其软件破坏的用户150美元的补偿。
关于Sony的rootkit的故事已经为每一位曾经认为rootkit只是学术上的稀奇事物而与现实世界无关的读者提供了实例。在互联网上搜索“Sony rootkit”会发现大量补充信息。