在应急响应中,我们往往第一步就是查看系统状态,比如运行进程、网络连接和定时任务:
这些命令在日常运维中非常可靠,但在主机可能已被入侵的情况下,它们反而可能误导你。原因很简单:一旦系统被 rootkit 控制,这些工具本身就可能被篡改。
比如:
ps 可能被替换,自动隐藏恶意进程netstat/ss 可通过 LD_PRELOAD 劫持,屏蔽异常连接crontab -l 可能被 hook,看不到恶意任务systemctl 依赖复杂链路(如 D-Bus),任一环节都可能被污染PATH 都可能被指向恶意目录也就是说,你以为在“取证”,实际上是在看攻击者“精心伪装后的结果”。
LinIR(Linux Incident Response)正是为了解决这个问题而设计。它的核心理念只有一句话:
不信任目标系统上的任何用户态工具
它完全绕过常规命令,直接读取底层数据:
ps → 直接读取 /proc/<pid>/ 信息netstat → 解析 /proc/net/tcp 并反查 PIDcrontab → 扫描原始定时任务文件systemctl → 解析 systemd unit 文件lsof → 自建 inode 与 PID 映射在 macOS 上也是类似思路,直接调用系统底层接口(如 proc_pidinfo)。
整个工具是 Go 静态编译单文件(无依赖),拷贝过去即可运行,不依赖目标环境。
👉 更像一把“应急手术刀”:
用完即走,不留痕迹
自动完成:
多层机制捕获连接:
命中后自动补全:
提供:
不是简单“命中就报警”,而是组合判断:
例如:
/tmp 可执行文件(+10)👉 最终评分:60(高风险)
同时:
短生命周期进程(<100ms)可能无法关联:
/proc 信息立即消失ss 也一样)LinIR 的策略:
但仍无法 100% 解决(除非使用 eBPF)。
/proc虽然强大,但不符合设计目标:
👉 LinIR选择:
兼容性优先,而非极致能力
LinIR 不做“判断”,只提供“证据”:
它不会说:
“这台机器被黑了”
而是告诉你:
/tmp 运行👉 最终判断,交给人来做。
在不可信系统里,最大的风险不是看不到,而是“看到的是假的”。
LinIR 的价值就在于:
尽可能绕过被污染的用户态,直接从底层获取可信证据。