linux中无法单靠ps或top判断恶意隐藏进程,需交叉验证/proc目录与进程列表、内核任务链表、网络连接、内核模块及ebpf程序等多源数据以发现异常。

Linux 中无法单靠 ps 或 top 判断是否存在恶意隐藏进程,因为这些工具本身可能已被劫持。关键在于交叉验证多个独立数据源,避开用户态干扰,直击内核真实状态。
比对 /proc 目录与进程列表是否一致
/proc 是内核提供的虚拟文件系统,每个运行进程应对应一个数字子目录。但 rootkit 常 hook getdents64 等系统调用,让 ls /proc 跳过特定 PID。需绕过 libc 依赖:
- 用
find /proc -maxdepth 1 -name '[0-9]*' -type d | wc -l统计真实可见 PID 数量 - 执行
ps aux | wc -l获取命令显示的进程数,两者明显不匹配(如 /proc 多出几十个目录)即存疑 - 对异常大数字 PID(如 99999),尝试
cat /proc/99999/status:返回Permission denied或静默失败,而非明确的No such process,高度可疑
绕过用户态工具,检查内核真实任务链表
所有进程在内核中以双向链表挂载在 init_task 下,该结构不受用户态 hook 影响:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 若有内存转储(core dump)和对应
vmlinux,用crash工具执行ps -G,它遍历原始 task_struct 链表,可暴露ps漏掉的进程 - 无 dump 时,可用
systemtap脚本遍历init_task.tasks(需调试符号),输出 PID 列表后与ps结果比对 - 启用
debugfs后查看/sys/kernel/debug/sched_debug,其中rq队列列出所有就绪/运行态任务,人工检索是否有无主 PID
抓取异常系统行为线索
即使进程名被隐藏,其资源使用仍会留下痕迹:
- 运行
ss -tunlp,若发现监听端口但 PID 列显示-或空白,极可能被隐藏;再用lsof -i :PORT反查,同样无结果则风险极高 - 检查
/proc/net/packet,非 root 用户创建的PACKET_RX_RINGsocket,结合lsof -i缺失条目,提示隐蔽网络后门 - 用
auditctl审计敏感调用:auditctl -a always,exit -F arch=b64 -S execve,connect,再查ausearch -m execve -i是否存在无父进程的执行记录
核查内核模块与加载机制
绝大多数隐藏技术依赖恶意内核模块(LKM)或 eBPF 程序:
- 执行
lsmod,重点关注名称可疑(如hide、knark、adore)、无签名、或不在官方 kernel tree 中的模块 - 检查
/lib/modules/$(uname -r)/extra/和updates/目录下是否有非标准模块文件 - 运行
sysctl kernel.modules_disabled,若值为0表示模块可动态加载;再用dmesg | tail -50查最近是否有异常模块插入日志 - 执行
bpftool prog list和bpftool map list,识别非系统路径加载的 eBPF 程序










