超级用户可以写入只读文件吗?


11

我偶然发现了FreeBSD上令人惊讶的(对我而言)许可行为。假设我以非root用户身份运行。我创建一个文件,将其权限设置为只读,然后尝试写入该文件:

$ touch f
$ chmod 400 f
$ ls -l f
-r--------  1 user  wheel  f
$ echo a >> t
t: Permission denied.

到现在为止还挺好。现在,我执行与root相同的操作,并将其写入文件:

# ls -l f2
-r--------  1 root  wheel  f2
# echo a >> f2
# echo $?
0

它是错误还是预期的行为?我可以安全地认为这可以在任何Unix&Linux上使用吗?


的任何用户CAP_DAC_OVERRIDE都可以执行此操作。在几乎所有Linux系统上,这都意味着root可以执行此操作,因此这是故意的。不能说FreeBSD部分,但我想他们有类似的设置。
布拉奇利

1
root总是需要能够写入文件的原因是因为在传统的UNIX文件系统(ext4,zfs等)上,文件许可权是文件的一部分。因此,如果root无法写入文件,则NOBODY可以使只读文件再次写入,因为chmod无法写入该文件。
slebetman '16

1
@slebetman您无需具有对文件的写访问权限即可更新权限。只需touch somefile; chmod 0000 somefile; chmod 0644 somefile以普通用户身份尝试即可。
user253751 '16

@immibis:您拥有的。根目录需要能够更改其不拥有的文件的权限
slebetman

@slebetman是的...但是您谈论的是更改无法写入的文件的权限,而不是更改不拥有的文件的权限。
user253751 '16

Answers:


13

root能够以这种方式覆盖权限是正常的。

另一个示例是root能够读取没有读取访问权限的文件:

$ echo hello > tst
$ chmod 0 tst
$ ls -l tst
---------- 1 sweh sweh 6 Aug 16 15:46 tst
$ cat tst
cat: tst: Permission denied
$ sudo cat tst
hello

某些系统具有不可变文件的概念。例如在FreeBSD上:

# ls -l tst
-rw-r--r--  1 sweh  sweh  6 Aug 16 15:50 tst
# chflags simmutable tst
# echo there >> tst
tst: Operation not permitted.

现在甚至root无法写入文件。但是,当然root可以删除该标志:

# chflags nosimmutable tst
# echo there >> tst
# cat tst
hello
there

使用FreeBSD,您可以走得更远,并设置内核标志以防止root删除该标志:

# chflags simmutable tst
# sysctl kern.securelevel=1
kern.securelevel: -1 -> 1
# chflags nosimmutable tst
chflags: tst: Operation not permitted

现在没有人,甚至没有人root可以更改此文件。

(系统需要重新启动以降低安全级别)。


如何要求重新启动是有效的安全措施?另外,如果root是root,并且可以执行任何操作,那为什么还要费力地阻止root做root想要的事情?

1
在一个安全的系统上,根不是上帝般的。FreeBSD securelevel是使root失去上帝般的小尝试。可以在系统配置中将Securelevel设置为默认值1,这样即使重新引导后它仍保持活动状态。因此,这需要控制台访问权限和单用户模式,这非常明显。关于Unix安全,有整篇文章对SE注释字段来说太过分了,但是我们正在尝试从“ root has all access”(根目录拥有所有访问权)模型继续发展到更细微的差别。我们尝试在可能的地方(例如安全级别)执行,并在不可行的地方(重新启动证据,审计跟踪)进行检测。
史蒂芬·哈里斯

4
FWIW,在Linux中chattr +i tst设置不可变属性。
罗斯兰

3

是的,这很正常。root是没有限制的(几乎没有例外),因为他是root。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.