Linux隐藏进程发现方法_异常进程排查

8次阅读

linux 隐藏进程主要通过内核模块或直接篡改内核数据结构实现,发现方法包括:交叉验证 /proc 与 ps 输出、遍历内核任务链表(crash/systemtap)、检查调度调试信息、监控异常系统调用与网络行为(如无 pid 监听端口)、审计内核模块完整性。

Linux 隐藏进程发现方法_异常进程排查

Linux 系统中隐藏进程通常通过内核模块(如 rootkit)或直接操作内核数据结构实现,绕过标准命令(如pstopls /proc)的检测。发现它们的关键在于:不依赖用户态工具的输出,而是从底层数据源交叉验证,关注异常行为与内核一致性。

检查 /proc 目录与进程列表是否匹配

/proc是内核提供进程信息的虚拟文件系统,但部分 rootkit 会 hook 内核函数(如 getdents64),让ls /proc 跳过特定 PID 目录。需手动遍历并比对:

  • 运行 ls -l /proc | grep '^d' | wc -l 统计目录数,再用 ps aux | wc -l 对比——若 /proc 目录明显多于 ps 显示的进程数,可能有进程被隐藏
  • find /proc -maxdepth 1 -name '[0-9]*' -type d | wc -l 避免 ls 被劫持的影响
  • 对可疑 PID(如数字很大但无对应 ps 条目),尝试 cat /proc/PID/statusls -l /proc/PID/exe——若返回“Permission denied”或“No such file”,需警惕(正常情况应可读或明确报错“No such process”)

比对内核任务链表与 /proc 数据

内核中所有进程以双向链表形式存在于 init_task(PID=0)的tasks 成员中。用户态工具无法直接访问,但可通过以下方式间接验证:

  • 使用 crash 工具(需 vmlinux和内存转储):加载 core 后执行 ps -G,它遍历真实 task_struct 链表,可发现ps 漏掉的进程
  • 无 dump 时,用 systemtap 脚本遍历 init_task.tasks(需内核调试符号):
    probe kernel.function(“iterate_processes”) {printf(“PID: %dn”, pid) }
    输出结果与ps 比对
  • 检查 /sys/kernel/debug/sched_debug(需 debugfs 挂载且开启调度调试):其中的rq 队列包含所有就绪 / 运行态 task,可人工检索异常 PID

监控系统调用与网络异常行为

隐藏进程常伴随异常系统调用模式或网络活动,即使进程名不可见,其行为仍可捕获:

  • auditctl 监控敏感调用:auditctl -a always,exit -F arch=b64 -S execve,openat,connect,再查 ausearch -m execve -i 看是否有无主进程的执行记录
  • ss -tunlpnetstat -tunlp对比端口监听者——若存在监听端口但无对应 PID/ 进程名(显示“-”或“????”),极可能被隐藏
  • 检查 raw socket 使用:cat /proc/net/packet中若出现非 root 用户创建的 PACKET_RX_RING,结合 lsof -i 缺失条目,提示隐蔽网络后门

检查内核模块与系统完整性

大多数隐藏技术依赖恶意内核模块(LKM),因此模块审计是关键入口:

  • 运行 lsmod,对照正常系统模块列表,识别未知 / 混淆名称模块(如ip_tables 被替换成iptbls
  • 检查 /lib/modules/$(uname -r)/kernel/ 下模块签名(若启用 module signing):modinfo -n module_name | xxd -p | head -c 128比对哈希
  • dkms status 查看第三方模块状态;用 cat /proc/kallsyms | grep "t syscall" | wc -l 统计系统调用表项——若少于预期(通常约 330+),说明 syscall table 被 hook
text=ZqhQzanResources