McAfee首席反病毒专家Rachit Mathur研究过一种被认为是 TDL3 rootkit 变种的rootkit,这个rootkit就是用来隐藏臭名昭Google Redirect 病毒的程序。但是这个rootkit的行为有些怪异。Mathur在接受ZDNet的采访时解释说:
一些反rootkit工具无法通过hooks直接识别出这个rootkit,另外,它还不允许外部debug工具(Windbg等)进行中断调试,这一点很让人郁闷。
Mathur还补充说:
反rootkit工具之所以没有发现可疑的hooks,是因为这些工具所检测的内存本身就是伪造的。
很明显,rootkit开发人员使用这种技术的目的就是为了防止被反病毒工具发现并被系统管理者注意到。
伪造内存成为可能?
听到这个结论,我的第一反应是,“内存是怎么被伪造出来的呢?”
Mathur拥有计算机科学硕士学位,专攻逆向工程,程序转换以及恶意软件变种研究。Mathur在McAfee Labs的博客上也有一篇专门针对这个rootkit技术的文章:Memory Forging Attempt by a Rookit. 我尝试着阅读了一下,但是指针,寄存器设置以及debug工具等弄的我有些头大。于是在采访中,我请求McAfee公关部的Joris Evers先生和H3O Communications的Ian Bain先生帮我联系了Mathur先生。下面就是我对Mathur先生的采访内容。
记者: 我承认,我还是没明白内存是如何伪造出来的。您能不能比较浅显的解释一下这个技术。
Mathur: 我可以先介绍一些背景知识。 Rootkits 一般会修改当前操作系统在内存中的某个特定区域,从而劫持操作系统的控制功能。这么做会迫使操作系统对扫描软件(反病毒软件或反rootkit软件)反馈错误的结果。
比如rootkit会隐藏文件,注册表项目,进程等,防止检测软件扫描这些内容。所以,一般来说rootkit都会修改内存。而反rootkit工具则是通过检测内存区域,发现此类可疑修改,并通知用户。
我们今天所说的这个rootkit也同样修改内存的存储单元(安装hook)阻止检测软件的磁盘访问动作。我们假设这个存储单元的位置是X,而这个X是大多数rootkit都会使用的位置,我们所说的这个rootkit也毫无例外的使用了这个位置。
那么对于反rootkit软件来说,由于大部分rootkit都会修改X位置的内容,因此反rootkit软件就会检查X位置所存储的内容,看其是否被修改过。
记者: 抱歉我打断一下,这个rootkit就是在这里做文章的吗?
Mathur : 恩,我们今天说的这个rootkit,会将原先X位置的内容搬到Y位置存储起来。当反rootkit软件扫描X位置时,它会将Y位置的内容提供给检测软件。这样检测软件就不会发现X位置有任何异常了。
记者: 您刚才提到了 X位置和 Y位置。我想到一个问题:既然检测软件会扫描X位置,为什么rootkit还要将自身信息放在X位置呢?
Mathur: 恶意软件之所以必须修改 X位置的数据,是因为操作系统使用X位置来调用处理磁盘访问的特定代码。这样,在磁盘访问过程中,恶意软件就可以决定是否允许程序读取磁盘上某个文件或向其中植入恶意代码。这就是所谓的调度表hook或IRP hook。
记者: 您是说,恶意软件或rootkit有足够的智能,能够分辨哪些程序试图访问X位置?这是怎么实现的呢?
Mathur: 恶意软件一定需要判断读取请求来自何处。只有当恶意软件确定操作系统需要读取X位置的代码来进行磁盘访问时,恶意软件才会放心的把恶意代码传送给操作系统。而其它程序,包括反病毒软件需要读取X位置的内容时,恶意软件会将Y位置的原始内容反馈给程序。
当发生 X位置的读取请求时,由于CPU硬件中断设置,会触发一个例外事件。而由于恶意软件同时修改了操作系统变量KiDebugRoutine, 恶意代码会在该例外触发时被启动,取得控制权。
这时恶意软件已经能获知指令试图读取的内存地址了。恶意软件会将此地址与预先设置的地址列表进行比对,看是否允许继续读取该内存地址的内容。指令中需要读取的地址可以分成两类,一类是地址中包含操作系统数据,另一类是地址包含了恶意代码。
如果指令读取的地址与地址列表上的相符,那么恶意代码不会提供伪造内存。相关的代码可以从博客中的图片“KiDebugRoutine Handler: Snippet 3″中看到。
接下来的代码是对比一个特定的地址。如果相匹配,那么该异常被设定为不需要伪造内存,读取命令会继续执行,读取“真实”的内存内容:
cmp eax, dword_41D810 ; compare EIP with pre-defined locations that are allowed to read correct memory
jz loc_403BC5 ; set as handled and return
记者: 这个rootkit有名字吗?
Mathur: McAfee 将其定为 TDSS.e!rootkit.
记者: 我很好奇,您到底是如何认定这个rootkit伪造了内存呢?
Mathur: 最初在分析恶意软件样本时,常用的扫描工具都没有报告出可疑的rootkit活动。但是随着深入研究和debug分析,我们确定其中确实有一个hook,并且它就位于那些扫描工具最常扫描的地址段内。但是这些扫描工具确实什么也没发现。这非常奇怪,所以引起了我的注意。
索性这个rootkit设计的并不完美,随着研究的深入,我还是发现了它的蛛丝马迹。我发现通过两种不同方式检查该地址段,所获得的反馈内容是不同的。这是个意料之外的线索。
因为我们知道自己在找什么,所以很快我们就发现到硬件中断(DR0 寄存器)设置到X位置,而恶意软件试图保护自身。剩下的工作就是通过标准的逆向工程来还原出rootkit的工作细节。
记者: 发现这个rootkit的机制后,行业会有什么动作吗?另外,既然这个rootkit已经流传出去了,会不会有更多的恶意软件开发者利用它或者将其进一步改进?
Mathur: 这个问题问得好。目前该技术确实已经被一些恶意软件利用了,而我们也必然会看到反rootkit工具会增加对这种技术的检测功能,比如在访问内存特定区域前,监视硬件中断的活动,或者检查KiDebugRoutine hook等。
另外,由于使用这个技术需要设置硬件中断点,因此它可能不会广泛的被各种恶意软件利用。因为一旦知道了它的工作原理,想要检测或避免被这种技术感染的方法并不难。
但是,为反rootkit工具增加针对这种技术的检测功能需要一段时间。因此,在未来一小段时间内,我们可能会发现有部分恶意软件利用了这种技术,而且有可能会出现这种技术的变种。
估计最开始是那些设计精巧的恶意软件首先采用该技术,然后是设计较好的恶意软件采用该技术。虽然这都是预想,但是还是比较靠谱的。
记者: 作为普通用户,我们该如何防范采用这种技术的恶意软件呢?
Mathur: 从用户的角度说,一般的防范措施,比如浏览安全的网站,保持软件和系统及时更新等,会有一定的帮助。当然,所安装的安全软件需要进行更新,才可能支持对这种新技术的检测和防范。因此用户需要随时关注新版安全软件的推出,并及时更新病毒库。
记者: 在您的博客中,您提到这个技术已经存在一段时间了,就是之前一直没有被利用。是不是还有某些新技术也是处于这种状态呢?
Mathur:这种技术以前就被人提起过,但是一直没有恶意软件使用该技术的报告出现,直到这次。不幸的是,我还没有注意到有类似的技术被雪藏。我们认为恶意软件制作者们会继续改进技术,实现更好的隐藏机制。
这也是我们将要在今年的Virus Bulletin Conference 上讨论的话题之一。
总结
病毒和反病毒的斗争一直在持续,未来也是一样。我们感谢像Mathur这样的专家能够认真的研究和分析新的病毒技术,为我们的反病毒斗争带来希望。