首页/安全/应急响应速查/追踪 PPID=1 的孤儿与守护进程

追踪 PPID=1 的孤儿与守护进程

进程父级变成 init/systemd(PPID=1)很常见(服务与 daemon 化),但对不该出现的主体(如 Web 用户、交互式 shell)就是警报。

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

PPID=1 意味着什么

进程的父进程退出后会被 init 或 systemd(PID 1)收养,PPID 于是变成 1。对 daemon 化的服务、nohup 启动的任务、容器里的 1 号进程来说这是完全正常的。但当 Web 用户、数据库用户这类不该有常驻进程的账号名下出现 PPID=1 的进程时,就要解释它从哪来、在做什么。判断依据是「这个用户该不该有常驻进程」,而不是 PPID=1 本身。

基本信息

适用平台Linux(ps 与 /proc 通用)
查看命令ps -eo pid,ppid,user,lstart,cmd
正常情形nohup 任务、daemon 化服务、容器 1 号进程
可疑情形Web/数据库账号名下的常驻进程、带交互参数的命令
必查要素lstart 启动时间、exe 真实路径、cwd、监听端口
关联线索systemd 单元归属、容器 PID 命名空间

典型使用场景

  • 排查 Web 服务账号下不该存在的常驻进程,往往对应 webshell 拉起的后门
  • 主机重启后核对哪些进程被自动拉起,据此判断持久化位置
  • 分析可疑木马进程时确认它由谁拉起、什么时候启动、跑了多久
  • 清理长期驻留的历史进程,降低资源占用与误报噪音
  • 容器排查中区分宿主机进程与容器内 1 号进程,避免张冠李戴

列出并筛出可疑者

列出并筛出可疑者
ps -eo pid,ppid,user,lstart,cmd | awk '$2==1' | head -n 40      # 所有被收养的进程
ps -eo pid,ppid,user,cmd | awk '$2==1 && $3=="www-data"'        # 只看异常用户
ps -p 1234 -o pid,ppid,user,lstart,etimes,cmd                   # 单进程详情
ls -l /proc/1234/exe; readlink /proc/1234/cwd                   # 真实可执行文件与工作目录
ls -l /proc/1234/fd | head -n 10; ss -antp | grep 1234          # 打开的文件与网络连接
cat /proc/1234/cgroup | head -n 2                               # 归属哪个 systemd 单元

判读要点

列含义关注点
PID进程号记录下来用于后续取证与关联
PPID父进程号为 1 表示由 init/systemd 收养
USER运行用户运维/静态账号名下不该有常驻进程
LSTART启动时间与事件时间线、重启时间比对
CMD命令行带交互参数或路径在 /tmp 下格外可疑
ETIMES已运行时长长期运行又无对应日志的最可疑
容器里 1 号进程通常就是应用本身,宿主机上看到它的 PPID 为 1 属正常;真正要看的是「这个账号凭什么有常驻进程」。
不要一刀切清理所有 PPID=1 的进程:合法守护进程被误杀会造成服务中断,动手前先确认 cmdline 与安装包归属。

易错点

  • 一刀切杀 PPID=1 的进程:合法守护进程被当孤儿清掉,业务中断且难回滚
  • 忽略 lstart:不知道进程活了多久,就排不出处置的先后顺序
  • 不查 exe 与 cwd:同名进程可能是被替换过的假二进制,必须看真实路径
  • 忘记容器场景:把容器内的 1 号进程当成宿主机异常,白白耗费时间

数据来源与参考

  • procps-ng ps(1) 手册
  • MITRE ATT&CK T1036.004 伪装成服务

相关工具

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