为什么 chown 会重置/删除 SUID 位和重置功能?

为什么 chown 会重置/删除 SUID 位和重置功能?

这个命令:

sudo chown -R root:root directory

将删除 SUID 位并重置所有功能文件。我想知道为什么它是默默完成的,并且在手册页中没有提及。奇怪的是 GUID 位没有被删除。在运行此命令之前文件或目录属于谁并不重要。

SUID/GUID 位也是不是删除了目录(认为​​它们在这种情况下毫无用处)。

大概这是以安全的名义进行的,但对我来说,这绝不能悄无声息地进行。

这变得更糟:

$ setcap cap_sys_rawio,cap_sys_nice=+ep test
$ getcap -v test 
test cap_sys_rawio,cap_sys_nice=ep

$ chown -c -v -R 0:0 .
ownership of './test' retained as root:root
ownership of '.' retained as root:root

$  getcap -v test 
test

文件的 SUID 位test将被完全默默地删除。就好像该命令所做的事情比要求的要多得多。

答案1

权限和功能集不会由chown实用程序清除,而是由系统chown调用(在 Linux 上):

当非特权用户更改可执行文件的所有者或组时,S_ISUIDS_ISGID模式位将被清除。 POSIX 没有指定当 root 执行chown();时是否也应该发生这种情况Linux 的行为取决于内核版本,从 Linux 2.2.13 开始,root 的待遇与其他用户一样。如果是非组可执行文件(即S_IXGRP未设置该位的文件),则该S_ISGID位指示强制锁定,并且不会被chown().

当可执行文件的所有者或组更改(由任何用户)时,该文件的所有功能集都将被清除。

正如上面提到的,这部分是由 POSIX 指定:

除非乔恩由具有适当权限的进程调用,常规文件的 set-user-ID 和 set-group-ID 位应在成功完成后清除;其他文件类型的 set-user-ID 和 set-group-ID 位可能会被清除。

如果要通知用户这一点,chown实用程序在调用该函数时必须显式检查对文件元数据所做的进一步更改chown

就基本原理而言,我怀疑这是为了减少系统管理员陷入困境的可能性——chown root:root在 Linux 上可以被认为是安全的,即使用户提前准备了 setuid 二进制文件。

GNUchown手册页没有提到这种行为,但正如 GNU 软件的常见情况一样,手册页仅部分记录了该实用程序;它是“也可以看看”节指向系统调用文档(这对于大多数用户来说无疑是矫枉过正)和信息页面,它确实描述了这种行为:

chown命令有时会清除 set-user-ID 或 set-group-ID 权限位。此行为取决于底层chown系统调用的策略和功能,这可能会使系统相关的文件模式修改超出命令的控制范围chown。例如,chown当由具有适当权限的用户调用时,或者当这些位表示除可执行许可之外的某些功能(例如,强制锁定)时,该命令可能不会影响这些位。如有疑问,请检查底层系统行为。

(我根据您在问题上的标签将其限制为 Linux;由于 Linux 限制对特权进程的所有者更改,因此与其他一些 Unix 风格的系统相比,安全隐患更少。请参阅chown(1) POSIX 规范的解释了解详情。)

相关内容