/usr/bin/passwd и возможность CAP_CHOWN

Я экспериментировал с возможностями Linux и заметил, что для того, чтобы программа passwd работала, не будучи корнем Set-UID, она должна иметь возможность CAP_CHOWN (в дополнение к некоторым другим). По логике вещей, зачем вообще нужен CAP_CHOWN?

Между прочим, passwd выдает мне «ошибку манипулирования токеном», если я удаляю эту возможность.

Редактировать: я использую Ubuntu 11.04 без SELinux. Я пытаюсь заставить passwd работать, не будучи корнем Set-UID.


person Apoorva Iyer    schedule 21.10.2011    source источник


Ответы (2)


cap_chown не требуется для самого passwd. Нужно только изменить файл /etc/shadow, связанный с файлом userID. Файл /etc/shadow настроен таким образом, что его не может прочитать кто угодно.

/etc/shadow доступен только для root. Поэтому, когда /etc/passwd завершит работу модуля аутентификации и будет готов записать новый (закодированный) пароль, он создаст токен. К которому обращается служба Linux-PAM, которая отправляет его на 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;
}
person Lelouch Lamperouge    schedule 21.10.2011
comment
Не могли бы вы прояснить некоторые вещи, которые вы написали? Я не понимаю, что вы написали после того, как /etc/shadow доступен только для root - person Apoorva Iyer; 21.10.2011

setuid — это все, что было нужно изначально.

Добавления SELinux (Security Enhanced) требуют, чтобы контекст программы был правильный, а также проверки прав доступа к файлам.

Если системная функция SE отключена, passwd будет нормально работать без CAP_.... Где-то читал, что SE можно отключить, написав "1" в /selinux/disable. Предположительно запись «0» снова включает его.

См. описание АНБ или Fedora.

person wallyk    schedule 21.10.2011
comment
Я использую Убунту 11.04. У него нет SELinux. Кроме того, цель здесь в том, что я не хочу удалять бит setuid и просто применяю возможности к passwd. (Уменьшение проблемы сверхпривилегированных двоичных файлов) - person Apoorva Iyer; 21.10.2011