3

我正在试验 Linux 功能,我注意到要使passwd程序在没有 Set-UID root 的情况下工作,它需要具有CAP_CHOWN功能(除了其他一些功能)。从逻辑上讲,为什么它需要CAP_CHOWN呢?

顺便说一句,如果我删除该功能,passwd 会给我一个“令牌操作错误”。

编辑:我使用的是没有 SELinux 的 Ubuntu 11.04。我试图在passwd没有 Set-UID root 的情况下开始工作。

4

2 回答 2

2

本身cap_chown不需要。passwd只需更改与userID. /etc/shadow 文件被设置为不能被任何人读取。

/etc/shadow 只能由 root 访问。因此,当 /etc/passwd 完成它的身份验证模块并准备写入新的(编码的)密码时,它将创建一个令牌。它由 Linux-PAM 服务访问,该服务会将其 chown 为 root 并将其写入 /etc/shadow。

编辑:

passwd 使用文件 /etc/.pwd.lock、/etc/shadow 和 /etc/nshadow。由于 passwd 从 /etc 目录读取和写入,因此它需要 w 权限。请注意,/etc/shadow 永远不会由 passwd 写入。passwd 实际上写入 /etc/nshadow 并将 /etc/nshadow 重命名为 /etc/shadow。

open('/etc/nshadow',O_WRONLY|O_CREAT)=fd1
open('/etc/shadow', O_RDONLY)=fd2
fchown(fd1, uid=root, gid=shadow)
chmod /etc/shadow to : rw by owner and r by group
read(fd2)
write(fd1)
rename("/etc/nshadow", "/etc/shadow")

此外,我确认了/etc/nshadow使用这个 C 程序的存在。供参考,

#include<stdio.h>
#include<unistd.h>
int main()
{
while(1)
if (access("/etc/nshadow",F_OK)!=-1){
    printf("Exists\n");
    break;
    }
return 0;
}
于 2011-10-21T13:10:12.060 回答
0

setuid就是最初需要的一切。

SELinux安全增强)的添加要求程序上下文正确以及文件权限检查。

如果系统的 SE 功能被禁用,passwd没有任何CAP_.... 在某处我读到 SE 可以通过将“1”写入/selinux/disable. 大概写“0”会重新启用它。

请参阅NSA 的描述Fedora 的.

于 2011-10-21T05:47:56.077 回答