disk 组裸盘读写提权
id 输出中包含 disk 组时,/dev/sda*(root:disk 660)对当前用户可读写。块设备访问绕过文件系统权限,文件本身设成 700/600 也挡不住,等价于对整盘任意读写。
仅限授权环境
裸盘写错偏移会直接损坏文件系统。仅在授权环境操作,写入前先读出目标扇区留备份,尽量采用等长字节替换。
判断前提
id
ls -la /dev/sda*
读任意文件
文件系统权限只约束路径访问,不约束块设备访问。解析 ext4 结构即可从裸盘定位文件数据:
superblock → inode 表 → extent 树 → 数据块
即使目标文件是 0700、0600,也能沿这条链路读出内容。
写任意文件
对 sudoers、doas 配置等目标做等长字节替换:定位文件在盘上的数据块,原位改写字节,不改变文件长度与布局。
修改 sudoers 时要理解 last-match 语义:后面的匹配规则覆盖前面,因此新增一行 NOPASSWD 规则即可生效;但必须保持语法正确,否则 sudo 会拒绝工作。
缓存一致性
直接写盘绕过的是磁盘视图,内核可能仍持有旧的页缓存,之后读取拿到的还是旧内容。写完后逐页失效缓存:
import os
os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED)
也可以等缓存自然回收。以 O_DIRECT 方式写入可以减少缓存不一致。
组变更
组变更需要重新登录才生效。当 /etc/group 可写时,可以把自己加进 disk、shadow、sudo 等组,重新登录后获得对应能力。
审计清单
id中是否出现 disk 组,成员是否最小化。/dev/sd*权限是否保持root:disk 660。/etc/group是否存在非预期可写。- sudoers 与 doas 配置是否有异常新增规则。
防御建议
- disk 组只授予真正需要裸盘访问的用户。
- 使用 LUKS 全盘加密,提高裸盘读写利用门槛。
- 监控块设备打开行为。
- 对 sudoers 与 doas 配置做哈希监控,发现变更立即告警。