最后防线:字节跳动HIDS分析 – 作者:buckxu

AgentSmith HIDS是字节跳动开源的HIDS,它是基于内核驱动方式进行入侵检测,可以检测各种rootkit/bootkit,具有实时,高性能,无感知的优势。

由于它是基于内核,只对2.6.32+内核支持,且rootkit的检测必须要在3.10.0+内核才支持。同时,由于它是监控内核函数的调用,事件和消息,并不提供软件管理,用户管理,系统管理,网络管理之类的基线。

虽然目前总体代码只是2500行左右,但实现功能却非常多,多得作者Will大佬的指点,在撸一把5.12.0内核的代码,才勉强清楚这些检测点的应用场景。感谢Will大佬。Will大佬在内核造诣非常深厚。

公共信息

AgentSmith在检测信息时,这些信息是每个场景都采集的。

当前用户id

当前进程id

当前父进程id

当前进程组id

任务会话id

内核线程组id

UTS命名空间节点名称 (对docker之类的支持)

当前进程执行程序

Audit会话id(没有开启audit,就为0)

原理

AgentSmith是LKM(可加载内核模块)的方式hook住Linux内核一些函数。由于它是使用kprobe的方式,它hook的函数不只是系统调用,还可以hook内核内部一些函数,而这些内部函数是某些系统调用的关键点调用。

Hook

下面按照这样格式列举各个钩子:
内核版本:该钩子支持的内核版本
作用:该钩子对应syscall的作用
危害:黑客可以利用相应syscall所造成的危害
实现原理:该钩子的实现方式
不足:该钩子还没有覆盖的情况

mprotect

内核版本:

1.0+

作用

这个系统调用对当前进程内存段设置保护

危害

1.恶意软件把当前进程的数据段设置为可执行,从而绕过DEP

2.恶意软件把当前进程的代码段设置为可写,从而注入恶意代码

实现原理

mprotect系统调用挂钩,记录任何把进程内存段改为**执行权限(PROT_EXEC)**的操作。记录信息:

1.执行程序

2.执行程序的进程树

3.目标进程

4.目标进程所属的程序

5.操作

不足

仅处理了执行权限(PROT_EXEC, 没有处理可写权限(PROT_WRITE)

open

内核版本:

1.0+

作用

打开并且有可能创建新的文件或设备

危害

恶意软件隐藏自身文件, 躲避检测

实现原理

open系统调用挂钩,记录程序打开文件操作,记录信息:

1.执行程序

2.文件

3.打开标志

4.打开模式

nanosleep

内核版本:

2.0+

作用

进程休眠一定时间再执行,高精度的休眠

危害

恶意软件hooknanosleep系统调用,可以延迟执行,从而逃避HIDS软件的检测。详情请见https://reyammer.io/publications/2018_oakland_linuxmalware.pdf

实现原理

nanosleep系统调用挂钩,记录程序进程休眠操作,记录信息:

1.执行程序

2.秒

3.纳秒

kill

内核版本

kill: 1.0+

tkill: 2.4.22, 2.6+

作用

kill: 向某个进程发送信号

tkill: 向某个线程发送信号

危害

服务进程被恶意终止,造成DOS攻击

实现原理

对kill/tkill系统调用挂钩,记录程序终止某个进程操作,

记录信息:

1.执行程序

2.目标进程

3.信号

exit

内核版本

exit: 1.0+

exit_group: 2.6+

作用

exit: 进程退出

exit_group: 所有进程所在线程组的线程都退出

危害

服务线程被退出,造成服务不可用

实现原理

对exit/exit_group系统调用挂钩,记录程序退出进程操作,记录信息:

执行程序

rm

内核版本

rmdir: 1.0+

unlink: 1.0+

作用

rmdir: 删除一个目录

unlink: 删除链接,并且有可能删除引用的文件

危害

服务依赖的问题被删除,导致服务无法启动

实现原理

对rmdir/unlink系统调用挂钩,记录程序删除文件或目录操作,记录信息:

1.执行程序

2.被删除的路径

rename

内核版本

rename: 1.0+

renameat: 2.6.16+

作用

rename: 重命名或移动文件

renameat: 基于某个目录重命名或移动文件

危害

恶意文件伪装成合法文件

实现原理

对rename/renameat系统调用挂钩,记录程序对目录和文件改名操作,记录信息:

1.执行程序

2.当前工作路径

3.旧路径名

4.新路径名

link

内核版本

link: 1.0+

linkat: 2.6.16+

作用

link: 给文件建立链接

linkat: 基于某个目录给文件建立链接

危害

恶意文件伪装成合法文件

实现原理

对link/linkat系统调用挂钩,记录程序链接文件操作,记录信息:

1.执行程序

2.当前工作路径

3.旧路径名

4.新路径名

setsid

内核版本

setsid: 1.0+

作用

setsid: 创建会话并设置进程组ID

危害

恶意本地提权

实现原理

对setsid系统调用挂钩,记录程序执行文件权限提升操作,记录信息:

执行程序

prctl

内核版本

prctl: 2.2+

作用

prctl: 对进程的属性操作

危害

1.进程伪装,躲避HIDS的检测

2.允许进程被恶意代码注入

3.允许进程自修改(病毒多态)

实现原理

对prctl系统调用挂钩,记录程序对进程和线程进行名称设置(PR_SET_NAME2.6.9+内核支持)操作,记录信息:

1.执行程序

2.改名

3.新名称

不足

1.没有对PR_SET_PTRACER处理,这个会允许恶意软件调试该进程,从而进行代码注入。PR_SET_PTRACER在3.4+内核支持

2.没有对PR_SET_MM监控,恶意程序可以对自身进行自修改,PR_SET_MM在3.3+内核支持

connect

内核版本

connect: 2.0+

作用

connect: 启动一个连接

危害

外连行为

实现原理

对connect系统调用挂钩,记录程序连接远程服务操作,记录信息:

1.数据类型

2.目标IP

3.目标端口

4.执行文件

5.源IP

6.源端口

7.返回结果

bind

内核版本

bind: 2.0+

作用

bind: 绑定socket

危害

高危端口,增加攻击面

实现原理

对bind系统调用挂钩,记录程序绑定端口提供服务操作,记录信息:

1.执行程序

2.IP地址

3.端口

4.返回结果

create

内核版本

open: 1.0+

creat: 1.0+

作用

open: 打开并且有可能创建新的文件或设备

creat: 创建新的文件或设备

危害

恶意软件创建并隐藏自身文件,躲避检测

实现原理

对creat/open系统调用挂钩,记录不在白名单的程序创建文件操作,记录信息:

1.执行程序

2.路径

execv

内核版本

execve: 1.0+

作用

execve: 执行文件

危害

执行恶意程序

实现原理

对execve系统调用挂钩,记录程序执行文件操作,记录信息:

执行目录

执行程序

父程序

参数

标准输入

标准输出

进程树

终端名称

ssh连接

ld_preload标志

返回结果

目标IP

目标端口

源IP

源端口

socket所属进程

socket名称

ptrace

内核版本

ptrace: 1.0+

作用

调试进程

危害

恶意代码注入正常程序,可以达到无落地文件的内存级注入

实现原理

对ptrace系统调用挂钩,记录程序调试进程操作,记录信息:

POKETEXT/POKEDATA

进程ID

内存地址

拷贝的数据

执行程序

进程树

不足

PTRACE_GETREGSET,PTRACE_SETREGSET,PTRACE_SYSCALL没有处理,无法阻止ROP攻击

DNS

内核版本

recvmsg: 2.0+

作用

recvmsg: 接收消息

危害

DNS污染

实现原理

对recvmsg系统调用挂钩,记录程序dns查询消息处理,记录信息:

目标端口

目标地址

执行程序

源IP

源端口

消息类型

操作码

返回码

不足

没有对sendmsg挂钩,对DNS的响应,检测DNS反射放大攻击

init_module

内核版本

init_module: 1.0+

作用

init_module: 加载内核模块

危害

加载内核态rootkit或bootkit

实现原理

对init_module系统调用挂钩,记录程序加载内核模块操作,记录信息:

执行程序

模块名

进程树

当前工作目录

update_creds

内核版本

capset: 2.2+

setgroups: 2.4+

fork: 1.0+

execve: 1.0+

setns: 3.0+

setregid: 1.0+

setgid: 1.0+

setreuid: 1.0+

setuid: 1.0+

setresuid: 2.2+

setresgid: 2.2+

setfsuid: 1.2+

setfsgid: 1.2+

keyctl: 2.6.11+

add_key: 2.6.11+

request_key: 2.6.11+

作用

capset: 设置线程权限特性

setgroups:给进程设置后补组

fork: 创建子进程

execve: 执行程序

setns: 关联线程到某个命名空间

setregid: 设置有效组id

setgid:设置真实组id

setreuid: 设置有效用户id

setuid: 设置真实用户id

setresuid: 设置真实,有效和保存用户id

setresgid:设置真实,有效和保存组id

setfsuid: 设置用于文件系统检查的用户id

setfsgid:设置用于文件系统检查的组id

keyctl: 操作内核密钥管理工具

add_key: 增加一个密钥到内核密钥管理工具

request_key: 从内核密钥管理工具中请求一个密钥

危害

恶意文件提权

实现原理

对capset/setgroup/fork/execve/setns/setregid/setgid/setreuid/setuid/setresuid/setresgid/setfsuid/setfsgid/keyctl/add_key/request_key系统调用涉及的update_creds函数挂钩,记录程序进程权限提升操作,记录信息:

执行程序

进程树

旧uid

设置结果

作者信息

buckxu, 公众号debugeeker, 曾在华为,中兴,商汤,腾讯工作过,主要是做信息安全工作

来源:freebuf.com 2021-06-16 16:51:59 by: buckxu

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论