我正在尝试以非 root 用户身份更改密码:
passwd
数据在 /etc/shadow 中更新,但检查我获得的权限:
---------- 1 root root 6076 Jan 27 17:14 /etc/shadow
cat /etc/shadow
cat: /etc/shadow: Permission denied
显然,即使 passwd 命令成功,任何人都没有该文件的权限,并且我间接将数据更新到非特权资源(影子文件)!那么谁能解释一下后台更新的机制?参考系统调用的解释将非常有用。
答案1
该passwd
实用程序已安装setuid
,这意味着当它运行时,它会运行作为拥有该文件的用户,而不是调用它的用户。在本例中,passwd
属于root
,因此该setuid
位会导致程序以 root 权限运行。因此它能够对passwd
和shadow
文件进行更改。
如果您查看该实用程序的权限passwd
,您将看到如下内容:
-r-sr-xr-x 2 root wheel 8.2K 19 Jan 17:24 /usr/bin/passwd
这是来自我的 FreeBSD 系统 - 您看到的内容取决于您使用的操作系统。s
所有者执行位置(第 4 列)中的 表示该位setuid
。
为了进一步参考,系统调用是setuid
,并且是标准 C 库的一部分。