
Доказательство концепции для CVE-2022-0847
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 важно понимать две функции внутри буфера канала:
copy_page_to_iter_pipe: Эта функция отвечает за копирование данных со страницы в итератор, связанный с буфером канала. В контексте межпроцессного взаимодействия через каналы, когда один процесс записывает данные в канал, их необходимо скопировать в буфер канала, чтобы другой процесс мог их прочитать. Функция copy_page_to_iter_pipe облегчает этот процесс копирования, обеспечивая правильную и эффективную передачу данных между процессами. Внутри этой функции параметр «flags» используется для задания или управления определенными атрибутами или поведением, связанными с процессом копирования. Эти флаги могут включать такие опции, как выполнение дополнительных проверок или валидаций, обработка определенных типов данных или применение оптимизаций для повышения эффективности.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.
Проверка, может ли ваш дистрибутив Linux быть подвержен эксплуатации:
Любое ядро Linux новее 5.8 уязвимо. Однако версии 5.16.11, 5.15.25 и 5.10.102 не могут быть подвержены эксплуатации CVE-2022-0847. Чтобы узнать версию вашего ядра, можно просто выполнить *uname -r*. Вы также можете запустить этот bash-скрипт, если не уверены, уязвима ли целевая система.
Загрузка правильного ядра 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*
Загрузка эксплойта:
Эксплойт можно найти на GitHub. Он демонстрирует, как перезаписать содержимое любого файла в кэше страниц, даже если файл не разрешен для записи, является неизменяемым или находится в томе только для чтения. Вы также можете выполнить *git clone[ https://github.com/karanlvm/Infosec.git* ](https://github.com/karanlvm/Infosec.git%60)в терминале.
Копирование исходного файла passwd:
Мы можем выполнить *cp /etc/passwd /tmp/passwd.bak*. Это поможет нам определить разницу в файле passwd до и после запуска эксплойта.
Компиляция эксплойта:
Чтобы успешно скомпилировать эксплойт, вам понадобится установленный GCC. Вы можете установить GCC с помощью *sudo apt-get install gcc*. Для компиляции эксплойта выполните
Ограничения
Существует два основных ограничения этого эксплойта:
Текущий статус и исправление
По состоянию на 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*.
Ссылки
*gcc exp.c -o exp*Запуск эксплойта:
Для запуска эксплойта необходимо указать параметры: файл только для чтения, смещение и несколько символов, которые будут вставлены. В данном случае мы выполним *./exp /etc/passwd 1 ootz:* . Если вы получите вывод «It worked !», это означает, что мы успешно эксплуатировали уязвимость Dirty Pipe и теперь можем получить root-доступ без пароля.
Переключение на root-доступ:
Теперь мы можем просто выполнить *su rootz* и получить root-доступ. Для подтверждения можно выполнить команду id.