不久前,我了解到这曾经有一种方法可以半永久地禁用甚至 root 修改不可变和仅追加标志 ( lcap CAP_LINUX_IMMUTABLE
) 或执行原始读/写操作 ( lcap CAP_SYS_RAWIO
) 的能力。我想尝试一下,但由于系统范围的功能边界集已被删除,我修补了 Linux 内核,使得需要任一功能的命令始终被拒绝。因此,我认为这种方法作为dd
绕过和禁用这些限制的方法将变得毫无用处,因为lcap CAP_SYS_RAWIO
“不允许 root 写入原始磁盘或原始内存”。
为了查看我的修改是否成功,我运行了sudo dd if=/dev/sda of=mbr.img bs=512 count=1
。操作成功了,所以我假设这是允许的,因为这只是一个读取操作。因此,我运行了sudo dd if=/dev/null of=/dev/sda bs=512 count=1
,但令我沮丧的是,这也成功了。我检查了是否错过了CAP_SYS_RAWIO
Linux 内核中的任何代码测试,发现我错过了,根据需要对其进行了修改,重建了它,重新安装了它,然后再次尝试。再一次,sudo dd if=/dev/null of=/dev/sda bs=512 count=1
成功了。
我现在很好奇,想知道这是否dd
不需要CAP_SYS_RAWIO
或者它是否不算作“原始 I/O”,以防我没有错过其他任何东西。
答案1
man 7 capabilities
列出了控制的内容CAP_SYS_RAWIO
,但读写块设备文件不是其中之一。 dd
它使用正常read
和write
系统调用来完成工作;它具有选择输入和输出缓冲区的大小以及在复制数据时转换数据的奇特功能,但它实际上并没有为 I/O 本身做任何特殊的事情。