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


255

这是关于文件许可权以及777 为什么具有“破坏性” 的典型问题

我没有问如何解决此问题,因为在Server Fault(重新安装OS)上已经有大量的参考文献。为什么它会做些破坏性的事情?

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


2
看到这个问题,我屏住呼吸。
Alireza Savand

Answers:


344

首先,使用次要术语nitpick:chmod不会删除权限。它CHANGES他们。


现在问题的关键了-该模式的777意思是“任何人都可以读取,写入或执行该文件”-您已授予任何人(有效地)执行其想要的任何操作的权限

现在,为什么这样不好?

  1. 您只需让每个人都可以读取/修改系统上的每个文件。
    • 亲吻密码安全再见(任何人都可以读取影子文件并破解您的密码,但是为什么要打扰呢?只需更改密码!就容易多了!)。
    • 亲吻安全性,告别您的二进制文件(某人可以编写一个新login程序,让它们每次都运行)。
    • 吻你的文件再见:一位用户错误定向rm -r /,一切都结束了。操作系统被告知让他们做他们想做的事!
  2. 您已经对每个在启动之前检查文件权限的程序都感到恼火。
    sudosendmail和,其他许多都将不再启动。他们将检查关键文件的权限,查看它们是否不应该是应有的权限,然后回显错误消息。
    同样,它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系统上更是一个问题,在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
至少在某些系统/tmp上,重启后会被修复。尽管所有其他事情似乎都坏了。至少在我刚刚测试过的VM中,它似乎重新启动了固定的/tmp权限。启动脚本中的某处必须有某些内容。
Zoredache

@Zoredache系统tmpfs通常会自行修复,在磁盘上具有/ tmp的系统可能会(取决于其启动脚本)
voretaq7 2012年

45
+1指出setuid和setgid将被消除。这是一个极大的破坏性方面。尝试运行find / -perms -4000 -type ffind / -perms -2000 -type f查看依赖于这些标志的各种二进制文件。
凯尔·史密斯

2
键入“ less foo.txt”之类的内容将不会执行一个名为less.txt的文件,而不管是否设置了可执行位。您将需要在路径中包含目录less.txt,并且必须输入“ less.txt foo.txt”-并不是真正的意外情况。即使您使用的是Shell补全功能,它也会停在更少的时间,并且您仍然必须添加.txt。要调用具有可执行位设置的随机文本文件,您必须输入./nameoffile.txt。
真实的法案

3
@Deji everyone被定义为一组,包括谁拥有的文件,用户拥有该文件的组中,和用户谁不符合任何这些标准的用户工会(字面意思是三个八进制数字权限:UserGroup,和Other)。换句话说,任何有权访问系统的用户。(在这种情况下,“访问”可以是一个shell帐户,这是我通常要解决的问题,但是它还包括通过将数据写入磁盘的Web表单/ CGI进行的访问:www用户现在可以写入系统上的任何文件,这也意味着随机访问者也可以。)
voretaq7

102

一个主要的事情是,有许多工具(例如ssh / sudo)检查密钥配置文件的文件系统权限。如果权限错误,则这些工具将设计为失败,因为这将指示严重的安全问题。在我的Debian测试系统上,也许在其他系统上,登录功能失败,可能是因为登录二进制文件或PAM中的某些内容具有权限检查。

因此,并不是真的系统被破坏了,而是许多工具被设计为在权限错误时立即失败。

如果执行完此操作后重新引导系统chmod 777 -R /,它将引导,并且可以启动没有显式权限检查的进程。因此,该系统并没有真正失效,只是某种程度上无法使用的设计

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.