setuid

Bit uprawnień powodujący, że program uruchamia się z prawami swojego właściciela, a nie osoby go wywołującej. Klasycznie używany np. przez polecenie passwd.

setuid (Set User ID) to specjalny bit uprawnień w systemach uniksowych, który sprawia, że program wykonuje się z prawami swojego właściciela, a nie tego, kto go uruchomił. Mówiąc po ludzku: nawet jeśli jesteś zwykłym userem bez żadnych specjalnych mocy, plik z ustawionym setuid i właścicielem root zadziała na czas swojego działania tak, jakbyś był rootem. To furtka do tymczasowego podniesienia uprawnień, kontrolowana przez autora programu.

Mechanizm rozróżnia dwa pojęcia: real UID (kto faktycznie odpalił proces) oraz effective UID (z czyimi prawami proces realnie operuje). Bez setuid oba są takie same. Gdy bit jest ustawiony, w momencie uruchomienia effective UID przeskakuje na właściciela pliku. Dzięki temu kernel sprawdza dostęp do plików i zasobów według effective UID — i właśnie to daje programowi chwilowe „superuprawnienia”. Analogicznie istnieje setgid, robiący to samo dla grupy.

Klasyczny przykład to polecenie passwd. Zmiana hasła wymaga zapisu do /etc/shadow, pliku, do którego zwykły user nie ma żadnego dostępu. A jednak każdy może zmienić sobie hasło — bo passwd ma ustawiony setuid z właścicielem root. Sprawdzisz to gołym okiem:

  • ls -l /usr/bin/passwd pokaże uprawnienia -rwsr-xr-x — to s w miejscu bitu wykonywania (x) właściciela to właśnie setuid.
  • Ustawisz go ręcznie przez chmod u+s plik albo chmod 4755 plik (czwórka z przodu to bit setuid).

I teraz najważniejsze, czyli czego nie robić. Setuid root na własnym skrypcie albo na byle binarce to proszenie się o eskalację uprawnień. Jeśli taki program ma lukę, atakujący dostaje roota za darmo — to ulubiony cel pentesterów i pierwsza rzecz, której szuka find / -perm -4000. Dodatkowo: setuid jest ignorowany na skryptach shellowych w większości nowoczesnych systemów (ze względów bezpieczeństwa), więc #!/bin/bash z setuid po prostu nie zadziała tak, jak myślisz — działa to tylko dla skompilowanych binarek. Montowanie partycji z opcją nosuid wyłącza ten mechanizm całkowicie i bywa rozsądnym zabezpieczeniem.

Pojęcia powiązane: setgid, sticky bit, real UID i effective UID, chmod, uprawnienia w Uniksie, sudo, eskalacja uprawnień (privilege escalation), capabilities (nowocześniejsza, ziarnistsza alternatywa dla setuid root).