Windows rootkits of 2005, part two(翻译)

Windows rootkits of 2005, part two(翻译)

英文原文地址: http://www.symantec.com/connect/articles/windows-rootkits-2005-part-two
      上一篇文章中,我们谈到了当前的rootkit开发技术。本文更深入一点,将焦点集中在rootkit技术的最前沿。在第三篇,也就是本系列的最后一篇中,将重点论述rootkit侦测的各种方法及安全方面的专业的应对措施。

        本文讲述的方法是在Black Hat 2005大会上介绍的Shadow Walker的rootkit原型试验时提出的。这些方法使得攻击者通过控制扫描器在硬件层次所读到的内存来隐藏已知或未知的恶意代码。虽然我们的焦点是在rootkits之上,但该技术潜在的影响颇令人担忧。因为它可以被应用到从蠕虫到间谍软件的所有形式的恶意代码上。

1.1 可持久的rootkit与基于内存的rootkit
        一般来说,rootkits分两种:可持久的rootkit和基于内存的rootkits。其最根本的区别就是被感染的机器重新启动后,两者的持久性。可持久的rootkit在系统重启后还继续存在,而基于内存的rootkit则不行。要想在重启后还继续存在,必须满足两个条件。第一,必须有些手段可以在被感染的系统上长久的保存他们的代码,比如存在硬盘上。第二,必须在系统启动序列中放置一个钩子,以便他们能够从硬盘被加载到内存中开始运行。
        基于内存的rootkit不会去保存他们的代码到硬盘,也不会去hook启动过程。他们仅仅存在与内存中,或许就是通过一次软件exploit就被隐蔽的安装进内存了,因此这类rootkit相对于其可持久的兄弟隐蔽性更好,其优势不容置疑。虽然它在系统重启后就不存在了,看起来似乎没用。但是,要知道服务器可是经常连续几天,几周甚至几个月都保持在线。实际上,基于内存的rootkit失去影响的可能跟难以预料的攻击者的需要大致是平衡的。

1.2 隐藏rootkit
        Rootkit的编写者为了在系统中隐藏他们的rootkit的存在,开发了一些巧妙的技术,从各种hook技巧到直接更改内核对象(Direct kernel object manipulation, DKOM)都有。然而即使像FU这样成熟的内核rootkits也有其固有的缺陷[ref 1]。虽然这些Rootkits控制执行路径很有一套,但是基本都没有办法控制其它应用程序看到的内存。因此,这些rootkits如果想要不被发现,必须注意两个问题。第一,必须能隐藏他们本身的执行代码;第二,必须能够隐藏其对操作系统组件的内存所作的修改(比如hooks)。没有这些能力的话,在原始的内存签名侦测扫描面前,即使最成熟的公开的内核rootkits也只是sitting-ducks,要知道20年前的防病毒软件就已经开始使用这种扫描技术了。可持久的rootkis则需要另外处理隐藏其在长期存储媒介上的代码以及其系统启动序列中的钩子。本文后面只会谈到前两个问题。实际上,我们的讨论仅限于基于内存的rootkit。
        隐藏代码或者其对内存的修改是病毒作者们很早以前就遇到的问题。为了与文件系统签名扫描作斗争,病毒作者们发展了多态变种技术。这种技术使得保持相同功能的一块代码在表面上看起来不一样。可以用英语中的同义词(拼写不同,然而意思相近)来类比一下。多态的病毒用不同的代码(同义词)替换指令(原来的词语)来执行相同的功能。这种变异的病毒表面上看起来有区别,就可以逃过基于简单模式的侦测。
        Rootkit也已经在整合多态技术上取得了一些成效。只是这种公开的rootkit还非常少。虽然多态技术对于把rootkit的代码部分同扫描的签名区分开有些效果,但还不理想。因为这对于隐藏rootkit对其他系统组件的二进制代码做的修改没有帮助。也就是说,劫持系统组件留下了内存完整性校验的弱点。因此,更好的解决方案不是改变rootkit的代码,而是改变其他系统组件"看到"它的途径。接下来会看到现在架构是如何准许虚拟内存管理器颠覆的,这样一来非多态的的内核模式rootkit就能够控制操作系统和其他进程所读到的内存。第2节回顾一下虚拟内存的基本架构和支持的操作。第3节讲述Shadow Walker的rootkit原型试验是如何扰乱虚拟内存子系统达到其在安全扫描器前隐藏执行代码的。在第4节,也就是最后一节中将讨论这种技术对于安全专家和黑客的潜在意义。

2.虚拟内存概念
        现代的大多数系统架构都区分虚拟内存和物理内存。通常,系统更多的是在处理虚拟内存。在一个安装了256MB内存的32位系统的机器上,虽然我们只有256MB物理内存,但是虚拟内存有4GB。简而言之,物理内存就是被安装的内存条的数量,而虚拟内存则是由处理器的地址总线的宽度定义。因此有了32位处理器我们就能寻址最大2^32字节,即4GB的虚拟内存。而在64位机器上,则可以寻址2^64字节,超过16EB。
        虚拟内存有两种不同的实现方案,即分段和分页,X86架构两种都支持。本文关注的是Shadow Walker要破坏的分页部分。分页最基本的思想就是虚拟内存地址空间和物理内存地址空间被分成固定大小的块。

        虚拟内存块被称为页面(page),页面被映射到物理内存块上,物理内存块叫帧(frame)。页表和页目录记录了关联到它们对应的frame所需要的映射信息以及保护信息和状态信息。关键就是当分页被启用后,每个内存访问必须要查找以确定其映射到的物理帧以及该帧当前是否在内存中。这就会产生实质的性能开销,尤其是当系统架构是像Intel Pentium那样的基于2级页表方案的时候更是如此。
        通过对虚拟内存和物理内存加以区分,硬件和操作系统能够让进程相信它有比实际的物理内存多得多的内存。分页对于应用程序来说是不可见的,从应用程序的角度看,它有它自己私有的4GB虚拟内存。而不必去关心实际的物理内存是多少,也不用管虚拟地址是如何映射到物理内存的。由于虚拟地址空间可以比物理地址空间大很多,进程就有可能要求获取的内存超过可用物理内存。这种情况下,操作系统就需要临时交换物理内存中的一部分数据到磁盘以腾出空间来满足当前的内存需求。这是通过复制部分帧到交换文件并标记这些帧对应的页表项(PTE)的状态为缺页来实现的。当这些页面再次被访问时,因为它们当前不在物理内存中,所以会产生一个缺页错误。操作系统的缺页错误处理会发出I/O请求把被请求的页面从交换文件中加载进来。如果这时候没有物理内存可用,则在把请求的页面加载进来之前必须先交换另一些页面到磁盘文件。

    在一个2级分页方案中,内存访问的动作分如下几步:
    1.在页目录中查找确定是否该地址所在的页表当前在物理内存中。
    2.如果不在,发一个I/O请求将该页表从磁盘的交换文件中加载进来。
    3.查找页表确定是否请求的页面当前在物理内存中。
    4.如果不在,发一个I/O请求将该页从磁盘交换文件中加载进来。
    5.在页面根据偏移值查找需要的字节数。

    图1说明了x86架构的地址转换处理过程。从上面的步骤中可以看到,在最坏的情况下,一个简单的内存访问可能需要3次内存访问和2次磁盘I/O。于是硬件设计者开发了Translation Lookaside Buffer(TLB)来帮助解决这个问题。TLB是用于处理频繁的虚拟地址到物理地址映射的高速缓存。当有内存访问发生,在查找页目录和页表前,会首先从TLB中查找虚拟地址到物理地址的转换信息。如果找到了,称之为“命中(hit)”,否则称之为“未命中(miss)”。因为TLB查找起来比执行页表访问要快很多,所以内存访问通过TLB来避免前面提到的性能开销。

    
 

                                                图1  x86虚拟地址到物理地址的转换

3.Shoadow Walker如何工作
    当前的Shadow Walker原型试验由2个驱动构成:一个修改过的FU rootkit驱动和一个用于隐藏FU rootkit的内存钩子驱动。因为Shadow Walker只不过是打算验证原型试验,所以没有尝试去隐藏这个内存钩子驱动或者隐藏缺页处理器以及对应的中断钩子。另外还有一些实现上的限制,比如PAE(Physical Address Extension)或多处理器支持。Shadow Walker不是一个功能完整的rootkit,以它当前的实现来看,从多个角度都可以察觉到它。这里只是展望一下rootkit技术的未来。如果技术娴熟的攻击者写出了真正强大的的基于Shadow Walker技术的rootkit,蠕虫或间谍软件,能够被给定存在的恶意代码侦测技术的状态,那真是太可怕了。攻击者可以用这些方法隐藏已知或未知的恶意病毒不被基于签名的扫描器发现,不被启发式的探测器发现,也不被完整性检查器发现。下一段将讲述Shadow Walker使用的虚拟内存扰乱技术的实现细节。
    众所周知,内存访问有三种基本类型(读,写和执行),然而很少有人知道32位的x86处理器实际上只支持两种类型:读/执行和写/执行。这就意味着所有的内存都是可执行的,没有其他直接支持的标记它的手段来指示是否该内存可执行。x86的这种诡异的行为导致很难把堆栈设置成不可执行,于是便成了缓存区溢出侵入系统的祸害[ref 2]。这种架构的另一个怪异行为则不甘示弱,一个软件安全开发组发现通过附加的软件支持在Unix下可以实现不可执行的内存[ref 3],那就是著名的PaX。Shadow Walker利用了一些PaX团队的研究来隐藏在Windows系统中执行的代码。
    现在的rootkit如果想要不被察觉,还需要解决两个额外的问题:
    1.必须能够隐藏他们自己的执行代码躲过内存签名扫描。
    2.必须能够隐藏修改过的操作系统组件的内存(hook即是典型)来躲过启发式侦测(比如使用VICE工具)和完整性校验。
    为了达到这些目的,rootkit必须能够控制安全扫描器之类的其它应用程序执行原始内存读取操作所返回的数据。很明显,如果rootkit发现了对其可执行代码段的读取访问,那就可以认为有扫描器在找它了。

3.2 Shadow Walker扰乱虚拟内存
    Shadow Walker要扰乱虚拟内存涉及三个问题。首先它必须能够区分和过滤对某块内存(例如它本身的执行代码所在的内存或者一些已经被扰乱的操作系统API的内存)的执行、读和写访问。其次,当察觉到这种读取访问时,必须能够欺骗它。最后,要确保被感染的系统的性能不会受影响。
    第一个问题可以通过将要隐藏的页面的PTE标记为“不存在”,然后hook缺页处理器(page fault handler)来解决。这样一来Shadow Walker就能捕获对这些页面的访问并且在随后的缺页处理器中过滤掉。在缺页处理器中,检查保存的指令指针和缺页地址,如果两者相同,那么这次内存访问就是执行操作。否则就是读/写操作。值得一提的是Shadow Walker需要区分是由于内存hook导致的缺页还是OS需要服务导致的普通缺页。通过确保所有的隐藏页面在非分页内存中可以解决这个问题。由于Shadow Walker现在就是设计成的隐藏驱动的页面,这总是在非分页池,所以这个不是问题。
    第二个问题有些棘手,而且跟第三个问题不降低性能有关系。一旦缺页处理器被调用,我们发现是对隐藏页面的读访问,我们就修改PTE以及更改物理帧地址不工作。因此,我们可以保证执行访问被翻译到我们扰乱了的帧,而读写访问被翻译到了干净的帧。然而,要记住TLB才是内存访问路径的开始,内存访问会将相应的转换加载到TLB。Pentium实际上使用了分离的TLB架构,Shadow Walker use this fact to devious advantage. 分离的TLB架构意味着有两个TLB,一个记录执行访问的翻译结果(ITLB),另一个纪录读写访问的翻译结果(DTLB)。一般来说,两个TLB是同步的,保持相同的映射信息。不过,要使分离的TLB不保持同步,使其记录不同的虚拟内存到物理内存的映射还是有可能的。

 
  
                                          图2: TLB Desynchronization 


    一旦加载,大多数内存访问会通过TLB来解决,不会产生缺页错误。当然,第一次执行和数据访问该页面时、TLB缓存线路清除时、在上下文切换时以及显式TLB刷新时还是会缺页的。这几个缺页错误不或导致任何问题,仅仅是要求缺页处理器重新同步TLB。到最后就给我们带来了第3个问题:维持系统性能。

Shadow Walker导致的缺页率的小的增长相对于现代TLB极高的命中率来说,不会有太明显的影响!

4.Conclusion

        Shadow Walker provides an example of an ironic, however, common yin/yang theme in computer security. It takes an originally defensive solution to a security problem (with the PaX-based buffer overflow protection) and inverts it into an offensive exploitation technique. The recent controversy surrounding Sony's usage of rootkit technology to provide Digital Rights Management is yet another compelling example. The lines between protection and exploitation between the "hacker" and the "security professional" are not as clearly defined as many would like to believe. 

In the first article of the series, we showed that security applications can't trust the integrity of operating system APIs. Now, we show that the violation of trust runs much deeper. Shadow Walker bids user mode malware scanners a final goodbye and places rootkit detection strictly within the kernel realm. In the third and final article of this series we will discuss rootkit detection and threat mitigation. 

5. References
[ref 1] Fuzen, FU Rootkit.  http://www.rootkit.com/project.php?id=12 
[ref 2] Hardware support has subsequently been added for non-executable memory in 64-bit systems as well as some AMD Sempron and Intel Pentium 4 processors. Windows also provides limited software support in the form of Data Execution Prevention (DEP) as of Windows XP Service Pack 2 and Windows 2003 Server. 
[ref 3] PaX.  http://pax.grsecurity.net/docs/pax.txt 
[ref 4] Butler, James, "VICE - Catch the hookers!" Black Hat, Las Vegas, July, 2004.  www.blackhat.com/presentations/bh-usa-04/bh-us-04-butler/ bh-us-04-butler.pdf 

5.1 Further reading
Rutkowska, Joanna. "Concepts For The Stealth Windows Rootkit", Sept 2003  http://www.invisiblethings.org/papers/chameleon_concepts.pdf 

Russinovich, Mark and Solomon, David. Windows Internals, Fourth Edition. 

6. About the authors
James Butler is the CTO of Komoku, which specializes in high assurance, host integrity monitoring and management. Before that, Mr. Butler was the Director of Engineering at HBGary, Inc. focusing on rootkits and other subversive technologies. He is the co-author and a teacher of "Aspects of Offensive Rootkit Technologies" and co-author of the newly released bestseller "Rootkits: Subverting the Windows Kernel." 

Sherri Sparks is a PhD student at the University of Central Florida. Currently, her research interests include offensive/defensive malicious code technologies and related issues in digital forensic applications.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值