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

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

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

Я так понимаю, что камень преткновения у нас здесь. Штука в том, что polkit является стандартом только для FDO софта, который уже очень долгое время известен своей корявостью (вспомним прекрасные драмы с dbus и Линусом, в результате которых выяснилось, что ВНЕЗАПНО можно было просто нормально написать dbus и никакая ядерная шина не нужна), и в общем-то systemd мог бы прекрасно обойтись без него.

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

и в общем-то systemd мог бы прекрасно обойтись без него

USE=-policykit emerge systemd
Это проблема?

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

Это проблема?

У меня openrc. А вот на centos7, что в продакшоне — polkit.

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

в арче, как выше было показано, и pkexec хватает для получения рута

liberty1 ()

GLib надо запретить. Этот упоротый си плюс плюс на макросах.

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

У меня openrc.

И ты тут сразу весь такой умный с шашкой на горячем коне.

А вот на centos7, что в продакшоне — polkit.

Я почему-то так и подумал. Есть rpmbuild. Собери как тебе нужно.

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

Я почему-то так и подумал. Есть rpmbuild. Собери как тебе нужно.

Бвахахахаха. Чувак, серьезно? Вот ради этого мы все тут выслушиваем героические хвалебные песни шишмтиди и редхату лично, чтобы потом пересобирать руками rpm'ы?

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

Да, вполне серьёзно.

Вот ради этого мы все тут выслушиваем героические хвалебные песни шишмтиди и редхату лично, чтобы потом пересобирать руками rpm'ы?

Тебе не надоело спорить с голосами в своей голове?

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

Тебе не надоело спорить с голосами в своей голове?

Аргументы уровня «божечка».

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

Да как скажешь. Я себе собираю nginx так как мне нужно для centos и визгов не устраиваю. А у тебя что за проблемы?

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

Судя по твоим визгам в топике ответ утвердительный.

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

Братцы, зря вы ругаетесь, тем более на пустом месте.

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

Братцы, зря вы ругаетесь, тем более на пустом месте.

Я только сейчас понял, что не то написал. Но вообще такой fail, что даже win :)

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

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

О! Как? Другими словами, init-процессу (тобишь самому главному и центровому после ядра) нет дела до... чего? А ни до чего, получается. Ва всём виноваты холопыдругие процессы! (unix-way, хули). Только это какой-то way сексуальных-извращенцев, но точно, не unix.

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

Надо просто засунуть systemd в отдельный докер. Ох щи, они же теперь запилили в своей Федоре замену докеру!

ЗЫ: каждому процессу по докеру

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

- Но ты же просто рисуешь облака и соединяешь их линиями!?

- Заткнись, пёс, я клаудбилдинг инженер!

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

polkit? Я эту срань вырезал (как и consolekit) примерно с 2010 года ...

Спасибо за идею. Тоже всё работает.

Обидно конечно, только на днях lxqt-0.13 себе поставил-настроил, и опять пришлось к самосборному десктопу вернуться (liblxqt от polkit зависела). Ну и от кедовых kwrite + gwenview + okular тоже пришлось отказаться, альтернативы нашлись в целом сносные.

dimgel ()
Ответ на: комментарий от Shaman007

У меня сработало:

$ sudo useradd --uid 4000000000 vpupkin_lal
$ sudo passwd vpupkin_lal
Новый пароль : 
Повторите ввод нового пароля : 
passwd: пароль успешно обновлён
$ su -l vpupkin_lal
Пароль: 
su: предупреждение: не могу поменять каталог на /home/vpupkin_lal: Нет такого файла или каталога
$ whoami
vpupkin_lal
$ systemd-run -t /bin/bash

(pkttyagent:4339): GLib-GObject-WARNING **: 00:51:53.934: 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-u10032.service
Press ^] three times within 1s to disconnect TTY.
# whoami
root
#

Странно, что RedHat «рекомендует системным администраторам не создавать аккаунты с отрицательными значениями UID или UID превышающими 2147483647 до тех пор, пока не будет выпущен патч». Раньше они говорили в таких случаях: сами дураки, неча было такие uid'ы делать, разумеется, мы ничего патчить не будем, потому что это фича, реализующая естественный отбор в админской среде.

aureliano15 ()
Ответ на: комментарий от EvgenijM86

systemd-run -t /bin/bash - попробовал выполнить на ubuntu 18.04 и выскочило окошко для ввода root пароля.

Сначала создай юзера с uid > 0x7FFFFFFF и выполни от его имени. Здесь же кастую commagray и madjestic, чтобы не повторяться. А для madjestic добавлю: копипастить тоже надо уметь. Там, где ты поставил -r, надо ставить -t.

aureliano15 ()

Решето. Говорили уже или нет?

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

Ты дядя на третьей странице отписался. Конечно говорили!

dimgel ()

ЗЫ: раз оракл купил шапку - альфа скоро будет дба?

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

Redhat 7.3 - продуктив:

nodeRH-1 [user@RH1 ~]$ systemd-run -t /bin/bash

На мгновение подумал, откуда на redhat 7.3 взялся systemd.

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

потому что системд-ран это просто один из нынелюбимых и популярных интерфейсов который тыкает в уязвимый полкит..

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

конфиг которого написан на javascript

Ты тролль, да?

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

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

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

Ты не в курсе что ли? У polkit рулесы на жабаскрипте:

Authorization rules are defined in JavaScript .rules files. They are found in two places: 3rd party packages can use /usr/share/polkit-1/rules.d (though few if any do) and /etc/polkit-1/rules.d is for local configuration.

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

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

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

так в том и прикол что системд не проверяет уиды потому что это не его дело. определитесь он должен проверять за полкитом кого пущать а кого нет или всё-таки «а что все это барахло (проверка прав) вообще делает в системе для старта софта?»

Thero ★★★★★ ()

Пока разработку критически важных с точки зрения безопасности вещей не начнут вести на языках типа Agda или Coq, а не на ламповой сишке, GNU/Resheto таким и останется.

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

Да еб твою мать... не systemd за полкитом проверять должен, а автотест должен проверять соответствие поведения ожиданиям. Такое ощущение, что на ЛОРе о тестировании слышали только по бабкиным рассказам.

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

Если через systemd будет эксплуатироваться баг в libc, ты тоже скажешь, что systemd - дырявое говно?

Кроме systemd кто-то ещё зависит от polkit как от libc?

shvonder ()

уязвимость в Polkit

Причем здесь systemd?

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

Хм. Не знал. Ну, посмотрел — симпатичные такие.

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

ну наконец-то мы узнали в чём проблема.. осталось понять в какой момент автотест бы тут помог.

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

Коротко: как компонент комплексной атаки.

Чисто гипотетически: подсунуть пакет в AUR для рачика, где в install скрипте создавать пользователя по нужному критерию. Скриптик можно изрядно обфусцировать, что бы явно в глаза не бросалось (да и как много народу осматривает PKGBUILD/install скрипты, точно меньше, чем код OpenSSL). Использовать другую уязвимост(ь|и) для получения удалённого доступа, использовать созданный локальный бекдор для повышения привилегий. Помимо AUR есть PPA, есть OBS, есть всякие самопаковки (опустим момент ССЗБ, хотя и такое случается), в Mint вон смогли скомпрометировать ISO образ, когда ломанули. Угнать почту (привет linux.org), подделать пакет в центральном репозитории (сложно).

И всё это звучит феерически и неправдоподобно, пока не случается очередной пи...ц, а когда начинается разбор полётов - волосы на заднице шевелятся от того, куда фантазия разработчика атаки зашла.

Это как и любая авария на дороге: никогда ОДНА ошибка к ней не приводит, приводит комплекс оных.

Собственно в проблеме выше получилось достичь нужного результата скомбинировав systemd и polkit, тогда как pkexec показывает проблему, но root не даёт.

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

Если у тебя есть доступ к aur непонятно зачем тебе нужны уязвимости. Установка пакета - полный доступ к системе. Никакие хитрости не нужны, бери да делай что хочешь.

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

Может стоит посмотреть на патчи из каталога debian сборочного пакета? apt-get source ... бла бла?

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

Это пример самого очевидного, что мне в голову пришло. Я не безопасник, думаю у тех кто в теме ещё несколько тузов может оказаться в рукаве.

Плюс, пакет можно удалить, а пользователь ненавязчиво останется в системе, причём, по всем канонам - он валидный. Или скорректировать параметры существующего пользователя.

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

Я не безопасник, думаю у тех кто в теме ещё несколько тузов может оказаться в рукаве.

Уже:

А разве есть такие «мудрые одмины», которые такие UID или UID делают?

Если пользователи в LDAP, то очень даже реальная ситуация.

Вообще, порой фанатизм, имхо, доводит до абсурда. Есть уязвимость. В общем-то, ничего особенного, они часто встречаются и далеко не только в systemd. Но фанатики не допускают даже этого ничего особенного, когда речь заходит об объекте их поклонения. И начинается: это не баг, а чуть ли не фича, потому что какой дурак будет... и т. д. и т. п. Сама RedHat, судя по новости, считает это багом, но фанатики всегда святее папы римского.

aureliano15 ()
Ответ на: комментарий от tailgunner

systemd, конечно, говно, но эта ошибка - в polkit. А systemd - просто вектор атаки.

собственно по этой причине init и должен быть KISS.

crypt ★★★★★ ()

Lol, безопасники забили на тестирование крайних значений. Как ново.

kostyarin_ ()
Ответ на: комментарий от shvonder

Кроме systemd кто-то ещё зависит от polkit как от libc?

systemd не зависит от polkit как от libc.

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

Инит должен быть KISS по многим причинам, но не по этой. systemd-run - это вообще не инит, насколько я понимаю.

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