auditd本身不拦截攻击,仅记录系统调用行为;需通过精准监控fsconfig、unshare、nft_*、ioctl、userfaultfd等高危syscall,配合-f过滤器写规则,并实时联动audispd与ebpf实现毫秒级识别与阻断。

Auditd 本身不拦截攻击,它只记录系统调用行为。想“截获”CVE溢出攻击,核心不是靠 auditd 主动阻断,而是通过高精度 syscall 审计 + 实时规则匹配,实现毫秒级识别与联动响应。关键在于:选对审计点、写准规则、接好下游。
重点监控易被溢出利用的危险系统调用
多数内核溢出漏洞(如 CVE-2022-0185、CVE-2026-31431、CVE-2022-1015)都依赖特定 syscall 触发内存越界或逻辑绕过。auditd 应优先盯住这些:
-
fsconfig —— CVE-2022-0185 的直接入口,需审计
fsconfig系统调用及其参数(尤其FS_CONFIG_CMD_CREATE+ 超长 options) -
unshare —— 多数命名空间逃逸前提,重点关注
CLONE_NEWUSER | CLONE_NEWNS组合调用 -
nft_* 相关调用(如
netlink_send,socket,bind)—— CVE-2022-1015 利用链起点 -
ioctl —— 针对驱动类漏洞(如 CVE-2021-42008 的 6pack 设备),监控带可疑 cmd(如
SIOCGIFCONF、自定义 ioctl 编号)的调用 - userfaultfd —— CVE-2021-42008 等利用中常见,普通用户不应调用,出现即告警
用 auditctl 写精准过滤规则,避免日志爆炸
不能只开全局 syscall 记录。要用 -F 过滤器缩小范围,聚焦上下文:
- 监控 fsconfig 创建上下文且参数长度异常:
auditctl -a always,exit -F arch=b64 -S fsconfig -F a1=1 -F a2>=4096 -k cve_2022_0185_attempt - 捕获非 root 用户调用 userfaultfd:
auditctl -a always,exit -F arch=b64 -S userfaultfd -F uid!=0 -k uffd_abuse - 记录 unshare 中同时启用 USER+MOUNT 命名空间:
auditctl -a always,exit -F arch=b64 -S unshare -F a1&0x10000000 -F a1&0x00020000 -k ns_escape_attempt
注意:a1/a2 是系统调用第1/2个参数(按 ABI),需查 man 2 fsconfig 或内核源码确认语义;-k 标签便于后续 ausearch -k 快速检索。
审计日志必须实时对接响应机制
auditd 日志写入 /var/log/audit/audit.log 是异步的,仅靠 ausearch 查看已滞后。真实防御需:
- 用
audispd插件将事件转发至本地 socket 或 syslog,再由 Python/Go 脚本解析; - 匹配到
-k cve_2022_0185_attempt类标签时,立即执行:
•kill -STOP $(pgrep -u $UID)暂停可疑用户所有进程
•systemctl stop docker(若运行在容器环境)
• 触发 SIEM 告警并隔离宿主机网络接口 - 结合 eBPF 工具(如
bpftool)在检测到恶意 syscall 后 50ms 内注入tracepoint/syscalls/sys_enter_*过滤器,实现真正“拦截”(auditd 负责发现,eBPF 负责阻断)。
绕过风险与加固要点
攻击者常规避 auditd,需同步加固:
- 禁用未授权用户使用
unshare:echo 'kernel.unprivileged_userns_clone = 0' >> /etc/sysctl.conf - 关闭非必要内核模块(如
6pack,nft_meta若业务不用)防止被当作攻击面; - auditd 规则应加载为
augenrules并启用auditctl -e 2锁定配置,防被恶意进程篡改; - 定期用
grep "type=SYSCALL" /var/log/audit/audit.log | awk '{print $15}' | sort | uniq -c | sort -nr发现异常高频 syscall 模式。










