进程树与父子关系
把进程按父子关系画成树,比看扁平列表更容易发现异常:正常的服务进程有清晰的层级,而入侵链条往往表现为「意料之外的一层」——Web 服务进程下面挂着一个交互式 shell,或者办公软件进程下面出现脚本解释器。pstree 与 ps 的树形输出都能完成这件事,配合上溯父进程就能确认某个可疑进程是被谁拉起来的。
基本信息
| 常用命令 | pstree -aps(含 PID 与命令行参数)、ps -eo pid,ppid,user,cmd --forest |
|---|---|
| 核心概念 | PPID 指向父进程,逐级上溯可还原启动链 |
| 可疑模式 | Web 服务子进程出现 bash、sh -c,或被停止进程下挂新进程 |
| 确认方式 | ps -o ppid= -p <PID> 逐级上溯直到 1 号进程或会话首进程 |
| 注意 | 父进程退出后 PPID 可能被复用,需结合创建时间判断 |
| 权限要求 | 查看其他用户进程的完整命令行需 root |
典型使用场景
- 确认可疑进程是被谁拉起的:服务、计划任务还是人工执行
- 排查 Web 服务器被植入命令执行入口的迹象
- 定位守护结构,判断终止顺序,避免杀一个被另一个拉起
- 核对服务进程数量是否异常(例如多出几个同名字的 shell)
- 为进程画像补充一层关系证据
查看进程树与可疑父子链
查看进程树与可疑父子链
pstree -aps | head -n 60 # 完整树,含参数
ps -eo pid,ppid,user,cmd --forest | head -n 60 # 树形扁平输出
ps -eo pid,ppid,user,cmd --forest | grep -B2 -A2 -iE 'bash|sh -c|wget|curl' | head -n 40
ps -o pid,ppid,lstart,cmd -p 1234 # 查看该进程自身
P=1234; while [ "$P" != "1" ] && [ -n "$P" ]; do ps -o pid,ppid,user,cmd -p "$P" --no-headers; P=$(ps -o ppid= -p "$P" | tr -d ' '); done # 逐级上溯可疑父子链模式
| 父进程 | 子进程 | 说明 |
|---|---|---|
| httpd 或 nginx | bash 或 sh | Web 服务不应直接派生交互式 shell,属高危 |
| Office 或浏览器 | powershell 或 cmd | 典型钓鱼文档执行链 |
| 计划任务进程 | 下载工具或脚本解释器 | 保活脚本的常见形态 |
| 同名的两个进程互为父子 | watchdog 结构 | 需要一并处理,否则互相拉起 |
| 父进程已退出(PPID 为 1) | 可疑二进制 | 孤儿进程,常见于被守护进程拉起后守护退出 |
父子链要结合启动时间看:父进程退出后,它的进程号可能被系统复用给别的进程,只凭 PPID 数值判断父子关系容易把无关进程串成一条链。
Web 服务进程的子进程如果是交互式 shell 或下载工具,基本可以直接按高危处理:正常业务请求不会以这种形式派生命令解释器,这通常意味着存在命令执行入口或已落地的脚本后门。