跳到主要内容

disk 组裸盘读写提权

id 输出中包含 disk 组时,/dev/sda*root:disk 660)对当前用户可读写。块设备访问绕过文件系统权限,文件本身设成 700/600 也挡不住,等价于对整盘任意读写。

仅限授权环境

裸盘写错偏移会直接损坏文件系统。仅在授权环境操作,写入前先读出目标扇区留备份,尽量采用等长字节替换。


判断前提

id
ls -la /dev/sda*

读任意文件

文件系统权限只约束路径访问,不约束块设备访问。解析 ext4 结构即可从裸盘定位文件数据:

superblock → inode 表 → extent 树 → 数据块

即使目标文件是 07000600,也能沿这条链路读出内容。


写任意文件

对 sudoers、doas 配置等目标做等长字节替换:定位文件在盘上的数据块,原位改写字节,不改变文件长度与布局。

修改 sudoers 时要理解 last-match 语义:后面的匹配规则覆盖前面,因此新增一行 NOPASSWD 规则即可生效;但必须保持语法正确,否则 sudo 会拒绝工作。


缓存一致性

直接写盘绕过的是磁盘视图,内核可能仍持有旧的页缓存,之后读取拿到的还是旧内容。写完后逐页失效缓存:

import os

os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED)

也可以等缓存自然回收。以 O_DIRECT 方式写入可以减少缓存不一致。


组变更

组变更需要重新登录才生效。当 /etc/group 可写时,可以把自己加进 diskshadowsudo 等组,重新登录后获得对应能力。


审计清单

  1. id 中是否出现 disk 组,成员是否最小化。
  2. /dev/sd* 权限是否保持 root:disk 660
  3. /etc/group 是否存在非预期可写。
  4. sudoers 与 doas 配置是否有异常新增规则。

防御建议

  1. disk 组只授予真正需要裸盘访问的用户。
  2. 使用 LUKS 全盘加密,提高裸盘读写利用门槛。
  3. 监控块设备打开行为。
  4. 对 sudoers 与 doas 配置做哈希监控,发现变更立即告警。