HIDS基本原理
熟悉HIDS的朋友应该了解,服务器的shell监控一般有两种,一种依靠Linux的audit审计功能,比如Wazuh,一种是重编译和替换bash二进制文件,将shell上执行的命令实时通过socket传递到服务端。
前一种方法优点是记录完整,缺点是会产生大量的日志,以及audit.rules配置失误的话导致服务器宕机。
后一种方式虽然日志简洁,但如果通过命令远程执行漏洞不走服务器的shell则捕获不到操作。在此我主要介绍Wazuh所使用的audit监控。
audit的原理浅显来说,linux 用于用户空间与内核空间的中间层叫做syscall,是连接用户态和内核态的桥梁,当用户访问硬件设备,比如申请系统资源、操作设备读写、创建新进程时,用户空间发起请求,内核空间负责执行,syscall提供一套标准接口实现。
当用户空间向内核空间发出syscall时,会产生软中断,让程序由用户态进入内核态进而执行相应的操作,每个syscall都有唯一的系统调用号对应。
这样做的好处是内核空间是在受保护的地址空间中,用户空间程序无法直接执行内核代码,也无法访问内核数据。
网上举例了kill()函数的执行流程:
kill() -> kill.S -> swi陷入内核态 -> 从sys_call_table查看到sys_kill -> ret_fast_syscall -> 回到用户态执行kill()下一行代码。
audit框架如下: