
Эксплойт для повышения привилегий в Linux через snapd (CVE-2019-7304)
В январе 2019 года текущие версии Ubuntu Linux были признаны уязвимыми для локального повышения привилегий из-за ошибки в API snapd. Этот репозиторий содержит оригинальный POC эксплойта, который предоставляется для исследований и обучения. Для подробного описания уязвимости и эксплойта обратитесь к блог-посту здесь.
Ubuntu поставляется с snapd по умолчанию, но любой дистрибутив может быть эксплуатируемым, если этот пакет установлен. Вы можете легко проверить, уязвима ли ваша система. Выполните команду ниже. Если ваш snapd версии 2.37.1 или новее, вы в безопасности.
$ snap version
...
snapd 2.37.1
...
Обратите внимание, что некоторые системы возвращают версию пакета дистрибутива snapd при выполнении этой команды, в отличие от вышестоящей версии, показанной в примере выше. Если версия вашего snapd содержит ссылку на что-то вроде номера версии Ubuntu, добавленного к ней (например: 2.34.2ubuntu0.1 или 2.35.5+18.10.1), обратитесь к этой ссылке, чтобы определить, используете ли вы исправленную версию.
Этот эксплойт обходит проверки контроля доступа для использования ограниченной функции API (POST /v2/create-user) локального сервиса snapd. Он запрашивает у Ubuntu SSO имя пользователя и открытый SSH-ключ для указанного адреса электронной почты, а затем создает локального пользователя на основе этих значений.
Успешная эксплуатация этой версии требует исходящего интернет-соединения и SSH-сервиса, доступного через localhost.
Для эксплуатации сначала создайте учетную запись на Ubuntu SSO. После подтверждения отредактируйте свой профиль и загрузите открытый SSH-ключ. Затем запустите эксплойт следующим образом (с закрытым SSH-ключом, соответствующим загруженному открытому ключу):
python3 ./dirty_sockv1.py -u "[email protected]" -k "id_rsa"
[+] Slipped dirty sock on random socket file: /tmp/ktgolhtvdk;uid=0;
[+] Binding to socket file...
[+] Connecting to snapd API...
[+] Sending payload...
[+] Success! Enjoy your new account with sudo rights!
[Script will automatically ssh to localhost with the SSH key here]
Этот эксплойт обходит проверки контроля доступа для использования ограниченной функции API (POST /v2/snaps) локального сервиса snapd. Это позволяет устанавливать произвольные snap-пакеты. Snaps в режиме 'devmode' обходят песочницу и могут включать 'install hook', который выполняется в контексте root во время установки.
dirty_sockv2 использует уязвимость для установки пустого snap-пакета в режиме 'devmode', включающего хук, который добавляет нового пользователя в локальную систему. Этот пользователь будет иметь права на выполнение команд sudo.
В отличие от первой версии, эта не требует, чтобы SSH-сервис был запущен. Она также будет работать на новых версиях Ubuntu без какого-либо интернет-соединения, что делает её устойчивой к изменениям и эффективной в ограниченных средах.
Примечание для ясности: Эта версия эксплойта не прячется внутри вредоносного snap-пакета. Вместо этого она использует вредоносный snap-пакет как механизм доставки полезной нагрузки для создания пользователя. Это возможно благодаря той же ошибке uid=0, что и в версии 1
Этот эксплойт также должен быть эффективен на системах, отличных от Ubuntu, на которых установлен snapd, но которые не поддерживают API 'create-user' из-за несовместимого синтаксиса оболочки Linux.
Некоторые старые системы Ubuntu (например, 16.04) могут не иметь установленных компонентов snapd, необходимых для боковой загрузки. Если это так, эта версия эксплойта может инициировать установку этих зависимостей. Во время установки snapd может обновиться до неуязвимой версии. Тестирование показывает, что эксплойт всё равно успешен в этом сценарии. См. раздел устранения неполадок для получения дополнительной информации.
Для эксплуатации просто запустите скрипт без аргументов на уязвимой системе.
python3 ./dirty_sockv2.py
[+] Slipped dirty sock on random socket file: /tmp/gytwczalgx;uid=0;
[+] Binding to socket file...
[+] Connecting to snapd API...
[+] Deleting trojan snap (and sleeping 5 seconds)...
[+] Installing the trojan snap (and sleeping 8 seconds)...
[+] Deleting trojan snap (and sleeping 5 seconds)...
********************
Success! You can now `su` to the following account and use sudo:
username: dirty_sock
password: dirty_sock
********************
При использовании второй версии, если эксплойт завершается, но вы не видите новую учетную запись, это может быть связано с фоновыми обновлениями snap. Вы можете просмотреть их, выполнив snap changes, а затем snap change #, ссылаясь на строку, показывающую установку snap-пакета dirty_sock. В конце концов, они должны завершиться, и ваша учетная запись станет доступной.
Версия 1 кажется самой простой и быстрой, если ваша среда её поддерживает (SSH-сервис запущен и доступен с localhost).
Неуязвимые системы выведут что-то вроде следующего:
[!] System may not be vulnerable, here is the API reply:
HTTP/1.1 401 Unauthorized
Content-Type: application/json
Date: Mon, 18 Feb 2019 07:07:12 GMT
Content-Length: 119
{"type":"error","status-code":401,"status":"Unauthorized",
"result":{"message":"access denied","kind":"login-required"}}
Пожалуйста, открывайте issues для всего необычного.
Проблема была сообщена напрямую команде snapd через баг-трекер Ubuntu. Вы можете прочитать полную ветку здесь.
Я был очень впечатлен реакцией Canonical на эту проблему. С командой было замечательно работать, и в целом опыт вызывает у меня очень хорошие чувства как у пользователя Ubuntu.
Публичные ссылки на рекомендации:
Примечание: я публикую информацию только в этом репозитории GitHub, в моем блоге на initblog.com и в блоге моей команды на shenaniganslabs.io. Любой сайт, маскирующийся под официальный источник, к сожалению, находится вне моего контроля.