Dlaczego setuid nie działa na pliku wykonywalnym?

9

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 -laotrzymuję:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP Learner
źródło
2
Czy plik wykonywalny jest własnością użytkownika innego niż ten, na którym go uruchamiasz? (setuid nie oznacza zmiany na root; oznacza zmianę na użytkownika, który jest właścicielem pliku wykonywalnego.)
cjm
PHPLearner Myślę, że musisz zaangażować grupę / użytkownika, aby zmienić SUID pliku
ryekayo
@cjm me@me:~$ ls -la setuid-test---- zwraca -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP Learner
7
Twój program działa zgodnie z oczekiwaniami w moim systemie Ubuntu 14.04, jeśli znajduje się w moim katalogu domowym, ale nie w przypadku, gdy znajduje się w / tmp, ponieważ parametry używane do montowania / tmp zabraniają programów setuid. Gdzie znajduje się twój program?
Mark Plotnick,
2
Wpisz df .katalog, aby znaleźć punkt podłączenia mount | grep nameofmountpoint. Czy jest tam nosuidwymieniona flaga?
Mark Plotnick,

Odpowiedzi:

10

Większość systemów plików zaprojektowanych dla Uniksa / Linuksa można zamontować z nosuidatrybutem, 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 :

Vincent Danen 2012-07-20 11:25:56 EDT
Zgłoszono, że prywatny pomocnik montowania ecryptfs (/sbin/mount.ecryptfs_private), który ma uprawnienia root-setuid, może pozwolić nieuprzywilejowanemu użytkownikowi lokalnemu na montowanie kontrolowanych przez użytkownika udziałów ecryptfs w systemie lokalnym. Ponieważ pomocnik ecryptfs nie montuje systemów plików z flagami „nosuid” i „nodev”, użytkownik może zamontować system plików zawierający pliki binarne root setuid i / lub pliki urządzeń, które mogą prowadzić do eskalacji ich uprawnień. Można to zrobić za pomocą urządzenia USB, jeśli użytkownik miałby fizyczny dostęp do systemu.
...
Do wersji 99 dodano wymuszanie flag montowania MS_NOSUID i MS_NODEV.

Mark Plotnick
źródło
Gdyby system zezwolił użytkownikowi na zamontowanie systemu plików, który zezwala na setuid, byłoby trywialem stać się rootem. 1) utwórz plik wykonywalny 2) w innym miejscu chown root, chmod +s3) zamontuj go 4) uruchom plik wykonywalny
ctrl-alt-delor
1

Bit 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:

sudo chown 0:0 ./setuid-test
hon
źródło
Jasne, ale nie o to chodzi. Możliwe jest posiadanie programu skonfigurowanego dla użytkownika innego niż root. W scenariuszu w pytaniu setuid-testpowinien być wyświetlany nobodyidentyfikator UID.
Gilles „SO- przestań być zły”,
@Gilles Masz rację. Spodziewam się, że wyświetla się test setuid nobody, a nieroot
PHP Learner
„Bit SetUID w pliku wykonywalnym pozwala na uruchomienie pliku wykonywalnego u właściciela pliku”, a mój właściciel pliku jest nobody, więc oczekuję 65534w zamian, ale widzę, 1000kto jest właścicielem!
PHP Learner,
2
Sprawdź opcje montowania systemu plików, na którym działa program testowy. Jeśli jest zamontowany nosuid, twój program prawdopodobnie nie będzie mógł działać.
kontr-
1
@countermode @MarkPlotnick mount | grep /home/mepowraca /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)
PHP Learner