奶牛安全
- 关注

本文是基于Bvp47技术报告(PDF)和
Linux
内核写的。哪位朋友有这个
Bvp47
的样本,麻烦给我分享一下,谢谢!
在Linux
下如何隐藏一个文件呢?方法有多种:
- 最简单的,文件命名用
.
开头,比如.hello
,用ls
命令就无法查出,但用ls -a
却可以看到。 - 劫持
libc.so
或系统调用的API,针对单个进程隐藏,可以给该进程设置LD_PRELOAD
环境变量或者调整LD_LIBRARY_PATH
环境变量里路径的顺序。对所有进程隐藏,则把劫持的so文件的路径加入到/etc/ld.so.preload
- 最复杂,也是最困难,就是在内核里文件相关的函数挂钩劫持。
而Bvp47
就是在Linux
内核挂钩劫持。看看它对内核里哪些文件相关的函数挂钩。
- d_alloc - 获取文件/目录
- vfs_readdir - 读取目录
- vfs_getattr - 获取路径属性
- vfs_getattr64 - 获取路径属性
- sys_open - 句柄打开
- sys_unlink - 删除文件
- sys_rmdir - 删除目录
- __inode_dir_notify - 文件或目录在创建,修改或删除时事件通知
- sys_close - 句柄关闭
- sys_read - 读取句柄
- sys_write - 写句柄
- sys_dup/sys_dup2 - 复制句柄
为什么它会对这些函数挂钩呢?
从Bvp47技术报告(PDF)得知这个超级后门有一个执行程序/usr/bin/modload
。那么它需要隐藏这个文件。
当遍历一个目录时,会发生什么?有兴趣的可以用strace ls
看一下,会看到调用getdents
系统调用,而这个系统调用是获取目录下所有子项。而它最终会调用到vfs_readdir
和d_alloc
。所以,Bvp47
就必须挂钩这两个函数,把/usr/bin/modload
从结果里隐去。通过这种机制,Bvp47
可以躲过主机入侵检测系统在目录遍历方面的检测。
如果主机入侵检测系统直接使用stat
或access
之类系统调用检测/usr/bin/modload
的存在,如命令stat /usr/bin/modload
。那它应该怎样隐藏。由于这些系统调用最终是调用vfs_getattr
或vfs_getattr64
来获取该文件元数据,所以,Bvp47
通过挂钩这些函数把它从结果隐去,从而躲过主机检测系统的检测。
通过打开文件来检测文件存在和stat
的作用是类似,所以它也对sys_open
进行了挂钩。
当一个东西从视觉上看不到时,往往直接用“投石问路”的方式。
- 作为一个正常系统,不大可能是存在
/usr/bin/modload
这个文件,使用sys_open
的O_CREAT
和O_EXCL
的标志直接创建它,如果这个文件是存在的(虽然看不到),那么系统会返回“文件存在”的提示,禁止创建新文件。 - 使用
sys_unlink
删除它。因为这样做,无论文件存在与否都没什么影响。成功就说明有这个后门,删除了也没影响。
所以,Bvp47
必须要对sys_open
,sys_unlink
挂钩,对于sys_rmdir
挂钩可能是它会需要隐藏一些目录。从而保护自身文件完整
应该有
sys_creat
函数,或许盘古实验室忘记放出来了。因为这个函数也是可以用于“投石问路”方式
一个后门对于查看和“投石问路”的API都挂钩来隐藏自身,还有没有办法检测到它的存在?
还是有的。比如使用inotify
和fanotify
的机制,可以实时监控目录里的子目录和文件创建删除更改或元数据变化。如果一个目录,比如/usr/bin
,使用这两种机制之一,检测到创建了一个新文件modload
,用stat
, access
或getdents
都看不到这个文件,这是不是一种非常可疑的行为?
由于这两种机制向用户态通知事件,都会调用__inode_dir_notify
,所以,Bvp47
必须要对这个函数挂钩,从而在事件中过滤掉自身信息,达到隐藏目的
sys_close
,sys_read
,sys_write
,sys_dup/sys_dup2
,这几个函数,小弟知道它们是做什么的,但由于缺乏样本,所以不清楚样本对它们挂钩怎样隐藏文件?
个人母众号是奶牛安全
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)