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/passwdpokaż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 plikalbochmod 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).