Wiem, że włączenie setuid w skryptach ma problemy z bezpieczeństwem i dlatego jest domyślnie nieaktywne, ale spodziewam się, że zadziała dla plików wykonywalnych. Stworzyłem i wykonuję, który pokazuje UID jako wynik, postępując zgodnie z instrukcjami opisanymi w tym poście: Zezwalaj na setuid w skryptach powłoki
Ale zwraca ten sam identyfikator użytkownika (1000) zarówno przed uruchomieniem, jak i po nim sudo chmod +s ./setuid-test
. Myślę, że to oznacza, że setuid nie ma żadnego wpływu na mój plik wykonywalny, dlaczego i jak rozwiązać?
Kod źródłowy:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
printf("%d", geteuid());
return 0;
}
Zbudowany i działający z
$ gcc -o setuid-test setuid-test.c
$ ./setuid-test
1000
$ sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
$ ./setuid-test
1000
Po uruchomieniu ls -la
otrzymuję:
me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
permissions
executable
setuid
PHP Learner
źródło
źródło
me@me:~$ ls -la setuid-test
---- zwraca -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
df .
katalog, aby znaleźć punkt podłączeniamount | grep nameofmountpoint
. Czy jest tamnosuid
wymieniona flaga?Odpowiedzi:
Większość systemów plików zaprojektowanych dla Uniksa / Linuksa można zamontować z
nosuid
atrybutem, który zapobiegnie zmianie binariów setuid lub setgid znajdujących się w tych systemach plików na efektywny identyfikator UID lub gid procesu. Jest często używany podczas montowania „niezaufanych” systemów plików, które są pod kontrolą nie-administratora.W twoim przypadku używany system plików to ecryptfs, który według askubuntu: Błąd podczas uruchamiania pliku binarnego z root setuid w zaszyfrowanym katalogu domowym automatycznie wymusza nosuid (i nodev), zaczynając od wersji sprzed kilku lat.
Oto opis przyczyny zmiany, z https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409 :
źródło
chown root
,chmod +s
3) zamontuj go 4) uruchom plik wykonywalnyBit SetUID w pliku wykonywalnym pozwala na uruchomienie pliku wykonywalnego u właściciela pliku (nie superużytkownika). Aby móc uruchomić plik wykonywalny jako root, wykonaj:
źródło
setuid-test
powinien być wyświetlanynobody
identyfikator UID.nobody
, a nieroot
nobody
, więc oczekuję65534
w zamian, ale widzę,1000
kto jest właścicielem!nosuid
, twój program prawdopodobnie nie będzie mógł działać.mount | grep /home/me
powraca/home/me/.Private on /home/me type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=xxx,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=0123456789abcdef,ecryptfs_fnek_sig=fedcba9876543210)