3.2 恢复系统内核
防御机制可能会尝试在全球范围内清除Rootkit—换句话说,自动恢复受损系统的完整性。方法是通过一种算法来检查各种内部调度表和元数据结构的内容,以及这些结构指向的函数。使用这种方法,首先要恢复或验证系统服务描述符表(System Service Descriptor Table,SSDT)—几个内核的标准系统调用函数开头的代码,然后检查和恢复所有怀疑被修改的内核数据结构。你现在肯定明白了,这种恢复策略充满了危险,而且根本不能保证有效。
查找到或计算指向系统调用函数及其底层回调的指针的“干净”值,是恢复正确的系统调用调度所必需的,这并不是一项容易的任务。因为没有找到干净的系统文件副本,所以可以从这些文件中恢复被修改的内核代码段。
但是,即使我们假设这些任务是可能的,我们找到的每个内核修改实际上也并不都是恶意的。许多独立的合法程序,比如前面讨论的antirootkit检查程序,以及更传统的防火墙、抗病毒和HIPS等,都安装了自己的良性钩子来拦截内核控制流。我们可能很难区分杀毒软件的钩子和Rootkit的钩子。事实上,它们的控制流修改方法可能是无法区分的。这意味着合法的反病毒程序可能会被误解为非法的并被禁用。数字版权管理(DRM)软件代理也是如此,很难将其与Rootkit区分开来。例如,索尼2005年的DRM代理就被称为“索尼Rootkit”。
检测和清除Rootkit的另一个挑战是确保恢复算法是安全的。由于内核数据结构经常被使用,因此对它们的任何非同步写操作—例如,当修改的数据结构在正确重写之前被读—都可能导致内核崩溃。
此外,Rootkit可能试图在任何时候恢复它的钩子,这增加了更多潜在的不稳定性。
考虑到所有的因素,将自动恢复内核完整性作为一种针对已知威胁的反制措施,比作为获取关于内核的可靠信息的一般解决方案效果更好。
仅仅检测和恢复一次内核函数的调度链是不够的。Rootkit可能会继续检查内核代码的任何修改和它所依赖的拦截数据,并试图持续地恢复它们。事实上,一些Rootkit还会监控它们的文件和注册表项,并在它们被防御性软件删除后恢复它们。防御者被迫玩1984年的经典编程游戏《核心战争》(Core Wars)的现代版本,在这个游戏中,程序为控制计算机内存而战斗。
借用另一部经典电影《战争游戏》(War Games)中的一句话:“唯一的制胜之道就是不玩。”认识到这一点,操作系统行业开发了操作系统完整性解决方案,从启动开始,预先阻止Rootkit攻击者。因此,防御者不再需要监管无数的指针表和操作系统代码片段,如处理程序函数入口。
他们的努力促使攻击者研究劫持引导过程的方法,这与防御-攻击共同进化的本质是一致的。他们提出了Bootkit,这是我们后续章节中的主要关注点。
如果你的Windows黑客之旅是在Windows XP SP1之后开始的,当我们沉浸在不必要的操作系统调试怀旧中时,你可能更愿意跳到下一章。但是,如果老年人的故事对你有一定的吸引力,那么继续读下去吧。