真内核线程长什么样
内核线程由 kthreadd(PID 2)派生,命令行显示为带方括号的形式(如 [kworker/0:0]),且 /proc/PID/cmdline 为空、/proc/PID/exe 不可读。不满足这些特征却自称内核线程的进程高度可疑。
为什么这个判据可靠
进程名可以随便改,但 PPID 与 cmdline、exe 的内核语义无法伪造。伪装者常把名字改成 kworker 之类,却在 PPID 与 /proc 属性上露出马脚。
基本信息
| 内核线程特征 | PPID=2(kthreadd),进程名带方括号 |
|---|---|
| kthreadd | PID 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 是否可读
- 核对进程名与可执行路径是否一致
- 把结论记录进进程画像