已删除但仍运行的进程
Linux 中删除文件只是去掉目录项,只要还有进程持有这个 inode,文件内容就仍然存在。所以当 /proc/<PID>/exe 指向的路径后面带 (deleted) 时,说明这个进程正在运行一个「磁盘上已经不存在」的程序。恶意程序常主动删除自身副本以避免被扫描,升级覆盖类操作也会出现同样现象。这类进程的价值在于:可以趁它还在运行,把样本直接从 /proc 里复制出来。
基本信息
| 查看方式 | ls -l /proc/<PID>/exe 或 readlink /proc/<PID>/exe |
|---|---|
| 判断特征 | 符号链接目标路径后带 (deleted),且链接不可用 |
| 样本恢复 | cp /proc/<PID>/exe /evidence/ 即可复制出完整二进制 |
| 正常情况 | 软件包升级替换了二进制但服务未重启,也会显示 deleted |
| 扩展检查 | lsof +L1 可一次列出所有已删除但被占用的文件 |
| 权限要求 | 查看其他用户的进程需 root |
典型使用场景
- 怀疑木马自删副本时,确认进程是否在运行一个已不存在的二进制
- 清理前把样本捞出来做哈希与文件检测,避免清理后无从分析
- 排查升级未重启的遗留进程,确认服务是否运行了旧版本代码
- 对比磁盘文件与运行中样本,判断是否被替换过
- 定位被删除的日志或配置仍被进程占用的情况
确认并恢复样本
确认并恢复样本
ls -l /proc/1234/exe # 是否显示 (deleted)
readlink /proc/1234/exe # 只取链接目标
sudo lsof +L1 | head -n 20 # 全系统范围内已删除但被占用的文件
cp /proc/1234/exe /evidence/recovered_1234.bin 2>/dev/null # 复制样本
sha256sum /evidence/recovered_1234.bin | tee /evidence/recovered_1234.sha256
strings -n 8 /evidence/recovered_1234.bin | head -n 20 # 粗看字符串线索
ls -l /proc/1234/maps | head -n 10 # 是否还加载了已删除的共享库/proc/PID 目录读法
| 条目 | 含义 | 异常信号 |
|---|---|---|
| exe | 可执行文件路径 | 带 (deleted) 说明二进制已被删除或替换 |
| cwd | 工作目录 | 指向 /tmp、/dev/shm 等临时目录 |
| root | 该进程眼中的根目录 | 与 / 不同说明涉及 chroot 或容器命名空间 |
| cmdline | 启动命令行 | 含下载地址、编码内容或异常参数 |
| environ | 环境变量 | 含未在配置中出现的地址、凭据或路径 |
| maps | 内存映射的库与文件 | 出现已删除的共享库或匿名可执行段 |
| fd | 打开的文件描述符 | 套接字对应的 inode 可与 /proc/net/tcp 对照 |
从 /proc 恢复出来的样本只用于分析:不要在本机直接执行它,也不要用下载工具以外的程序去打开它。复制后立刻算哈希、标记属性,并在隔离环境中再做进一步检测。
升级造成的 deleted 属于正常现象:判断时看两点——进程启动时间是否早于文件最后修改时间,以及二进制是否属于已安装的软件包。两者都对得上,就不是入侵证据。