检测Linux Rootkit入侵威胁
背景信息
Rootkit是一种隐蔽型恶意软件,其核心目的是隐藏自身及其他恶意进程、文件、网络连接的存在,同时为攻击者提供持久的后门访问能力。
“Root”代表Linux系统中的最高权限,“Kit”代表工具包,因此Rootkit本质上是获取系统最高权限后使用的隐藏工具集。
Rootkit的危害
现在Rootkit在早期基于文本模式,检测相对简单等特征的基础上,结合APT(Advanced Persistent Threat,高级持续性威胁)攻击,已经趋于高度定制化与模块化。
Rootkit还具有隐蔽性设计、内核级对抗、变形与多态、检测资源受阻等技术层面的检测挑战,以及检测资源受阻等现实问题,导致Rootkit检测困难重重。
具体危害场景如下:
- 权限维持与持久化
- 植入隐藏账户
- 修改启动脚本和定时任务
- 挂钩系统认证模块绕过登录
- 数据窃取
- 键盘记录获取密码
- 截获网络传输敏感数据
- 读取内存中的敏感信息
- 横向移动
- 作为跳板机攻击内网其他系统
- 窃取内网凭据进行凭证重用攻击
- 资源滥用
- 服务器资源用于加密货币挖矿
- 构建僵尸网络参与DDoS攻击
- 痕迹清除
- 删除日志记录
- 隐藏攻击活动痕迹
检测原理
HSS采用四层检测机制,从不同维度识别Rootkit的存在。
第一层:文件检测
Rootkit会隐藏恶意文件,常规的ls命令看不到这些文件。因此,HSS不依赖ls或readdir等可能被挂钩的接口,而是直接读取文件系统的原始数据结构。
- 遍历目录inode节点,读取目录项的原始数据,然后将将原始文件列表与通过系统接口获取的文件列表进行交叉比对,如果原始数据中存在某个文件,但系统接口未返回,则判定为隐藏文件。
- 对系统关键二进制文件进行完整性校验,计算系统关键命令(ps、ls、netstat等)的哈希值与预存的正常哈希值数据库进行比对,如果哈希值不匹配,说明文件被篡改或替换。
第二层:内核检测
系统调用是用户程序访问内核的唯一通道,Rootkit会修改系统调用表来拦截特定操作。但每个内核版本都有固定的内核符号地址,HSS会预先记录关键系统调用函数的正确地址,实时检测sys_call_table中的函数指针是否被篡改,并比对当前地址与预期地址是否一致。
- Linux Rootkit常以可加载内核模块(Loadable Kernel Module)的形式存在。HSS会获取当前所有已加载内核模块列表,对比模块哈希值与白名单数据库,检测是否存在未授权的隐藏模块,并监控新模块的动态加载行为。
- Rootkit常挂钩kallsyms_lookup_name等符号解析函数来隐藏自身,修改内核导出的符号表。HSS可以监控关键内核函数地址的变化,检测符号地址的异常偏移。
- 在某些高级检测场景中,HSS会通过检测内核代码段是否被注入恶意代码、异常的内核内存页,基于已知Rootkit的内核内存特征进行模式匹配等方式,进行内核内存区域的完整性扫描。
第三层:行为检测
即使Rootkit成功隐藏了自身,其行为仍然会留下痕迹。HSS会对器进程行为、网络行为、文件操作行为以及权限操作行为进行异常检测。
第四层:情报检测
HSS通过已知的Rootkit文件哈希值,特征代码片段、典型行为模式以及网络通信特征来维护一个不断更新的Rootkit特征数据库,当检测到匹配项时,直接触发告警,也可以检测威胁情报关联信息。
处理Rootkit告警
可疑内核模块告警(一般称作Rootkit)的信息如下,列出了内核模块的名称和内核模块Hook的系统函数。Hook这些系统函数主要是为了隐藏自己的恶意程序不被安全软件发现。例如下图中的内核模块Hook了filldir函数,大概率是做了隐藏行为的。

内核Hook是一种技术,用于拦截和修改操作系统内核中的函数调用或行为。
已识别出了内核模块名称
- 登录主机,执行以下命令查看主机上是否有此ko的存在。
find / -name {内核模块名称}.ko
- 若回显中存在内核该模块,则表示是客户自己业务需要的内核模块(恶意的内核模块会隐藏自己让find命令无法找到),此时直接和客户确认即可,可以按照误报来处理。
- 若回显中不存在内核该模块,则进行后续步骤。
- 执行以下命令,找出该内核模块的文件路径,如下图所示。该命令可以找出内核模块的依赖信息,其中包含了ko文件的全路径。
modprobe -D {内核模块名称}

- 如果内核模块做了隐藏动作,那么即使进入到上图示例查到的目录下,使用ls -l命令,也无法找到该ko,此时需要知道ko文件的全路径。
执行以下命令,将内核模块ko文件重命名移动到一个无法加载的位置,然后重启主机,即可让该rootkit无法正确加载。
mv /lib/modules/3.10.0-862.14.1.5.h408.eulerosv2r7.x86_64/kernel/drivers/md/dm-mod.ko /root/dm-mod.ko.bak
- 如果使用上述命令找不到隐藏的ko文件路径,那么可以进入到“/etc/modprobe.d/”目录,新建blacklist.conf文件。
- 执行以下命令,在里面新增内容,然后重启主机,可以阻止对应名称的内核模块加载。
install {内核模块名称} /bin/true


如上图所示,以开源的Reptile rootkit项目为例,将项目涉及的两个ko名称加入到conf后,再执行隐藏操作,就会失败,就是因为内核模块的加载被阻止了。
- 内核模块无法正确加载后,隐藏自身就会失效,可以执行以下命令,查看之前被隐藏的恶意文件。
find / -name *{内核模块名称}*
- 解除rootkit的隐藏动作后,再次对主机进行全盘的病毒查杀。
未识别出了内核模块名称
有些Rootkit写的很高级,一旦加载上,按照目前的技术手段无法识别出其名称。
当前的处理方法是将问题主机的磁盘克隆一份,然后挂载到别的主机上,可以化解rootkit的隐藏动作,再对这个挂载磁盘上的文件进行病毒查杀或者各项排查。