首页/安全/应急响应速查/识别伪装成内核线程的木马

识别伪装成内核线程的木马

内核线程(kthreadd 的子进程)命令行显示为带方括号的 [kworker/0:0] 形式;无方括号、PPID 也不是 2 的"内核线程"高度可疑。

应急响应速查安全更新于 2026-10-13

真内核线程长什么样

内核线程由 kthreadd(PID 2)派生,命令行显示为带方括号的形式(如 [kworker/0:0]),且 /proc/PID/cmdline 为空、/proc/PID/exe 不可读。不满足这些特征却自称内核线程的进程高度可疑。

为什么这个判据可靠

进程名可以随便改,但 PPID 与 cmdline、exe 的内核语义无法伪造。伪装者常把名字改成 kworker 之类,却在 PPID 与 /proc 属性上露出马脚。

基本信息

内核线程特征PPID=2(kthreadd),进程名带方括号
kthreaddPID 2,所有内核线程之父
真内核线程/proc/PID/cmdline 为空,/proc/PID/exe 不可读
可疑特征名字像内核线程但 PPID 不是 2
复核方式ps 输出与 /proc 属性交叉验证
权限要求查看全部进程需 root

典型使用场景

  • 排查伪装成 kworker 之类名字的木马
  • 终止进程前确认哪些属于内核
  • 与隐藏进程对比方法配合使用
  • 分析 CPU 占用异常但找不到归属的情况
  • 为判定结论提供可复核的依据

对比核查

对比核查
ps -eo pid,ppid,comm | awk '$2==2' | head -n 20
for P in 1234 5678; do echo "== $P"; tr '\0' ' ' < /proc/$P/cmdline; echo; readlink /proc/$P/exe; done
awk '{print $1, $4}' /proc/1234/stat
ls -l /proc/1234/exe 2>&1 | head

逐项读法

字段含义正常/异常
PID 与 PPID进程号与父进程号PPID 为 2 才是 kthreadd 的子进程
进程名comm 字段带方括号是内核线程的显示惯例
cmdline 内容启动命令行真内核线程为空,有内容即为用户态进程
exe 链接可执行文件真内核线程不可读,可读即用户态进程
名字带方括号不能作为判据,必须结合 PPID 与 /proc 属性;误杀真内核线程会影响系统稳定,动手前务必确认。
部分用户态进程也会以方括号形式显示名字,属于显示层现象,不代表内核身份;最终以 PPID、cmdline 与 exe 为准。

进一步确认可疑进程

进一步确认可疑进程
ls -l /proc/1234/cwd /proc/1234/root 2>&1 | head
cat /proc/1234/status | grep -E 'Name|PPid|Uid|Threads'
ls -la /proc/1234/fd 2>/dev/null | head
ss -antp | grep 1234 | head

真实与伪装特征对照

  • 父进程:真为 kthreadd(PID 2),伪装者父进程是用户态进程
  • 命令行:真为空,伪装者带完整命令行与参数
  • 可执行文件:真不可读,伪装者指向具体路径
  • 工作目录:真无意义,伪装者常指向临时目录
  • 所属用户:真为 root 且无登录会话,伪装者可能挂在普通账号下

判定流程

  • 看 PPID 是否为 2
  • 看 cmdline 是否为空
  • 看 exe 是否可读
  • 核对进程名与可执行路径是否一致
  • 把结论记录进进程画像

易错点

  • 只看名字含 kworker 就放过:名字可以随便改
  • 误杀真内核线程:动手前先看 exe 与 cmdline 确认身份
  • 只看 ps 输出:需直接读 /proc 属性交叉验证
  • 忽略 PPID 链:父进程关系才是识别的核心判据
  • 结论不记录:后续复盘无法说明判定依据

数据来源与参考

  • Linux 内核文档:kthreadd 与内核线程
  • MITRE ATT&CK T1036 伪装

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌