为什么普通用户不能`chown`一个文件?

phl*_*leg 90 permissions not-root-user chown

为什么chown命令是 root-only?为什么非 root 用户不能使用 chown 来赠送他们拥有的文件?

Gil*_*il' 107

大多数unix系统禁止用户“赠送”文件,即用户只有chown拥有目标用户和组权限才能运行。由于使用chown需要拥有文件或成为 root(用户永远不能占用其他用户的文件),因此只有 root 才能运行chown将文件的所有者更改为另一个用户。

此限制的原因是,将文件赠送给其他用户可能会导致在不常见但仍然很重要的情况下发生坏事。例如:

  • 如果系统启用了磁盘配额,Alice 可以在只有她可以访问的目录下创建一个全局可写文件(因此其他人无法访问该全局可写文件),然后运行chown该文件以让另一个用户 Bill 拥有该文件。即使只有 Alice 可以使用该文件,该文件也将计入 Bill 的磁盘配额。
  • 如果 Alice 向 Bill 赠送了一个文件,则没有任何痕迹表明 Bill 没有创建该文件。如果文件包含非法或以其他方式妥协的数据,这可能是一个问题。
  • 某些程序要求其输入文件属于特定用户,以便对请求进行身份验证(例如,该文件包含一些程序将代表该用户执行的指令)。这通常不是一个安全的设计,因为即使 Bill 创建了一个包含语法正确指令的文件,他也可能不打算在这个特定时间执行它们。尽管如此,允许 Alice 创建一个包含任意内容的文件并将其作为 Bill 的输入只会让事情变得更糟。

  • @Patrick `chown` 总是清除 setuid 和 setgid 位。 (20认同)
  • 在之前的一份工作中,我建立了一个软件系统,它依赖于无法泄露文件。它使用文件所有权来验证请求是否由特定用户提交。它在安装过程中检查是否允许赠送文件,如果允许则拒绝继续。 (4认同)
  • 另一个更关键的问题是用户可以复制`/bin/bash`,设置uid,然后`chown` 给他们想要的任何人。现在他们可以作为那个人访问 shell。 (3认同)

小智 17

在 Linux 上,您需要 CAP_CHOWN 功能来 chown。root 被授予这样的权限。 有关解释,请参阅: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。

  • 有时,您甚至不需要 CAP_CHOWN:https://unix.stackexchange.com/questions/399975/how-come-i-as-a-normal-user-am-able-to-change-ownership-of- a-file 从我对内核源代码的阅读来看,每个文件系统实现的任务都是检查 chown 的权限。并且似乎使用 NFS,在服务器端检查权限。如果服务器是......奇怪......那么有可能。 (2认同)

Dom*_*Dom 1

您可以启动该命令,但如果您不是 root,则该命令将不起作用。这很简单:想象一个可以将软件更改为 root 用户的用户。它可以添加 setuid 位,瞧\xc3\xa0,那家伙是 root!\n因此,用户可以使用 chmod 添加该位,但没有机会更改文件的所有者。

\n

  • 您不能在不属于您的文件上添加 setuid 位,并且允许放弃文件的实现会清除 setuid 位。 (12认同)