Neo23x0/process-watcher
安全用 eBPF 监控某个 Linux 服务启动了哪些子进程,用于发现漏洞利用。
一个范围很窄、需要 root 的 eBPF 代理,只盯住指定服务的进程树并记录它启动了哪些子进程。适合在已知 Linux 主机上做应急响应或加固,不是通用 EDR。
解决什么问题
假设攻击者让对外暴露的 nginx、php-fpm 或 Java 服务执行了一条命令。服务本身看起来正常,只有多出来的子进程——shell、useradd 或下载器——暴露了入侵。事后翻 /proc 会漏掉已经退出的进程,而依赖服务自身日志的检测也可能根本不触发。process-watcher 挂载 eBPF 程序,在被监控的进程树产生子进程时发出事件,于是你能看到那个短命命令及其父进程链,而不是事后拼凑。
有什么不同
关键在匹配机制:它按实际被执行文件的文件名匹配,而不是 comm 或 argv[0],并且会跨 exec、reparent、double fork 以及根进程退出来跟踪后代,因此重新挂到 PID 1 下的命令仍能被归属到原根进程。事件可写 JSONL、UDP/TCP 或 webhook;命令行参数捕获需显式开启,因为命令行可能含密钥。可选的 kill 规则能按 image、argv 或正则向匹配的子进程发信号,这是一个直接而粗暴的处置手段。
代价是严格。缺少任一条件时代理会以退出码 3 停止,绝不会退回轮询 /proc(README 称那样会漏掉短命进程)。也就是说覆盖是二元的:主机满足条件才有数据。check-config 和 print-config 无需 root,但观测本身不行。
谁值得试
适合:安全或平台团队在已知 amd64/arm64、较新内核的主机上运行某个特定服务,希望得到该服务启动子进程的轻量、可审计记录——例如 README 提到的 PHP 关键漏洞发布窗口。也适合应急响应人员只盯一个可疑服务而不是整台机器。
不适合:内核较旧、只有容器环境,或服务进程树无法按镜像名锁定的主机。它也不是通用主机入侵检测系统;它只看你指定的进程树。
使用条件与边界
需要 Linux amd64/arm64、内核 5.15+ 且带 BTF(/sys/kernel/btf/vmlinux)。README 提醒仅看版本号不够,因为代理启动时会检查所需的具体函数和结构字段。需要 root(或 CAP_BPF + CAP_PERFMON,读取其他用户可执行文件还需 CAP_SYS_PTRACE,kill 规则需 CAP_KILL),并且必须在宿主机初始 PID namespace 中运行:它拒绝在容器内运行,内核 lockdown 为 confidentiality 时也无法工作。sudo ./process-watcher doctor 可检查这些条件;已测试内核见 docs/compatibility.md。
日常维护也要花心思:维护监控名单和排除项、谨慎处理命令行参数捕获、先小范围验证 kill 规则。部署可用单个静态二进制或经 packaging/INSTALL.md 安装的 systemd 服务;发布包提供校验和与构建来源证明。
HotRepo 点评
HotRepo 自 2026-10-24 开始追踪;2026-10-25 的新项目榜(不是总榜)显示 109 个总星、排名 #25——这是单次快照,不是单日增长。仅有两天记录,无法判断能否持续。采用前请确认内核能通过 doctor,并核实你要监控的服务真实可执行文件名与配置一致。
本文由 AI 根据项目 README 生成,更新于 2026年10月25日,以项目官方文档为准。