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

5次阅读

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