cap_chown
не требуется для самого passwd
. Требуется только изменить файл / etc / shadow, связанный с userID
.
Файл / etc / shadow настроен так, что он не может быть прочитан никем.
/ etc / shadow доступен только пользователю root. Поэтому, когда / etc / passwd завершит работу своего модуля аутентификации и будет готов написать новый (закодированный) пароль, он создаст токен. К которому обращается сервис Linux-PAM, который преобразует его в root и записывает в /etc/shadow.
Edit:
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
с помощью этой программы на Си. FYI,
#include<stdio.h>
#include<unistd.h>
int main()
{
while(1)
if (access("/etc/nshadow",F_OK)!=-1){
printf("Exists\n");
break;
}
return 0;
}