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)

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

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

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

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

Инит должен быть KISS по многим причинам, но не по этой.

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

systemd-run - это вообще не инит, насколько я понимаю.

насколько я понимаю, хотя какие-то программы и не занимаются запуском служб при старте, они все являются частью нового инит-фреймворка aka systemd. все, включая timers (замена cron). это by design результат тесной интеграции.

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

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

Также, как systemd зависят

# apt-cache rdepends policykit-1 | grep -v 386
policykit-1
Reverse Depends:
  tuned
  udisks
  systemd
  gnome-system-log
  aptdaemon
  systemd
  razorqt-policykit-agent
  python3-plainbox
  gnunet-gtk
  gdm3
  flatpak
  firewalld
  winetricks
  hannah-foo2zjs
  nautilus-dropbox
  caja-dropbox
  zulupolkit
  zoneminder
  wicd-gtk
  upower
  ukui-power-manager
  ukui-polkit
  udisks2
  gdm3
  tails-installer
  systemd
  synaptic
  python-jarabe
  policycoreutils-gui
  policycoreutils-dbus
  gameconqueror
  rtkit
  realmd
  polkit-kde-agent-1
  policykit-1-gnome
  packagekit
  zenmap
  network-manager
  needrestart-session
  modem-manager-gui
  mate-power-manager
  mate-polkit
  lxsession-logout
  lxpolkit
  lxde-core
  linssid
  lightdm-gtk-greeter-settings
  lightdm-gtk-greeter
  libvirt-dbus
  libvirt-daemon-system
  libgsecuredelete0
  isc-dhcp-server
  hplip
  guymager
  guidedog
  gufw
  gnome-system-log
  gnome-initial-setup
  gnome-control-center
  gnome-color-manager
  dbus-user-session
  gdebi
  galternatives
  fwupd-tests
  fprintd
  flatpak
  firewalld
  ettercap-graphical
  deja-dup
  gddccontrol
  colord
  arduino
  cockpit-system
  caja-admin
  brltty
  blueman
  bleachbit
  bilibop-rules
  backintime-qt4

А также почти весь GNOME и KDE.

monk ★★★★★
()

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

sudo useradd -l -M -N -p 1234 -s /bin/false -u 4000000000 polkit_exploit &&
    sudo -u polkit_exploit systemd-run -t whoami &&
    sudo userdel polkit_exploit

Там были разговоры, про то, как можно зарегистрировать пользователя с таким UID, да очень просто - эта новость, одна из причин.

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

вообще то проблема в полкит. systemd не причем.

чем меньше слинкованных библиотек (и функционала), тем меньше возможная площадь атаки.

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

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

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

ага, вот оно что. по-моему это оч. полезное замечание. если я мог, я бы это в шапку топика поднял.:)

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

Получается, Арч опростоволосился ... печаль. Такой уважаемый дистр, вроде бы.

что значит «уважаемый дистр»? который при загрузке спрашивает голосом: «ты мэееня уваажаешь?!» Арч - дистр с последними версиями софта. Стало быть самые свежие баги в нем всегда будут.

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

В идеале, конечно же так

sudo useradd -l -M -N -p 1234 -s /bin/false -u 4000000000 polkit_exploit &&
    sudo -u polkit_exploit systemd-run -t whoami ||
    sudo userdel polkit_exploit
kostyarin_ ★★
()
Ответ на: комментарий от crypt

Инит должен быть KISS по многим причинам, но не по этой.

с чего вдруг не по этой?

С того, ччто systemd-run - отдельный бинарь, он не является чатью критического кода PID 0.

чем меньше слинкованных библиотек (и функционала)

Конечно, конечно. См. выше.

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

С того, ччто systemd-run - отдельный бинарь, он не является чатью критического кода PID 0.

Но ведь не только systemd-run, а вообще можно «выполнить любую команду systemctl». И потом, как это не является, если выполняется с правами рута?

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

Но ведь не только systemd-run, а вообще можно «выполнить любую команду systemctl»

И? Я вообще могу выполнить любую команду в системе, хоть rm -rf. Пока нормально проверяются права, в чем проблема?

И потом, как это не является, если выполняется с правами рута?

С чего бы? SUID бит на systemd-run нет.

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

С того, ччто systemd-run - отдельный бинарь, он не является чатью критического кода PID 0.

PID 1. PID 0 - это ядро. мне это напоминает некогда расхожий аргумент, что в Linux нет уязвимости, потому что Linux - это только ядро.

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

С того, ччто systemd-run - отдельный бинарь, он не является чатью критического кода PID 0.

PID 1

Да, это я ошибся. Рад, что по другим вопросам разногласий нет.

PID 0 - это ядро

У ядра нет PID. PID == 0 - это специальное значение pid_t.

tailgunner ★★★★★
()

В Twitter'е предлагают гораздо более простой способ получения root-прав:

systemd-run -t /bin/bash



Вендекапец? Скоро линукс таки заменит винду.

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

Сама RedHat, судя по новости, считает это багом

Да, только не в systemd, а в polkit. Но местные хейтеры и слышать/видеть ничего не хотят - у них вегда systemd виноват. У огие.

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

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

Это такое оправдание для эпичной уязвимости, которую допустил редхат?

токсичная атмосфера

Токсичность - это хорошо и правильно. Быть токсичным почётно: https://images-na.ssl-images-amazon.com/images/I/917Ov1vg4nL._SY445_.jpg

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

Сама RedHat, судя по новости, считает это багом

Да, только не в systemd, а в polkit. Но местные хейтеры и слышать/видеть ничего не хотят - у них вегда systemd виноват. Убогие.

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

Да пусть кричат. Тут ошибка не в systemd, но с ним получилось её вскрыть. В общем - нашли друг друга.

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

Я, конечно, сильно извиняюсь, но при чём здесь вообще systemd, если дыра в polkit? Ведь любое другое приложение, использующее polkit (тысячи их), подвержено точно такой же проблеме?

Есть примеры использования кроме как через systemd? А то в сабжевой новости фигурирует сочетание systemd и policykit, что уже способствует развитию дискуссии в соответствующем направлении.

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

Лёня «Обосрамс» Поцеринг точно такую же риторику толкал, когда визжал аки свинка, что в неработоспособности его системуды виноват стандарт FHS, а не его кривые руки. Когда что-нибудь отвалится по его вине снова, то он и ядро будет обвинять во всём.

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

Ну... жаль, что systemd навязывает очень много того, что, собственно, к init не относится. И ладно, если бы это касалось функциональности которой нет.

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

Policykit без systemd заводится. Например, для некоторых пакетов в Devuan он требуется.

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

Это, возможно, так, но такая ошибка всё равно означает, что systemd - дырявое говно.

А судо с glibc ты уже выпилил?

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

ну, /var на отдельном разделе до сих пор при выключении машины без костылей и подпорок отмонтировать нельзя при использовании journald.

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

жаль, что systemd навязывает очень много того, что, собственно, к init не относится.

systemd-run автоматизирует действия, которые можно выпонить вручную. Хорошо это или плохо... это философский вопрос.

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

А вот это уже интересно. Зачем после такого писать про systemctl в новости, неясно.

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

Стесняюсь спросить, что надо сделать с линуксом, чтобы там появилось больше 2147483647 UID'ов?

Говносервер с говносистемой говноавторизации на всю говноконтору.

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

Тут много всяких шибко умных рассказывающих о том, что это вообще не уязвимость, а между тем я лично видел uid больше intmax на кластере в IBM Watson Research Center, у них там какая-то замудренная система аутентификации через LDAP / Kerberos, так что такие странные и огромные uid на всех машинах - это норма. Теперь все подряд стали рутами =) и не удивлюсь, если в других махровых энтерпрайзах то же самое...

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

Я про то, что в каком (типичном) сценарии потребуется uid с таким номером?

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

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

Я просто привёл абстрактный пример. А как лдап настроен, это уже другой вопрос.

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

Выше в комментариях удалось без systemd права рута получить - средствами policykit.

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

У ядра нет PID. PID == 0 - это специальное значение pid_t.

Специальное значение, о котором ты говоришь - это fork return status for child, НО в самой, условно говоря, таблице процессов ядра оно не регистрируется (регистрировать разные процессы с одним пидом? нет, не будем). Грубо говоря, это локальная переменная конкретной софтины. А «глобальная переменная» с таким значением тоже существует: это сваппер-шедуллер. От ссылок на википедию уже изжога, так что вот lkml. Сообщение к делу не относится, а трейс по теме.

https://lkml.org/lkml/2012/4/17/310

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

РЕШЕТО!

Политкорректно это называется энтерпрайзом.

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

Однако же неплохо вышло. Проблема оказалась всё-таки в systemd. Проверил в Devuan с установленным policykit.

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

У меня нет systemd и я попробовал провернуть сработавшие в комментариях действия. Нифига не получилось. Policykit установлен, делал через pkexec вместо systemd-run.

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

2'147'483'647

Это уже не просто большая говноконтора, а как минимум большая говнокорпорация размером с небольшую банановую говнореспублику!

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

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

Поцеринг же говорил, что unix-way не нужен. Как так?

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

Эээ... правильно ли я тебя понимаю: чуваки ставят дефолтную систему, запускают проверки, кто имеет доступ к разным командам systemctl, выясняют, что произвольный юзер оказывается может получить рута... и такие, лан, норм, это polkit виноват, мы-то причем?

С позиции разработчика systemd это так. А вот с позиции RedHat как производителя продукта уже выходит большой обосрамс.

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

Так ты проверь шобы версия полкита была хотя той что нужно

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

RedHat уже несколько лет как синоним слова «стыд».

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

Quasar, меня интересует вполне шкурный вопрос: пытаюсь оценить размеры задницы приведет ли дефолтная/типичная/кривая (но тем не менее типичная) настройка LDAP (или иного костыля авторизации) в среде где не овердохрена пользователей к самопроизвольному появлению таких UID, которые можно проэксплуатировать, или нет?

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