Bug 37516

Summary: Получение прав уровня root всеми wheel через pkexec
Product: Sisyphus Reporter: Speccyfighter <zxwarior>
Component: polkitAssignee: Valery Inozemtsev <shrek>
Status: NEW --- QA Contact: qa-sisyphus
Severity: blocker    
Priority: P3 CC: aris, asy, glebfm, iv, ldv, mike, nbr, shaba, shrek
Version: unstable   
Hardware: all   
OS: Linux   

Description Speccyfighter 2019-11-20 12:06:02 MSK
Пакет:

$ rpm -qf --qf '%{NAME}\n' /usr/bin/pkexec 
polkit

Тестовая система:

$ cat /image/.disk/info 
Simply Linux/x86_64 2017-07-07

Первый пользователь в системе, регистрируемый на инсталляции, это личный пользовательский аккаунт root.
Новый пользователь добавленный в группу wheel, права которому делегируются через  sudoers, это не root. Это другое физическое лицо.

Выполнение в X-терминале:
Получение root-сессии пользователем группы wheel не знающим пароля root

[test@localhost ~]$ id
uid=501(test) gid=501(test) группы=501(test),10(wheel)
[test@localhost ~]$ 

Здесь в окне запрос пароля любого из wheel на выбор:
[test@localhost ~]$ pkexec /bin/bash

с последующим получением сессии root в X-терминале:
[root@localhost ~]# 
[root@localhost ~]# echo $USER
root
[root@localhost ~]# 
[root@localhost ~]# echo $UID
0
[root@localhost ~]# 
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# 
[root@localhost ~]# echo $PATH
/root/bin:/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin
[root@localhost ~]# 
[root@localhost ~]# echo $GROUPS
0

Запретить получение прав уровня root всеми wheel через pkexec:

polkit.addRule(function(action, subject) {
    if (action.id.indexOf("org.freedesktop.policykit.exec") == 0)
    {
        return polkit.Result.NO;
    }
});

Этот рулез выше, приведёт к отказу получения прав уровня root всеми wheel, через pkexec и свой личный пароль:

[test@localhost ~]$ pkexec /bin/bash
Error executing command as another user: Not authorized

This incident has been reported.


Ошибка в ту же тему о безопасности:

https://bugzilla.altlinux.org/18344
https://bugzilla.altlinux.org/35763

Затрагивает все altlinux.
Comment 1 Speccyfighter 2019-11-20 22:10:40 MSK
Это правило заблокирует вход в оболочку root любому wheel
через 'pkexec /bin/bash' по своему паролю,
как и запретит выполнение любого любым wheel через pkexec, если это не root
(следующая строка после && это продолжение строки и этот перенос непреднамеренный):

# cat /etc/polkit-1/rules.d/60-pkexec-to-root-only.rules

polkit.addRule(function(action, subject) {
    if (action.id.indexOf("org.freedesktop.policykit.exec") == 0 && subject.isInGroup("root") )
        {
                return polkit.Result.YES;
        }
});


polkit.Result.YES, - это для sysv на которых авторизация сломана.

Все остальные экшны, будут обрабатываться в соответствии с политикой polkit описанной в 50-default.rules
Comment 2 Dmitry V. Levin 2019-11-22 13:10:08 MSK
Мне кажется, что это в точности
https://bugzilla.altlinux.org/show_bug.cgi?id=35763
Comment 3 Speccyfighter 2020-10-14 13:13:30 MSK
В контексте комметария 12
https://bugzilla.altlinux.org/show_bug.cgi?id=35763#c12
параллельного бага #35763:

Всё много хуже.

/etc/polkit-1/rules.d/50-default.rules
polkit считает пользователя в группе wheel не рутом, а админом.

И при наличии в системе администратора и соадминистратора (группа wheel) предложит ввод пароля любого wheel на выбор, включая того, чей пароль скомпроментирован:

# grep -v '^\/\|^$' /etc/polkit-1/rules.d/50-default.rules
polkit.addAdminRule(function(action, subject) {
    return ["unix-group:wheel"];
});


# groups user1 tester tester2
user1 : user1 wheel ...
tester : tester wheel audio
tester2 : tester2


$ su - tester2
Password: 


$ whoami; pkexec /bin/bash
tester2
==== AUTHENTICATING FOR org.freedesktop.policykit.exec ====
Authentication is needed to run `/bin/bash' as the super user
Multiple identities can be used for authentication:
 1.  user1
 2.  tester
Choose identity to authenticate as (1-2): 2
Password: 
...


Баги #35763 #37516 в стартеркитах на sysvinit и в частности в p9-xfce-sysv неактуальны, по причине:

a) отсутствия systemd.
b) сломанной авторизации (и отсутствующего для sysv elogind) и значит не работающего по-умолчанию pkexec при выполнении команды от другого пользователя, с отказом на сбое аутентификации.
c) ненастроенного по-умолчанию sudo (всё для всех wheel).

Также см. сообщение Лёши Гладкова по поводу elogind:
https://lists.altlinux.org/pipermail/devel/2019-November/208963.html
Comment 4 Speccyfighter 2020-10-14 16:06:06 MSK
Используя такой существующий алгоритм и скомпроментированный пароль одного из wheel (выбор предлагается на аутентификации), непривилегированный пользователь, в системе на systemd, через X-терминал может получить окружение root:

[root@localhost ~]# ls -l /proc/1/exe
lrwxrwxrwx 1 root root 0 окт 14  2020 /proc/1/exe -> /lib/systemd/systemd

[altlinux@localhost ~]$ groups altlinux test test2
altlinux : altlinux wheel uucp proc cdwriter audio radio users scanner xgrp netadmin fuse
test : test wheel
test2 : test2
[altlinux@localhost ~]$ 
[altlinux@localhost ~]$ su - test2
Password: 
[test2@localhost ~]$ 
[test2@localhost ~]$ whoami; pkexec /bin/bash
test2
[root@localhost ~]# echo $USER $HOME $UID
root /root 0
Comment 5 Alexey Shabalin 2020-10-25 03:10:47 MSK
Я вот не понимаю, зачем вы включаете пользователя в группу wheel? Просто не добавляйте его в эту группу.
Для sudo вы можете давать доступ индивидуально пользователям, или сделать группу типа sudousers.
Comment 6 Speccyfighter 2020-11-08 05:26:29 MSK
(Ответ для Alexey Shabalin на комментарий #5)
> Я вот не понимаю, зачем вы включаете пользователя в группу wheel?

Потому что политика запрещает не wheel использовать sudo:

# control | grep 'sudo '
sudo            wheelonly       (public wheelonly restricted)

# ll /usr/bin/sudo
-rws--x--- 1 root wheel 147136 ноя  8 05:22 /usr/bin/sudo

А установить public, всё равно что закурить возле пороховой бочки.
Comment 7 Sergey Y. Afonin 2020-11-08 14:46:05 MSK
(In reply to Alexey Shabalin from comment #5)

> Я вот не понимаю, зачем вы включаете пользователя в группу wheel?

Потому, что в ALT так исторически сложилось. То, что wheel в некотором роде администратор, но ещё без прав суперпользователя. В общем есть bug 18344, решение по которому при текущем polkit становится бессмысленно.
Comment 8 Dmitry V. Levin 2020-11-08 15:20:17 MSK
(In reply to Alexey Shabalin from comment #5)
> Я вот не понимаю, зачем вы включаете пользователя в группу wheel? Просто не
> добавляйте его в эту группу.

В ALT группа wheel с самого начала используется в качестве группы отсечения доступа к привилегированным инструментам вроде su и sudo.

Почему-то polkit подменил значение группы wheel: теперь при наличии работающего polkit члены группы wheel по умолчанию автоматически приравниваются к root,
что эквивалентно включению по умолчанию "control sudowheel enabled".

Эта подмена смысла группы wheel является уязвимостью в конфигурации polkit по-умолчанию, которую необходимо исправить в Сизифе и бранчах.