只读挂载与写保护
把设备或镜像置为只读,是分析开始前的第一道保护:读取动作本身会更新访问时间、写系统日志、改变内存状态,直接在原始介质上操作等于一边分析一边破坏证据。Linux 上常用两条手段叠加,blockdev --setro 在块设备层禁止写入,mount -o ro 在文件系统层只读挂载,镜像文件则配合 loop 与分区偏移使用。
基本信息
| 块设备层 | blockdev --setro /dev/sdb 禁写,blockdev --getro 查询状态 |
|---|---|
| 文件系统层 | mount -o ro,noexec,nodev,nosuid <设备> <目录> |
| 镜像挂载 | mount -o ro,loop,offset=<字节偏移> disk.img <目录> |
| 分区偏移 | 起始扇区乘以 512 得到字节数,fdisk -l 或 mmls 可取 |
| 前置动作 | 挂载前先对原始介质完整计算哈希并留记录 |
典型使用场景
- 现场分析前把证据盘设为只读,避免任何误写
- 按分区偏移只读挂载镜像,核对目录结构与文件时间
- 搭建可重复的分析环境,保证所有操作都能回退
- 反复读取同一介质时,避免触发文件系统自检或自动修复
- 交付前重新核验原始介质的只读状态与哈希
只读挂载
只读挂载
blockdev --getro /dev/sdb # 查询当前只读状态
blockdev --setro /dev/sdb # 块设备层禁写
fdisk -l /dev/sdb # 取分区起始扇区,换算成字节偏移
mount -o ro,loop,offset=$((2048*512)) disk.img /mnt/evidence # 只读挂载镜像中的分区
mount -o ro,noexec,nodev,nosuid /dev/sdb1 /mnt/evidence2 # 只读挂载物理分区
mount | grep /mnt/evidence # 确认挂载参数已按只读生效挂载选项读法
| 选项 | 作用 | 何时使用 |
|---|---|---|
| ro | 只读挂载 | 取证场景的默认选择 |
| loop | 把镜像文件当作块设备挂载 | 分析 dd 或其他工具导出的镜像 |
| noexec | 禁止在该文件系统上执行程序 | 防止误触发镜像中的样本 |
| nodev | 忽略设备文件 | 避免经由挂载点访问异常设备 |
| nosuid | 忽略 setuid 与 setgid 位 | 降低权限被意外提升的风险 |
E01 一类带校验的取证容器格式无法被 mount 直接识别,需先用专用工具转换成原始镜像或用工具映射为块设备,再按偏移只读挂载,转换产物要重新计算哈希并登记。
只读挂载不等于零写入:部分文件系统在挂载时会尝试重放日志或更新超级块,日志型文件系统尤其需要注意。处理这类镜像时优先使用取证专用挂载工具,必要时在副本上操作,并保留原始介质哈希以便事后比对。