--误报和执行路径跟踪
虽然对频率高点的检测有助于我们处理系统的不确定因素,但有时会发现测试得到的值有小的差值,一般来说不大于20.
有时这会是一个很严重的问题,因为我们不能确定那些多出来的指令意味着被入侵或只是正常的误差.
为解决这个问题,我们使用了执行路径记录模式.和单一的EPA模式比较,系统增加了对执行路径的记录(包括地址和运行的指令),首先,系统记录下正常情况下的执行路径,以后的每一次运行将产生diff文件(正常系统和现行系统之间的比较).
我们应该使用好的反编译器来分析那些不一样的地方,以此判定他们是否可疑.图6是一个diff文件的例子.
现阶段的diff文件只记录下指令的地址,以后可能将两次测试的不同结果存为PE格式文件,并可用IDA等工具分析.
--检测 ”offset-in-the-code” 的变化
想象有这样一个rootkit,它基本和上面提到的 fu rootkit (见[3]) 一样,但不从PsActiveProcessList中,而是从分派器使用的数据结构中移除进程.我说过那不可能,因为隐藏的进程将分配不到运行时间......
然而,rootkit可以同时更改分派器代码中所使用数据结构的地址(offset),换句话说,就是使其使用不同的链表.但只有分派器使用这个”新的” 链表,而系统其他地方还是使用”旧的”链表...... (见图7).
虽然这种技术不会改变执行指令的个数,我们还是能检测到它,但需要进一步的完善现有的工具.这项功能现在还没有实现,但应该不是很难.
--针对EPA的攻防
我们可以想到一些能骗过EPA类检测工具的方法,先把它们分为两类.
1. 针对特定工具的欺骗
2. 对EPA类技术的通用攻击
首先,我们考虑一下通用的攻击方法和怎样防止这类攻击.接着讨论针对特定工具的攻击以及怎样通过多态来预防.
--对EPA类技术的通用攻击
首先,恶意程序可以勾连包含除错处理程序(debug handler)地址的IDT入口1,这样将暂停记录运行的指令数.当它完成工作时,再恢复 IDT入口1.这样rootkit中所执行的指令数不会被记录.
我们可以使用intel的除错寄存器来防止这类的攻击.可以使用DR0和DR1寄存器对IDT入口1进行写保护.并且为防止rootkit向除错处理程序的开始处写入Jmp指令,还需对其进行读保护.换句话说,我们不想让rootkit发现除错处理程序的地址.但单纯对IDT入口进行读保护是不行的,系统会蓝屏.但有一简单的解决方法,就是增加额外的一层.见图9.
还有一种攻击的方法,在rootkit运行时,其将TF位清零,并在恶意操作完成时恢复TF位,这样检测工具也只能发现运行的指令数和正常的系统有细微差别.
另外,rootkit还能检查TF位, 如发现被跟踪,则不进行恶意操作.这种行为并不会影响rootkit的正常工作,因为只有被检测的进程才被设置TF位.
我们可以防止这种攻击,应该注意到的是运行每一个系统指令前,都会运行我们的除错处理程序.以下是简单的防预方法:
如果除错处理程序发现上一个运行指令是pushf(将EFLAGS寄存器压入堆栈),则运行如下操作.
and [esp], 0xfffffeff;
及清TF位.同样,如果下一条指令是popf(从堆栈载入EFLAGS的值),则运行如下操作.
or [esp],0x100;
及设TF位.这样rootkit就不能更改TF位.
这样的预防几乎可够了,但还不充分.Rootkit仍能以以下方法发现其被跟踪:
setTFbit();
if (checkTFbit()!=1) {
//we are traced!
}
所以我们需要更改反检测部分的操作,使其可以记录TF位有没有被rootkit更改(比如增加一个TFbitset变量).
popf/pushf不是存取EFLAGS寄存器的唯一指令,其它像iret/int等指令也可以[注2],因此还要加入对这些指令的检测.
对EGLAGS寄存器的防护部分还没有被实现.一部分原因是通过对diff文件的分析也可以发现这类攻击.但以后会增加相应代码.
--对特定工具的攻击
如果攻击者了解关于特定检测工具的一切,他会有很多种欺骗的手段.比如,可以更改保存指令数的那个变量.
不过这类攻击具有很强的针对性,如果有很多不同(或非单一版本)的EPA类工具,这样的攻击将不会有效.
当然,我们还是希望可以阻止这类攻击,强大的多态代码生成器可能是唯一的方法.当管理员安装检测工具是,会产生一个独特的内核驱动和测试程序.
多态代码生成器部分还没有被实现.
--相关工作
像文章开头所述,笔者还没有发现任何对rootkit的检测方法,不是基于存储扫描的.
EPA技术并不被OS所局限,笔者在linux下也实现了一相关工具,参5中有对其的详述以及简单的代码实现.
References
[1] Greg Hoglund, et al, ROOTKIT home, telnet://rootkit.com,
[2] palmers, Sub proc_root Quando Sumus, Phrack Magazine, issue 58, 2001.
[3] fuzen_op, fu rootkit, telnet://rootkit.com,
[4] Holy Father, Hacker Defender Home, http://rootkit.host.sk,
[5] Jan Rutkowski, Execution path analysis, Phrack Magazine, issue 59, 2002.
[6] IA-32 Intel Architecture Software Developer’s Manual, vol1-3.
注1: 作者相信这三个链表包含了系统中所有的线程.但还需进一步研究.
注2: 参6上列举了所有和EFLAGS寄存器交互的指令.
上一页 [1] [2]