来自 chown(2):
只有特权进程(Linux:具有 CAP_CHOWN 功能的进程)才可以更改文件的所有者。文件所有者可以将文件的组更改为其所属的任何组。特权进程(Linux:具有 CAP_CHOWN 功能的进程)可以任意更改组。
此限制的原因是什么?为什么非特权用户无法更改其拥有的文件的所有权(即没有 /etc/shadow)?
$ touch blah
$ chown root:root blah
chown: changing ownership of `blah': Operation not permitted
答案1
通过允许用户“赠送”文件,您会与操作系统的各种功能发生冲突。例如:
Taking up another user's disk quota.
Impersonating another user (or even root) via setuid.
Having insufficient privileges to undo a mistaken chown.
Making it appear that someone else had created a given file.
Setting up cron jobs to run on other user's accounts.
And many more...
答案2
这只是 Linux 设计者的个人选择,不允许这样做——都是出于伪安全原因,给定,是似是而非的,因为有些 unix 系统允许这样做。
我认为此功能取决于您的 unix 行为是否遵循“System-V”(AT&T)或 Berkeley 的 unix(BSD)...
至于提到的其他安全问题:
通过 setuid 模拟另一个用户 (甚至是 root)。
非问题:更改“所有者”会清除任何“setXid”位(U/G)
没有足够的权限来撤销错误的 chown
这并不是真正的“安全风险”,但是,它可能存在于允许更改用户的系统上,如果它在您拥有的目录中,您可以将其改回来,否则:“小心”!
使其看起来像是其他人创建了给定的文件。
它仍将位于您可写入的目录中。即,您无法将其移动到他们的主目录中,除非他们将其打开以供您的组或所有人(或您本人,如果 ACL 可用)写入。
设置 cron 作业在其他用户的帐户上运行。
再次,不会工作 - 因为 crondirs 归用户所有,并且没有设置为可读其他用户无法访问,更不用说写入了。
如果任何人都可以更改所有权,那么任何人都可以更改权限以访问系统上的任何文件。
不行:只有当用户“拥有”包含该文件的目录时才行。例如,我可以将一个名为“passwd”的文件提供给 root,但除非我对 /etc/ 有写权限,否则我无法将其移动到 /etc/。
配额
一个可能有效的观点——如果您使用配额,但如果您按主目录汇总磁盘空间,似乎很容易检测到;唯一的问题可能是在可由多个用户写入的目录中。在这种情况下,也许可以通过该“目录”的所有者进行。它可能在支持“赠送”文件的系统上,您只能在您“拥有”的目录中执行此操作,但我已经很长时间没有使用允许这样做的系统了,所以我不记得确切的限制。
我似乎记得允许“赠送文件”存在一些“权衡”...例如 - 在允许这样做的系统上,Linux 允许的其他一些事情是不允许的,但不记得那是什么了...
我想说,上面的“答案”应该取消标记为答案,因为它不是真正的答案。这更像是一个设计决策——我只是不知道权衡是什么。
可能存在一些上面未提到的安全问题,这些问题是合理的,但上述问题并不合理。
在我看来,它应该是“/proc”中系统可设置的“值”,但一般来说,我认为大多数人并不太在意。
如果有强烈的需求,可以增强“chown”的安全性并进行修改以允许它,然后设置 w/setuid“root”以使其能够实施这样的策略。
答案3
好吧,如果任何人都可以更改所有权,那么任何人都可以更改权限以获取对系统上任何文件的访问权限。这不仅从恶意软件的角度来看很糟糕(不需要 sudo),而且从系统管理员的角度来看也是如此。如果任何用户可以更改任何文件,那么文件权限就毫无用处了。
答案4
因为这样用户就可以规避文件系统配额。如果我有 100MB 的配额,你也有 100MB,那么我可以上传 100MB,chmod a+r,chown you,然后再上传 100MB。