Podniesienie uprawnień dla użytkowników z UID większym niż INT_MAX
Napisał: Patryk Krawaczyński
05/12/2018 w Bezpieczeństwo Brak komentarzy. (artykuł nr 669, ilość słów: 181)
U
żytkownicy posiadający UID większy od INT_MAX posiadają możliwość wykonania dowolnego polecenia za pomocą systemctl
. Błąd nie tkwi w samym systemd, jak mogliśmy się przyzwyczaić, ale w narzędziu pkttyagent, w którym PolicyKit (polkit) podczas wystąpienia błędu twierdzi, że użytkownik jest uprawniony do wykonania polecenia. Przykład działania takiego zachowania:
$ systemctl --version systemd 239 $ pkttyagent --version pkttyagent version 0.115 $ id uid=4000000000(someuser) gid=100(users) groups=100(users) $ systemctl stop sshd.service (pkttyagent:3342): GLib-GObject-WARNING **: 13:28:53.802: value "-294967296" of type 'gint' is invalid or out of range for property 'uid' of type 'gint' ** ERROR:pkttyagent.c:156:main: assertion failed: (polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)) >= 0) $ systemctl is-active sshd.service inactive
Luka sama w sobie nie jest groźna, ponieważ do stworzenia użytkownika z takim UID są już wymagane prawa administratora. Można ją jednak użyć do zamaskowania użytkownika, który ma podniesione prawa, a nie ma przypisanego UID/GID=0. Do czasu naprawienia luki można użyć obejścia w postaci wyłączenia polkit’a:
systemctl mask polkit && systemctl stop polkit
Więcej informacji: systemd issue, polkit issue, CVE-2018-19788