Abstract
1. rootkits 经常使用 DKOM ( Direct Kernel Object Manipulation ) 技术隐藏自己
2. 传统工具试图通过线性扫描整个内存区域中的这些隐藏数据结构通过手动指定一些特征。这种方式比较脆弱并依赖于一些数据结构中不重要的特征字段,比较容易被绕过。
3. 本文提出了一种自动查找内核数据结构(例如进程数据结构)中特征值的方法,并通过 fuzzing 的方式证明了这些特征值的修改不会引起内核崩溃。
4. 使用动态分析的方法,采样了目标数据结构,获知了那些域是经常用到的——从而不能被 DKOM ——而使用 fuzzing 证明了剩下哪些域可以被修改而不会引起系统崩溃。
5. 实验中,匹配了现有的所有恶意软件的特征值,并开发了原型 rootkit 使用我们新发现的特征值
操作系统通过创建相关内核对象来登记和审计系统资源, DKOM(Direct Kernel Object Manipulation) Rootkit [3] 则通过修改这些内核对象来隐藏特定资源。 Fu Rootkit 是 DKOM Rootkit 的代表,它通过修改活 动进程列表实现进程隐藏。
Windows 系统枚举进程使用的是活动进程列表 PsActive ProcessList ,它是一个双向链表,每个结点对应一 个进程的 EPROCESS 数据结构,所有结点通过 EPROCESS 结构中的 ActiveProcessLinks 双向指针链在一起。要 隐藏某个进程,只需修改对应 EPROCESS 的 ActiveProcessLinks ,将其从链表中摘除即可。由于系统执行线 程调度使用的是其他的数据结构,因此这样的修改不会影响进程运行。
Introduction
1. 现有的对 DKOM 的查杀对于一些绕过技术比较无奈,比如
[47] 中说的,许多进程特征码可以简单的修改一个进程头部的比特位从而绕过,而该比特位不会影响进程的正常运行。这引发出下面的问题: 给定数据结构中到底哪些域才是必要的?
2. 特征选择机制( feature selection mechanism )使用下面两步决定数据结构中哪些部分对于功能是关键的。
- 监控操作系统执行,标记哪些域经过读写
- 看哪些域修改过之后不会引起崩溃
3. 选定了 robust 域之后,在内核数据结构中收集了许多例子,并使用了动态常量检测技术【 12 】发现了它们的可以用于签名的一些值的限制。
contributions :
1. 提供了大量证据,现有的特征值都是可以轻易绕过的
2. 开发了系统级的 robust feature 选择方法
3. 基于发现的 robust feature ,提出了一种产生 signature 的方法
paper 的结果可以立即应用于许多当前的安全扫描工具上:例如 XXX
Related work
1. 病毒开发者可以修改自己的代码使之不被检测到,而对于定长度的多态病毒的可靠性探测已经被证明是 NP 完全问题。
2. 对于网络蠕虫的探测也存在类似问题,开始的方法是使用简单的特征码来过滤数据包,如 snort 。后来发现检测多态混杂攻击也是一个 NP 完全问题。
3. 总之,特征值方法就是一个 NP 完全问题
尽管看起来没前途了,但还是有一些希望的:在病毒代码中,恶意输入的语法由攻击者定义,但是其语义只要保持不变就好了。而 rootkit 中, kernel 数据结构的语法由 OS 控制,攻击者只能修改包含在结构体中的数据,并且不能搞坏原有功能。
1. 许多方式可以找到隐藏进程:【 18 】跟踪了 CR3 寄存器的值,当虚拟机执行的时候,来区分一个单独的虚拟地址空间。【 34 】通过检查调度器的线程表来查找隐藏进程,但是绕过这种方法的恶意程序也已经出来了【 1 】。【 47 】【 35 】【 43 】描述了修改内核数据结构中的某些位而不会引起异常。
Overview :
一个扫描器的范例
一个隐藏的范例:将 Eprocess 结构体的 size 设成 0x00 ,这样进程可以被调度器调度,但不会出现在任务管理器中
架构:分 3 部分
1. 抽样我们选的数据结构,看哪些 field 最常用,从未用到的部分可以被 attacker 控制
2. 最常访问的域进行 fuzz ,决定哪些可以被修改而不会 crash 的部分,也可以被 attacker 控制
3. 收集正确的例子,基于其建立 signature
1. 抽样和 fuzzing 阶段分别基于 Xen 和 vmware 实现。 xen 能获得监控内存的能力,而 vmware 可以存储状态
2. 修改 xen 代码,将包含监控数据的页 Present 位置 0 ,这样访问时可以实时记录
3. fuzzing 的几种数据类型: 0 ,随机,随机素数,随机聚合类型(如结构体)
4. signature 的生成: 4 种检测: 0 ,常量,按位与( bitwise and ),对齐
讨论:
1. 对 profile 和 fuzzing 的评估: network_listener 31337 端口测试,看是否正常
2. > 对 signature 的生成的评估
实验结果:
最终的准确性对比 psscan2 和 PTFinder ,可以发现隐藏进程
缺点:
如何保证 fuzzing 的覆盖面足够完全
采样阶段也不可能将每个内核数据结构都添加进来
这样还是会有遗漏
另:除了 Eprocess 结构体外,还有别的方法可以隐藏 rootkit 吗?