为什么 root 可以写 /usr/sbin 中的可执行文件?

t1m*_*h33 31 linux root permissions files

您能否解释一下为什么二进制编译文件(例如,/usr/sbin)对root用户具有写权限?

对我来说,这是编译好的。这意味着直接写入没有用,并且可能以某种方式将文件暴露给某些安全问题。

脚本(例如bash文件)可能是可写的,因为它基本上是一个文本文件,但是据我所知,对于实际上不需要写入的已编译文件,为什么它是相同的?

提前感谢您的反馈。

Kus*_*nda 51

这并不重要,如果在文件/bin(或者可执行文件保存任何其他标准目录)是可写的根或没有。在我使用的 Linux 服务器上,它们可以被 root 写入,但在我的 OpenBSD 机器上,它们不是。

只要它们不是组或“其他”可写的!

没有安全问题,例如

-rwxr-xr-x 1 root root 126584 Feb 18  2016 /bin/ls
Run Code Online (Sandbox Code Playgroud)

如果有人想覆盖它,他们必须是 root,如果他们是root并覆盖它,那么他们要么是

  1. 安装新版本,或
  2. 笨拙,或
  3. 一个已经拥有 root 权限的攻击者。

另一件要考虑的事情是无论文件是否受写保护,root 都可以写入文件,因为... root。

还要注意,“脚本”与二进制文件一样是可执行文件。脚本不需要是可写的,“因为它是一个文本文件”。如果有的话,它可能应该与同一目录中的其他可执行文件具有相同的权限。

现在不要更改所有内容的权限!这可能会造成各种破坏,并可能混淆可能验证权限设置是否正确的包管理器。如果您不小心以错误的方式更改了安全关键应用程序的权限,它也可能使系统易受攻击。

假设对可执行文件的权限设置正确,除非您发现看起来奇怪的东西,在这种情况下,您可能应该联系相关的包维护人员进行验证而不是开始更改内容。


从评论和聊天中,有人呼吁了解一些历史。

Linux上二进制文件的权限历史我一无所知。可能有人猜测他们只是从目录中继承了权限,或者只是从umaskLinux的默认值中继承了权限,但我真的不知道。

我所知道的是,默认情况下,OpenBSD使用权限模式 555 ( )在基本系统1 中安装二进制文件-r-xr-xr-x。这是在 Makefile 片段中指定的,/usr/share/mk/bsd.own.mk其中设置BINMODE为 555(除非它已经设置)。这稍后在make buildin期间安装可执行文件时使用/usr/src

我查看了此文件的带注释的 CVS 日志,发现文件中的这一行自 1995 年从 NetBSD 导入以来没有改变。

在 NetBSD 上,该文件于 1993 年首次放入 CVSBINMODE设置为 555。

FreeBSD 项目似乎至少从 1994 年起就使用了与 NetBSD 完全相同的文件,并且随着后来的提交在提交消息中添加了一个提示,即旧文件来自伯克利软件分发的 4.4BSD 版本。

除此之外,伯克利的 CSRG将源代码保存在SCCS 中,但他们的存储库在 GitHub 2上以 Git 形式提供。我们在此提供法医治疗的文件似乎是Keith Bostic(或与他关系密切的人)在 1990 年提交的。

所以这就是那个故事。如果你想知道为什么,那么我想我们得问基思了。我有点希望看到一条更改的提交消息,说“这需要 555 因为...... ”,但没有。

1 BSD 系统对“基本系统”和“第 3 方包”(端口/包)的划分比 Linux 更严格。基础系统是一个连贯的单元,它提供了一套完整的操作系统运行工具,而端口或包被视为“本地软件”并安装在/usr/local.

2 ,从上世纪70个年代的Unix版本的更全面的GitHub仓库起可得

  • +1 表示“现在不要更改所有内容的权限!” 我在 Ask Ubuntu 上看到了很多这样的问题,用户在哪里在 `/usr` 或 `/var` 上执行了 `chmod -R`,并且惊讶 - 他们的 `sudo` 不起作用或其他东西不起作用。 (9认同)
  • 从历史上看,没有 root 的写权限不会有任何影响(root 可以修改任何东西,甚至不需要,因为 root 永远不会在打开或写入时获得 EPERM)。我想知道这 555 个东西是否开始是因为它实际上已经成为可能限制 root 的(securelevels 什么时候第一次出现?大约与 4.4BSD 或早期的 386BSD/NetBSD 同时出现?) (4认同)