environ 里能看到什么
/proc/PID/environ 保存进程启动瞬间的环境变量,以 NUL 分隔。LD_PRELOAD 劫持、异常的代理设置,甚至被写进环境的明文凭据,都常在这里露出。
时效与权限
它反映的是启动那一刻的值:进程内通过 setenv 做的修改不会体现。读取需要 root 或与进程同用户,因此「读不到」通常只是权限问题。
基本信息
| 查看方式 | tr '\0' '\n' < /proc/PID/environ |
|---|---|
| 可疑项 | LD_PRELOAD、LD_LIBRARY_PATH |
| 顺带线索 | 代理变量、内网地址、明文口令与 token |
| 权限要求 | root 或与目标进程同用户 |
| 时效性 | 反映启动瞬间的值,不含运行期修改 |
| 关联文件 | /proc/PID/cmdline 与 /proc/PID/maps |
典型使用场景
- 排查环境变量注入类劫持
- 从 Web 进程环境中发现被写入的凭据
- 确认进程使用的代理与外部地址配置
- 还原服务启动时的工作参数
- 与进程画像一起固定证据
列出环境变量并筛选
列出环境变量并筛选
tr '\0' '\n' < /proc/1234/environ | sort
tr '\0' '\n' < /proc/1234/environ | grep -iE 'ld_preload|ld_library_path|proxy'
tr '\0' '\n' < /proc/1234/environ | grep -aiE 'pass|token|secret|key=' | head
wc -c /proc/1234/environ
tr '\0' '\n' < /proc/1234/environ | wc -l逐项读法
| 变量 | 含义 | 正常/异常 |
|---|---|---|
| LD_PRELOAD | 预加载库路径 | 出现非系统路径即高可疑 |
| LD_LIBRARY_PATH | 库搜索路径 | 指向临时目录需重点核查 |
| http_proxy 等 | 出站代理设置 | 出现未知代理说明流量可能被中转 |
| 含凭据变量 | 明文口令与 token | 属敏感证据,导出后需脱敏 |
environ 只反映启动时的状态:判断要结合 cmdline、maps 与实际网络行为,单看环境变量容易得出片面结论。
直接 cat 会因为 NUL 分隔糊成一行,必须先 tr 转换;输出中可能含明文凭据,应按敏感证据管理并限制访问范围。
留档时对凭据脱敏
留档时对凭据脱敏
tr '\0' '\n' < /proc/1234/environ | sed -E 's/(pass|token|secret|key)[^=]*=.*/\1=REDACTED/I' > /evidence/env_1234.txt
sha256sum /evidence/env_1234.txt
tr '\0' '\n' < /proc/1234/environ | wc -l容易忽略的变量线索
- PATH 被前置了非标准目录,可能导致系统命令被替换
- HOME 或 TMPDIR 指向异常路径,改变程序的运行位置
- SHELL 与 SHELLOPTS 变化提示启动方式被改动
- 业务变量中出现外部 IP 与非常规端口
排查时的常见疑问
- 读不到内容多为权限问题,非 root 无法读取他人进程的环境变量
- 变量存在但值为空,说明启动脚本里赋值为空而非没有设置
- 同一服务的多实例变量可能不同,需要按 PID 分别确认
- 环境变量与命令行都会泄露信息,两者都要固定留档
分析要点
- 只记录含凭据的变量名,不记录完整值
- 核对环境中出现的 IP 与域名归属
- 与进程启动脚本对照确认是否由脚本注入
- 把结论与时间点写入事件时间线