为什么“chmod -R 777 /”具有破坏性?

sam*_*ise 265 linux permissions chmod

这是一个关于文件权限的规范问题,以及为什么777 是“破坏性的”。

我不是在问如何解决这个问题,因为服务器故障(重新安装操作系统)上已经有大量的参考资料。为什么它会做任何破坏性的事情?

如果你曾经运行过这个命令,你几乎会立即破坏你的操作系统。我不清楚为什么取消限制会对现有流程产生任何影响。例如,如果我没有对某些内容的读取访问权限,并且在终端中快速输入错误后,我现在突然可以正常访问...为什么这会导致 Linux 崩溃?

vor*_*aq7 354

首先是一个小术语吹毛求疵:chmod删除权限。它CHANGES他们。


现在是问题的核心——模式777意味着“任何人都可以读、写或执行这个文件”——你已经允许任何人(有效地)做他们想做的任何事情。

现在,为什么这很糟糕?

  1. 您只是让每个人阅读/修改系统上的每个文件。
    • 告别密码安全(任何人都可以阅读影子文件并破解您的密码,但何必呢?只需更改密码即可!简单多了!)。
    • 告别二进制文件的安全性(有人可以编写一个新login程序,让它们每次都进入)。
    • 告别您的文件:一位用户误导rm -r /,一切都结束了。操作系统被告知让他们为所欲为!
  2. 您已经惹恼了每个在启动前检查文件权限的程序。
    sudo, sendmail, 和许多其他人根本不会再开始。他们将检查密钥文件的权限,看看它们不是它们应该的样子,然后返回一条错误消息。
    同样ssh会严重破坏(密钥文件必须具有特定权限,否则它们是“不安全的”,默认情况下 SSH 将拒绝使用它们。)
  3. 您已经清除了具有它们的程序上的 setuid / setgid 位。
    模式777实际上是. 该前导数字中的内容包括和位。 大多数设置为 setuid/setgid 的程序都设置了该位,因为它们必须以特定权限运行。他们现在坏了。0777setuidsetgid
  4. 你已经坏了/tmp/var/tmp 在那个被归零的前导八进制数字中的另一件事是sticky bit——保护/tmp(和/var/tmp)中的文件不被不拥有它们的人删除。
    有(不幸的是)有很多行为不良的脚本通过执行 来“清理” rm -r /tmp/*,如果没有设置粘性位,/tmp 您可以吻别该目录中的所有文件。
    暂存文件消失真的会让一些写得很糟糕的程序感到不安......
  5. 你在/dev /proc类似的文件系统中造成了严重破坏
    这在旧的 Unix 系统上更像/dev是一个真正的文件系统,它包含的东西是用mknod.更改设备权限可能会导致重大问题,从明显的安全风险(每个人都可以阅读每个 TTY)到不太明显的内核崩溃的潜在原因。
    Credit to @Tonny for pointing out this possibility
  6. 套接字和管道可能会中断,或有其他问题 套接字和管道可能会完全中断,或者由于被设置为可全局写入而暴露于恶意注入。
    Credit to @Tonny for pointing out this possibility
  7. 您已经使系统上的每个文件都可以执行
    许多人.在他们的PATH环境变量中都有(您不应该!) - 这可能会导致令人不快的惊喜,因为现在任何人都可以删除一个像命令一样方便地命名的文件(例如makels,和尝试让您运行他们的恶意代码。
    Credit to @RichHomolka for pointing out this possibility
  8. 在某些系统chmod上将重置访问控制列表 (ACL)
    这意味着除了在各处修复权限外,您可能还必须重新创建所有 ACL(这是该命令具有破坏性的实际示例)。
    Credit to @JamesYoungman for pointing out this possibility

系统中已经运行的部分会继续运行吗?可能,至少有一段时间。
但是下次您需要启动程序,或重新启动服务时,或者天堂禁止重新启动您所在的盒子时会受到伤害,因为上面的#2 和#3 会抬起它们丑陋的脑袋。

  • +1 指出 setuid 和 setgid 将被消除。这是一个极具破坏性的方面。尝试运行 `find / -perms -4000 -type f` 和 `find / -perms -2000 -type f` 来查看依赖这些标志的各种二进制文件。 (46认同)
  • 键入“less foo.txt”之类的内容不会执行一个名为 less.txt 的文件,无论是否设置了可执行位。您需要将目录less.txt 放在您的路径中,并且您必须键入“less.txt foo.txt”——这不是一个偶然的事情。即使您使用 shell 补全,它也会停止,您仍然需要添加 .txt。要调用具有可执行位设置的随机文本文件,您必须使用 ./namefile.txt。 (3认同)
  • @Deji `everyone` 定义为集合的并集,包括拥有该文件的用户、拥有该文件的组中的用户以及不符合其中任何一个条件的用户(字面意思是三个八进制权限数字:`User` 、`组`和`其他`)。换句话说*任何可以访问系统的用户*。(在这种情况下,“访问”可能是一个 shell 帐户,这是我通常处理它的方式,但它还包括通过 Web 表单/CGI 将数据写入磁盘的访问:`www` 用户现在可以写入任何文件在系统上,这意味着随机访问者也可以。) (3认同)

Zor*_*che 102

一件主要的事情是有许多工具,例如 ssh/sudo,可以检查关键配置文件的文件系统权限。如果权限错误,这些工具就会失败,因为这表明存在严重的安全问题。在我的 Debian 测试系统上,也许在其他系统上,登录能力失败,可能是因为登录二进制文件或 PAM 中的某些内容进行了权限检查。

因此,实际上并不是系统被破坏了——而是许多工具被设计为在权限错误时立即失效。

如果在执行完之后重新启动系统,chmod 777 -R /它会启动,并且您可以启动没有明确权限检查的进程。所以系统并不是真的死了,只是设计上有点不可