ps aux 显示 [ ] 隐藏命令行的进程真实含义与排查

[xxx] 表示内核线程,非用户态进程,无对应可执行文件,由内核直接管理;其 USER 为 root、VSZ/RSS 为 0、Tgid==Pid 且 PPid==2、/proc/PID/exe 报错、cmdline 为空,均为合法特征。

ps aux 显示 [ ] 隐藏命令行的进程真实含义与排查

ps aux 中 [xxx] 进程名代表内核线程或伪进程

方括号包裹的名称(如 [kthreadd][migration/0][rcu_gp])不是普通用户态进程,而是内核创建的线程(kernel threads),不对应任何可执行文件,也不运行在用户空间。它们由内核直接管理,用于调度、内存回收、中断处理等底层任务。

这类进程的 COMMAND 列显示为 [xxx]ps 的约定:只要 comm 字段(内核中进程名)非空且无对应磁盘路径,就用方括号包裹显示。它不表示“被隐藏”或“被伪装”,只是内核线程的标准呈现方式。

如何区分内核线程和被隐藏的恶意进程

真正需要警惕的是用户态进程通过修改 argv[0] 或利用 prctl(PR_SET_NAME) 伪造成 [xxx] 形式——但这种情况极少见,且无法绕过 ps 的基本识别逻辑。实际排查时,重点看以下几点:

  • USER 列为 rootTIME 极低(如 00:00:00)的 [xxx],大概率是合法内核线程
  • VSZRSS 都为 0,基本可确认是内核线程(用户态进程至少占用少量内存)
  • 检查 /proc/PID/status 中的 TgidPid:内核线程的 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)。这属于正常行为,不代表异常。

OpenGPT

OpenGPT

给AI不同提示词,立即创建属于自己的ChatGPT应用程序

下载

判断依据:

  • /proc/PID/cmdline:内核线程该文件为空或只含 /0;用户态进程则能读出原始启动命令(即使 argv[0] 被改过)
  • ps auxf 树状结构:如果 [apache2] 下挂了一堆 apache2 子进程,基本就是主进程设名所致
  • 对比 systemctl status apache2pgrep -f apache2,确认是否与已知服务匹配

真正该检查的隐藏进程场景

真正的“隐藏”通常不靠方括号,而是利用以下机制,需额外工具验证:

  • 进程删除了自身二进制(unlink 后仍运行):用 ls -l /proc/PID/exe 会显示 (deleted)
  • 使用 ptraceLD_PRELOAD 干扰 ps 读取:此时 ps 可能漏掉进程,需用 cat /proc/PID/statuspidof 交叉验证
  • rootkit 类后门:可能 hook 内核的 sys_getdents64,让 /proc 对特定 PID 不可见——这时连 ls /proc/ 都看不到 PID 目录,需用 chkrootkit 或内存取证工具

方括号本身不是线索,别在 [ksoftirqd/0] 上浪费时间;真正要盯住的,是那些 USER 异常、cmdline 为空但 exe 指向可疑路径、或者 PPid 不是 12 却没出现在进程树里的 PID。

https://www.php.cn/faq/2023473.html

发表回复

Your email address will not be published. Required fields are marked *