普通用户为什么不能“拥有”文件?


75

为什么chown命令仅是root用户?为什么非root用户不能使用chown放弃他们拥有的文件?


无法理解您的问题chown命令也可以由非root用户使用
harish.venkat 2011年

也许我说错了。好吧,我的教授的确切问题是:“为什么在UNIX系统中不允许从普通用户转移权限?” ...
phleg 2011年

19
我认为真正的问题是:为什么非root用户不能使用chown放弃他们拥有的文件。(我看过一些系统,根据文件系统配置,可以。)
Keith Thompson

Answers:


96

大多数UNIX系统会阻止用户“放弃”文件,也就是说,只有chown拥有目标用户和组特权的用户才能运行。由于使用chown需要拥有该文件或具有root用户权限(用户永远不能使用其他用户的文件),因此只有root用户才能运行chown以将文件所有者更改为另一个用户。

进行此限制的原因是,将文件赠送给另一个用户可能会使不良情况在不常见但仍很重要的情况下发生。例如:

  • 如果系统启用了磁盘配额,则Alice可以在只能由她访问的目录下创建一个可写入世界的文件(因此,没有其他人可以访问该可写入世界的文件),然后运行chown该文件,以使另一个用户Bill拥有该文件。即使只有Alice可以使用该文件,该文件也将计入Bill的磁盘配额之内。
  • 如果Alice向Bill提供了一个文件,则不会发现Bill没有创建该文件的痕迹。如果文件包含非法或其他危害数据,则可能会出现问题。
  • 某些程序要求其输入文件属于特定用户才能认证请求(例如,文件包含一些程序将代表该用户执行的指令)。这通常不是安全的设计,因为即使Bill创建了一个包含语法正确的指令的文件,他可能也没有打算在此特定时间执行它们。但是,允许Alice创建具有任意内容的文件并将其用作Bill的输入只会使情况变得更糟。

3
在上一份工作中,我建立了一个软件系统,该软件系统取决于无法放弃文件。它使用文件所有权来验证特定用户是否已提交请求。它在安装过程中检查了是否允许提供文件,如果允许,则拒绝继续。
基思·汤普森

2
另一个更为关键的问题是,用户可以将/bin/bash其复制,设置为uid,然后将chown其复制到所需的任何人。现在,他们像那个人一样具有shell访问权限。
帕特里克

18
@Patrick chown总是清除setuid和setgid位。
吉尔斯2013年

1
@Gilles并有很好的理由...如果您可以在某个地方复制一个shell二进制文件,则可以访问它,在其上设置setuid / gid位,然后将其chown为root(或以其任何顺序获得6755/0:0权限) / ownership),您可以在该系统上获得root用户。哦,确实错过了帕特里克的评论。
hanetzer 2014年

好的,但是如果我拥有drwxr-xr-x ring0 ring0 .根目录有常规文件(-rw-r--r-- root root file)的目录(),为什么我不能这样做,chown ring0 file因为无论如何它都可以作为ring0cp file x ; rm file ; mv x file(和一些可选的touch sometime file...)?
环Ø

15

在Linux上,您需要使用CAP_CHOWN功能。根被授予这样。请参阅:http : //vouters.dyndns.org/tima/Linux-OpenVMS-C-Implementing_chown.html 以获得解释。如果您打算提供CAP_CHOWN功能,请使用libcap-ng或libcap来构建代码,如以下示例所示:http : //vouters.dyndns.org/tima/Linux-PAM-C-Pluggable_Authentication_Modules_programming_example.html您必须在其中简单替换CAP_AUDIT_WRITE与CAP_CHOWN。


1
为您+1不必是root。因为您不必再​​根了。
ctrl-alt-delor

1
有时,您甚至不需要CAP_CHOWN:unix.stackexchange.com/questions/399975/…从我阅读的内核源代码中,每个文件系统实现都负责检查chown的权限。看来,使用NFS,权限是在服务器端检查的。而且如果服务器是...奇怪...则有可能。
Mike S

0

您可以启动该命令,但是如果您不是root用户,则该命令将不起作用。这很容易:想象一个可以将软件更改为root用户的用户。它可以添加setuid位,伙计是root!因此,使用可以在chmod中添加该位,但是没有机会更改文件的所有者。


12
您不能在您不拥有的文件上添加setuid位,并且允许放弃文件的实现会清除setuid位。
Gilles

我认为Dom的答案是:想像一下。那就麻烦了。你的观点是正确的。但是OP问“为什么?” 清除setuid位是另一个安全功能,它再次引起问题“为什么?”。然后我将参考Dom的答案:如果用户可以穿衣服,如果用户可以setuid,那么该组合将是灾难性的。我认为他即使没有一点点也可以说是对的。
Mike S
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.