文件描述符与已删除文件
在 Linux 上,文件被删除后只要还有进程持有它的句柄,内容就依然在磁盘上,可以通过 /proc/<pid>/fd/ 中的符号链接访问,链接目标末尾带 (deleted) 字样就是标志。这是处理“进程还在跑、文件已被删”情形的常规手段,常用于抢救被删的样本、日志与配置。
基本信息
| 路径 | /proc/<pid>/fd/<n>,符号链接指向真实的文件对象 |
|---|---|
| 删除标志 | 链接目标末尾出现 (deleted) 即已删除但仍被占用 |
| 辅助命令 | lsof +L1 列出链接数为零、已被删除但仍打开的文件 |
| 导出方式 | cat 或 dd 把 fd 内容写到证据目录 |
| 权限要求 | 读取其他用户进程的文件描述符需要 root |
典型使用场景
- 样本执行后自我删除,靠文件描述符取回程序本体继续分析
- 日志或配置被删但服务未重载,抢救进程当前仍在使用的版本
- 验证“该程序已删除”的说法,看进程是否仍持有对应句柄
- 取出被覆盖前的旧版本,与磁盘上的新版本做哈希比对
- 排查长期运行进程持有的异常文件,识别隐藏的读写行为
定位与导出
定位与导出
ls -l /proc/1234/fd | grep deleted # 找已删除但被占用的句柄
lsof -p 1234 +L1 # 另一视角:链接数为零的文件
cat /proc/1234/fd/3 > /mnt/evidence/deleted_fd3.bin # 导出内容
sha256sum /mnt/evidence/deleted_fd3.bin # 导出后立即固定哈希
ls -l /proc/1234/exe # 运行中的可执行体同样能这样取回/proc 条目读法
| 条目 | 含义 | 用法 |
|---|---|---|
| fd/<n> | 进程打开的文件描述符 | 链接目标即实际文件,带 deleted 表示已删 |
| exe | 进程对应的可执行文件 | 被替换或删除后仍可导出运行中的版本 |
| cwd | 进程的当前工作目录 | 判断程序从哪个目录启动 |
| maps | 映射的内存区域与库文件 | 可见被删除的动态库与注入模块 |
对仍在写入的文件,导出的内容只代表导出那一瞬间的状态;要固定某个版本,先按业务流程降低写入频率,或直接在证据副本上操作,并在记录里写清导出时刻。
访问 /proc 会更新相关对象的访问时间,操作本身要在取证日志中留痕;导出体积大的文件时用 dd 指定块数并记下参数,避免一次读满把证据盘写爆。