可在linux中通过auditd监控ptrace系统调用实时捕获可疑调试或内存注入行为,核心规则为-a always,exit -f arch=b64 -s ptrace,需配合-f a1=0x10等高危请求码过滤,并将规则写入/etc/audit/rules.d/确保持久生效。

可以在Linux中通过auditd配置规则,实时捕获对目标二进制程序发起的ptrace系统调用,从而发现可疑调试或内存注入行为。关键在于监控ptrace系统调用本身,而非仅关注进程名或路径——因为攻击者常复用合法工具(如gdb、strace)或直接调用syscall实现隐蔽注入。
监控ptrace系统调用的核心规则
auditd通过-a always,exit规则在系统调用退出时记录事件,配合-F arch=b64(x86_64)或b32(兼容模式)确保架构匹配,并用-S ptrace精准过滤。示例规则:
sudo auditctl -a always,exit -F arch=b64 -S ptrace -F key=ptrace_monitor- 若需限定只监控特定目标程序被调试(如
/usr/bin/myapp),可追加-F exe=/usr/bin/myapp;但注意:该条件匹配的是被调试进程(tracee)的执行路径,不是tracer进程 - 更实用的做法是结合
-F a1=0x10(即PTRACE_ATTACH请求码)进一步缩小范围,避免记录大量无关的PTRACE_PEEKDATA等调试读写操作
识别高风险调试行为的关键字段
审计日志(/var/log/audit/audit.log)中一条典型ptrace事件包含以下关键信息,需重点关注:
-
comm=:发起ptrace调用的进程命令名(如gdb、strace、ld-linux,甚至可能是伪装成sleep的恶意程序) -
exe=:该进程的完整路径,用于判断是否为白名单工具或未知二进制 -
a1=:ptrace的request参数值,0x10(PTRACE_ATTACH)、0x4(PTRACE_POKETEXT)、0x6(PTRACE_POKEUSER)等属于高危操作 -
pid=与a0=(即pid_t pid参数):确认被调试进程ID是否为目标敏感程序 -
uid=与auid=:区分真实登录用户与提权后行为,防止sudo绕过检测
配套防御与响应建议
仅记录不够,需形成闭环响应:
- 用
ausearch -m avc -ts today | aureport -f -i定期扫描,或部署audispd插件对接SIEM(如Elastic Stack),设置告警阈值(例如1分钟内同一tracer对3个不同进程attach) - 对已知可信调试器(如开发环境中的gdb)按用户、路径、时间窗口做白名单,避免误报;白名单规则示例:
-a always,exit -F arch=b64 -S ptrace -F uid=1001 -F exe=/usr/bin/gdb -F key=gdb_trusted - 结合应用层防护:在敏感进程中主动调用
prctl(PR_SET_DUMPABLE, 0)禁用core dump和ptrace附加;或定期检查/proc/[pid]/status中TracerPid:字段是否非零 - 发现异常ptrace行为后,可联动
systemd-run --scope临时限制可疑UID的ptrace权限,或使用seccomp-bpf策略在容器/服务级默认禁止ptrace调用
不复杂但容易忽略:auditd规则默认不持久,需将auditctl命令写入/etc/audit/rules.d/ptrace.rules并重启auditd服务,否则重启后失效。











