maps 映射段
/proc/<pid>/maps 列出进程当前的全部内存映射,每行含地址范围、权限位、偏移、设备、inode 与文件路径。注入类载荷常表现为可读写可执行(rwx)的匿名段、从 /tmp 或 /dev/shm 映射的可执行文件,或路径带 (deleted) 标记的已删除共享库。
基本信息
| 适用平台 | Linux |
|---|---|
| 路径 | /proc/<pid>/maps,同目录有 smaps、smaps_rollup |
| 行格式 | 地址 权限 偏移 设备 inode 路径 |
| 权限位 | r/w/x 加 p(私有)或 s(共享) |
| 可疑特征 | rwx 段、/tmp/ 与 /dev/shm/ 下的映射、无路径的大段匿名映射 |
| 补充数据 | /proc/<pid>/smaps 提供每段大小与常驻内存 |
典型使用场景
- 确认进程是否加载了发行版之外的共享库
- 排查内存注入与无文件(fileless)载荷
- 对比同一程序在多台主机上的映射差异
- 找出占用虚拟内存最多的映射段
- 与 lsmod、proc net 联动形成完整进程画像
最小示例
最小示例
PID=1234
awk '{print $2, $6}' /proc/$PID/maps | sort | uniq -c | sort -rn | head # 统计权限位与来源
cat /proc/$PID/maps | grep -E 'rwx|/tmp/|/dev/shm/' # 只挑高风险行
cat /proc/$PID/maps | grep '(deleted)' # 已删除仍被映射的文件
ls -l /proc/$PID/map_files/ 2>/dev/null | head # 需权限与内核支持
cat /proc/$PID/smaps_rollup 2>/dev/null | head -12 # 总体内存占用概览
ss -tanp | grep "pid=$PID" # 结合连接判断进程用途输出逐列读法
| 列 | 含义 | 异常信号 |
|---|---|---|
| 地址范围 | 该映射占用的虚拟地址区间 | 孤立的超大匿名 rwx 段 |
| 权限 | rwxp 组合,p 为私有 | 同一段同时可写可执行且无来源 |
| 偏移 | 映射在文件中的起始偏移 | 非 0 偏移的常见库文件 |
| 设备/inode | 所属文件系统标识 | 设备号为 0 说明匿名映射 |
| 路径 | 被映射文件的全名 | (deleted)、/tmp、/dev/shm 下的可执行文件 |
smaps 给出每段的 Size、Rss 与 Pss,判断一段匿名内存是否真为载荷,比只读 maps 的地址范围更可靠。
在业务主机上直接 dump 进程内存会影响业务与安全软件运行;优先只读查看并把范围、时刻、命令写入采集记录。
Java、Node 与浏览器等使用 JIT 的进程天然存在 rwx 段,判断时要结合进程来源、可执行文件哈希与网络行为,不能只看权限位。