[xxx] 表示内核线程,非用户态进程,无对应可执行文件,由内核直接管理;其 USER 为 root、VSZ/RSS 为 0、Tgid==Pid 且 PPid==2、/proc/PID/exe 报错、cmdline 为空,均为合法特征。
![ps aux 显示 [ ] 隐藏命令行的进程真实含义与排查](https://img.php.cn/upload/article/001/242/473/176917133514578.jpeg)
ps aux 中 [xxx] 进程名代表内核线程或伪进程
方括号包裹的名称(如 [kthreadd]、[migration/0]、[rcu_gp])不是普通用户态进程,而是内核创建的线程(kernel threads),不对应任何可执行文件,也不运行在用户空间。它们由内核直接管理,用于调度、内存回收、中断处理等底层任务。
这类进程的 COMMAND 列显示为 [xxx] 是 ps 的约定:只要 comm 字段(内核中进程名)非空且无对应磁盘路径,就用方括号包裹显示。它不表示“被隐藏”或“被伪装”,只是内核线程的标准呈现方式。
如何区分内核线程和被隐藏的恶意进程
真正需要警惕的是用户态进程通过修改 argv[0] 或利用 prctl(PR_SET_NAME) 伪造成 [xxx] 形式——但这种情况极少见,且无法绕过 ps 的基本识别逻辑。实际排查时,重点看以下几点:
-
USER列为root且TIME极低(如00:00:00)的[xxx],大概率是合法内核线程 - 若
VSZ和RSS都为 0,基本可确认是内核线程(用户态进程至少占用少量内存) - 检查
/proc/PID/status中的Tgid和Pid:内核线程的Tgid == Pid,且PPid == 2(即父进程为kthreadd) - 用
ls -l /proc/PID/exe:对内核线程会报错No such file or directory;而用户态进程即使改了argv[0],exe仍指向真实二进制
为什么有些 [xxx] 看起来像异常进程(如 [apache2])
少数情况下,用户态程序(尤其是服务类 daemon)会调用 prctl(PR_SET_NAME, "[apache2]") 主动将自身 comm 设为带方括号的名字,目的是在 ps 中与子进程区分开(例如主进程叫 [apache2],工作进程叫 apache2)。这属于正常行为,不代表异常。
判断依据:
- 查
/proc/PID/cmdline:内核线程该文件为空或只含 \0;用户态进程则能读出原始启动命令(即使argv[0]被改过) - 看
ps auxf树状结构:如果[apache2]下挂了一堆apache2子进程,基本就是主进程设名所致 - 对比
systemctl status apache2或pgrep -f apache2,确认是否与已知服务匹配
真正该检查的隐藏进程场景
真正的“隐藏”通常不靠方括号,而是利用以下机制,需额外工具验证:
- 进程删除了自身二进制(
unlink后仍运行):用ls -l /proc/PID/exe会显示(deleted) - 使用
ptrace或LD_PRELOAD干扰ps读取:此时ps可能漏掉进程,需用cat /proc/PID/status或pidof交叉验证 - rootkit 类后门:可能 hook 内核的
sys_getdents64,让/proc对特定 PID 不可见——这时连ls /proc/都看不到 PID 目录,需用chkrootkit或内存取证工具
方括号本身不是线索,别在 [ksoftirqd/0] 上浪费时间;真正要盯住的,是那些 USER 异常、cmdline 为空但 exe 指向可疑路径、或者 PPid 不是 1 或 2 却没出现在进程树里的 PID。










