Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
DirtyPipe-Exploit — Доказательство концепции для CVE-2022-0847 | Kitploit
Инструменты/GitHubGitHub/karanlvm/dirtypipe-exploit
Повышение привилегийАнализ уязвимостейЭксплуатацияСтатьи и ИсследованияОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubkaranlvm/dirtypipe-exploit

DirtyPipe-Exploit

Доказательство концепции для CVE-2022-0847

Репозиторий
2110 месяцев назадЕщё не проверено

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CSE 5380: Документ по информационной безопасности CVE-2022-0847 (Dirty Pipe)

Автор

Karan Vasudevamurthy (UTA ID: 1002164438)

Что такое CVE?

Common Vulnerabilities and Exposures (CVE) — это список публично раскрытых уязвимостей и угроз информационной безопасности. Корпорация MITRE представила CVE в 1999 году для идентификации и классификации уязвимостей в программном и аппаратном обеспечении. MITRE — некоммерческая организация, управляющая финансируемыми из федерального бюджета исследовательскими и опытно-конструкторскими центрами в США. CVE призвана облегчить обмен информацией об известных уязвимостях, чтобы планы кибербезопасности могли обновляться с учетом последних проблем и слабых мест. Для этого CVE присваивает каждой уязвимости или угрозе уникальный идентификатор. Через идентификаторы CVE, также известные как имена или номера CVE. Common Vulnerability Scoring System (CVSS) — это набор открытых стандартов для присвоения уязвимости числового значения для оценки ее серьезности. Диапазон оценки CVSS составляет от 0.0 до 10.0. Степень серьезности безопасности возрастает с увеличением числа. Каждый идентификатор CVE имеет формат CVE-YYYY-NNNNN. Часть YYYY — это год, когда был присвоен идентификатор CVE или год, когда уязвимость была обнародована.

Что такое каналы (pipes)?

В контексте CVE-2022-0847 крайне важно понимать внутреннее устройство каналов, особенно атрибуты, связанные с буфером канала. Каналы в Linux помогают передавать данные между процессами, причем выход одного процесса становится входом для другого. Этот механизм облегчает взаимодействие и координацию между различными процессами, работающими в системе. В Linux каналы являются однонаправленными, то есть данные текут только в одном направлении. Буфер канала обычно состоит из структуры данных фиксированного размера, работающей по принципу «первым пришел — первым вышел» (FIFO), которая временно хранит данные, передаваемые между процессами. Когда процесс записывает данные в канал, они сохраняются в буфере до тех пор, пока другой процесс не прочитает их. После чтения данные удаляются из буфера, что позволяет записывать новые данные.

Уязвимость

Для CVE-2022-0847 важно понимать две функции внутри буфера канала:

  1. copy_page_to_iter_pipe: Эта функция отвечает за копирование данных со страницы в итератор, связанный с буфером канала. В контексте межпроцессного взаимодействия через каналы, когда один процесс записывает данные в канал, их необходимо скопировать в буфер канала, чтобы другой процесс мог их прочитать. Функция copy_page_to_iter_pipe облегчает этот процесс копирования, обеспечивая правильную и эффективную передачу данных между процессами. Внутри этой функции параметр «flags» используется для задания или управления определенными атрибутами или поведением, связанными с процессом копирования. Эти флаги могут включать такие опции, как выполнение дополнительных проверок или валидаций, обработка определенных типов данных или применение оптимизаций для повышения эффективности.
  2. push_pipe: Функция push_pipe участвует в помещении данных в буфер канала. Когда процесс записывает данные в канал, данные необходимо вставить в буфер канала, откуда их затем может прочитать другой процесс. Функция push_pipe отвечает за обработку этого процесса вставки, обеспечивая правильное размещение данных в буфере и их доступность для чтения другими процессами.

Страница | 1

Макс Келлерманн обнаружил, что ядро Linux неправильно обрабатывает каналы Unix. Уязвимость возникает из-за недостаточной инициализации определенных атрибутов, в частности параметра «flags», внутри функций copy_page_to_iter_pipe и push_pipe. Эта оплошность приводит к возможности присвоения флагам устаревших или неверных значений, что может поставить под угрозу безопасность и целостность системы. Непривилегированный локальный пользователь может использовать эту ошибку для записи на страницы в кэше страниц, подкрепленные файлами, доступными только для чтения, и, таким образом, повысить свои привилегии в системе.

Методология атаки

Это похоже на CVE-2016-5195 «Dirty Cow», но эксплуатировать проще. Эксплуатация CVE-2022-0847 требует локального доступа к целевой системе и затрагивает версии ядра Linux новее 5.8. Мы можем создать новые буферы каналов с неправильно установленным флагом PIPE_BUF_FLAG_CAN_MERGE из-за отсутствия правильной инициализации. Этот флаг управляет объединением записей в буфер канала и, таким образом, позволяет записывать в существующую страницу, вставленную в канал. Если файл допускает такую вставленную страницу, изменение будет видно в общем для всей системы представлении файла в памяти. Любой последующий сброс кэша будет игнорировать текущие настройки разрешений Linux и скопирует измененные данные на диск. Это позволит непривилегированному пользователю изменять определенное содержимое файла (на диске или в памяти), даже если файл защищен от изменения такими средствами контроля доступа, как SELinux, стандартные разрешения Linux, расширенный контроль доступа и неизменяемые файлы. Таким образом, мы можем предположить, что злоумышленником будет любой непривилегированный локальный пользователь с базовыми знаниями систем Linux и возможностью выполнять вредоносный код. Такой человек может повысить свои привилегии и потенциально скомпрометировать всю систему, что представляет значительный риск для безопасности.

Доказательство концепции (Proof of concept)

Ниже приведены шаги, которые я выполнил для эксплуатации CVE-2022-0847 на виртуальной машине с Linux.

  1. Проверка, может ли ваш дистрибутив Linux быть подвержен эксплуатации:

    Любое ядро Linux новее 5.8 уязвимо. Однако версии 5.16.11, 5.15.25 и 5.10.102 не могут быть подвержены эксплуатации CVE-2022-0847. Чтобы узнать версию вашего ядра, можно просто выполнить *uname -r*. Вы также можете запустить этот bash-скрипт, если не уверены, уязвима ли целевая система.

  2. Загрузка правильного ядра Linux:

    Для демонстрации я решил использовать Ubuntu 20.04.1 LTS. Но эта версия Ubuntu в настоящее время работает на ядре Linux 5.15, и CVE-2022-0847 не может быть эксплуатирована на этой версии ядра. Чтобы загрузить ядро Linux 5.8, мы можем просто выполнить *sudo apt install linux-image-5.8.0-63-generic linux-headers-5.8.0-63-generic*

  3. Загрузка эксплойта:

    Эксплойт можно найти на GitHub. Он демонстрирует, как перезаписать содержимое любого файла в кэше страниц, даже если файл не разрешен для записи, является неизменяемым или находится в томе только для чтения. Вы также можете выполнить *git clone[ https://github.com/karanlvm/Infosec.git* ](https://github.com/karanlvm/Infosec.git%60)в терминале.

  4. Копирование исходного файла passwd:

    Мы можем выполнить *cp /etc/passwd /tmp/passwd.bak*. Это поможет нам определить разницу в файле passwd до и после запуска эксплойта.

  5. Компиляция эксплойта:

    Чтобы успешно скомпилировать эксплойт, вам понадобится установленный GCC. Вы можете установить GCC с помощью *sudo apt-get install gcc*. Для компиляции эксплойта выполните

Ограничения

Существует два основных ограничения этого эксплойта:

  1. Смещение не может находиться на границе страницы (необходимо записать как минимум один байт до смещения).
  2. Запись не может пересекать границу страницы. Это означает, что полезная нагрузка должна быть меньше 4096 байт (размер страницы).

Текущий статус и исправление

По состоянию на 12 января 2024 года вероятность активности эксплуатации в ближайшие 30 дней составляет 7.58% (Exploit prediction scoring system (EPSS)). Ниже приведена оценка CVSS (Common Vulnerability Scoring System) для CVE-2022-0487:

Эта уязвимость может быть эксплуатирована на любом ядре Linux новее 5.8. Однако уязвимость была исправлена в Linux 5.16.11, 5.15.25 и 5.10.102. Таким образом, мы можем просто применить исправления или обновления, предоставленные разработчиками дистрибутивов Linux, чтобы устранить уязвимость. Для этого можно выполнить следующие команды *sudo apt update* и *sudo apt upgrade*.

Ссылки

  1. «2022-0847: A Flaw Was Found in the Way the ‘Flags’ Member of the New Pipe Buffer Structure Was Lacking Proper Initialization in Cop.» CVE Details, www.cvedetails.com/cve/CVE-2022-0847/. Accessed 24 Apr. 2024.
  2. Kellermann, Max. «The Dirty Pipe Vulnerability.» The Dirty Pipe Vulnerability - The Dirty Pipe Vulnerability Documentation, 7 Mar. 2022, dirtypipe.cm4all.com/.
  3. MITRE Corporation*. «CVE-2022-0847.»* CVE, 3 Mar. 2022, cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-0847.
  4. National Institute of Standards and Technology.» CVE-2022-0847.» NVD, 3 Oct. 2022, nvd.nist.gov/vuln/detail/cve-2022-0847.
  5. «Piping in Unix or Linux.» GeeksforGeeks, GeeksforGeeks, 5 July 2023, www.geeksforgeeks.org/piping-in-unix-or-linux/. Страница | 5
Скачать инструмент
*gcc exp.c -o exp*
  • Запуск эксплойта:

    Для запуска эксплойта необходимо указать параметры: файл только для чтения, смещение и несколько символов, которые будут вставлены. В данном случае мы выполним *./exp /etc/passwd 1 ootz:* . Если вы получите вывод «It worked !», это означает, что мы успешно эксплуатировали уязвимость Dirty Pipe и теперь можем получить root-доступ без пароля.

  • Переключение на root-доступ:

    Теперь мы можем просто выполнить *su rootz* и получить root-доступ. Для подтверждения можно выполнить команду id.