(年半前旧文)最后防线:字节跳动HIDS分析
2023-2-5 08:3:59 Author: 奶牛安全(查看原文) 阅读量:9 收藏

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

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

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

公共信息

AgentSmith在检测信息时,这些信息是每个场景都采集的。详情见kprobe_print.h

  1. 当前用户id
  2. 当前进程id
  3. 当前父进程id
  4. 当前进程组id
  5. 任务会话id
  6. 内核线程组id
  7. UTS命名空间节点名称 (对docker之类的支持)
  8. 当前进程执行程序
  9. 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+

作用

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

危害

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

实现原理

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

  1. 执行程序
  2. 纳秒

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系统调用挂钩,记录程序退出进程操作,记录信息:

  1. 执行程序

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系统调用挂钩,记录程序执行文件权限提升操作,记录信息:

  1. 执行程序

prctl

内核版本

prctl: 2.2+

作用

prctl: 对进程的属性操作

危害

  1. 进程伪装,躲避HIDS的检测
  2. 允许进程被恶意代码注入
  3. 允许进程自修改(病毒多态)

实现原理

对prctl系统调用挂钩,记录程序对进程和线程进行名称设置(PR_SET_NAME 2.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系统调用挂钩,记录程序执行文件操作,记录信息:

  1. 执行目录
  2. 执行程序
  3. 父程序
  4. 参数
  5. 标准输入
  6. 标准输出
  7. 进程树
  8. 终端名称
  9. ssh连接
  10. ld_preload标志
  11. 返回结果
  12. 目标IP
  13. 目标端口
  14. 源IP
  15. 源端口
  16. socket所属进程
  17. socket名称

ptrace

内核版本

ptrace: 1.0+

作用

调试进程

危害

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

实现原理

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

  1. POKETEXT/POKEDATA
  2. 进程ID
  3. 内存地址
  4. 拷贝的数据
  5. 执行程序
  6. 进程树

不足

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

DNS

内核版本

recvmsg: 2.0+

作用

recvmsg: 接收消息

危害

DNS污染

实现原理

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

  1. 目标端口
  2. 目标地址
  3. 执行程序
  4. 源IP
  5. 源端口
  6. 消息类型
  7. 操作码
  8. 返回码

不足

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

init_module

内核版本

init_module: 1.0+

作用

init_module: 加载内核模块

危害

加载内核态rootkit或bootkit

实现原理

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

  1. 执行程序
  2. 模块名
  3. 进程树
  4. 当前工作目录

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函数挂钩,记录程序进程权限提升操作,记录信息:

  1. 执行程序
  2. 进程树
  3. 旧uid
  4. 设置结果                



暗号:79f47

文章来源: http://mp.weixin.qq.com/s?__biz=MzU4NjY0NTExNA==&mid=2247488168&idx=1&sn=a316ca2d0cac4690452b7155c3349caa&chksm=fdf979bdca8ef0ab0c8b2285277763079556a59874ce52ab26c2d188e9c45afe7c9573b22d5f#rd
如有侵权请联系:admin#unsafe.sh