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

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

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

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

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

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/bluedragonsecurity/linux-kernel-dirty-pipe-exploitation-logic-bug-
Повышение привилегийАнализ уязвимостейАнализ КодаЭксплуатацияCTFОбучение и ОбразованиеЭксплуатация Бинарных ФайловЛаборатории и Практика

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться
GitHub
bluedragonsecurity/linux-kernel-dirty-pipe-exploitation-logic-bug-

Linux-Kernel-Dirty-Pipe-Exploitation-Logic-Bug-

Эксплуатация CVE-2022-0847 - автор: Antonius (w1sdom)

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

Эксплуатация уязвимости Dirty Pipe в ядре Linux (логическая ошибка)


by: Antonius (w1sdom)
https://www.bluedragonsec.com
https://github.com/bluedragonsecurity

Dirty Pipe (CVE-2022-0847) — одна из самых значительных уязвимостей безопасности в ядре Linux версий 5.8 – 5.15.24, обнаруженная Максом Келлерманном в 2022 году. Эта уязвимость позволяет обычным пользователям (без специальных привилегий) перезаписывать данные в файлах, которые должны быть доступны только для чтения. Понимание основных концепций

Прежде чем подробно обсуждать Dirty Pipe, необходимо понять некоторые внутренние концепции ядра Linux:

1. Страничная организация памяти (Paging)
Страничная организация памяти — это механизм управления памятью в ядре Linux, при котором система памяти делит физическую память на небольшие блоки фиксированного размера, называемые кадрами страниц (page frames), а виртуальная память делится на блоки того же размера, называемые страницами (pages). Этот механизм позволяет ядру отображать виртуальное адресное пространство процессов на физическую память не последовательным образом, что критически важно для эффективности и безопасности в современных системах.

2. Страница (Виртуальная память)
В Linux страница — это наименьшая единица управления физической памятью, обрабатываемая ядром. Аналогия: ОЗУ — это огромная книга. Страница — один лист бумаги в этой книге. Ядро не перемещает данные бит за битом, а лист за листом (страница за страницей). Обычно в современных архитектурах (например, x86_64) стандартный размер одной страницы составляет 4 КБ (4096 байтов).

3. Кэш страниц (Page Cache)
Это ключевая часть. Linux не читает файлы напрямую с диска каждый раз, потому что это медленно. Ядро копирует содержимое файлов в ОЗУ, которое называется кэшем страниц (Page Cache).

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

4. Буфер канала (Pipe Buffer)
Канал — это механизм межпроцессного взаимодействия (IPC). Внутренне ядро управляет каналами с помощью структуры данных pipe_inode_info. Данные внутри канала хранятся в «буфере», называемом буфером канала (Pipe Buffer).

  • Кольцевой буфер: Ядро использует циклическую (кольцевую) структуру для управления этим буфером. Кольцевой буфер — это структура данных, использующая единый массив фиксированного размера, как если бы его конец был соединён обратно с началом. Это создаёт поток данных, который «вращается» бесконечно.
  • Флаги: Каждый буфер имеет атрибуты или «флаги», определяющие его поведение (например, можно ли объединять буферы).
Буфер канала находится в пространстве ядра.

5. Флаг буфера канала (PIPE_BUF_FLAG_CAN_MERGE)
Флаг PIPE_BUF_FLAG_CAN_MERGE был введён в ядре Linux версии 5.8. Именно здесь кроется основная уязвимость. Флаг называется PIPE_BUF_FLAG_CAN_MERGE.

  • Его функция: Сообщает ядру, что новые данные, записываемые в канал, могут быть объединены с существующим буфером.
  • Проблема: До исправления Dirty Pipe ядро не очищало (не сбрасывало) этот флаг должным образом при выполнении splice().

6. Splice
splice() — это системный вызов для перемещения данных между двумя файловыми дескрипторами без копирования данных между пространством ядра и пользовательским пространством. Это часто называют механизмом нулевого копирования (Zero-copy). Системный вызов splice() является «главным действующим лицом» в Dirty Pipe:

  • Вместо физического копирования данных splice() выполняет оптимизацию, заставляя буфер канала указывать непосредственно на страницу в кэше страниц.
  • Это означает, что канал содержит не копию данных файла, а только «указатель» на физическую память файла.

7. Копирование при записи (Copy on Write, CoW)
Механизм копирования при записи (CoW) — это стратегия оптимизации управления памятью, используемая ядром Linux для отсрочки копирования данных до тех пор, пока это не станет абсолютно необходимым. Связь между копированием при записи (CoW) и эксплойтом Dirty Pipe (CVE-2022-0847) заключается в том, как небольшая ошибка в ядре Linux успешно «обманывает» механизм CoW, позволяя записывать данные в файлы, которые должны быть доступны только для чтения.

8. Грязная страница (Dirty Page)
Грязная страница — это страница памяти в ОЗУ, которая была изменена приложением, но изменения ещё не были записаны обратно на вторичное хранилище (например, SSD или жёсткий диск).

Анализ уязвимости Dirty Pipe

Dirty Pipe — это тип логической ошибки (logic bug) в обработке буфера канала в ядре Linux версий 5.8 – 5.15.24. Основная проблема заключается в механизме каналов (канал межпроцессного взаимодействия) и в том, как ядро управляет кэшем страниц (память, хранящая копии данных файлов с диска). Ключевая проблема — ошибка во флаге PIPE_BUF_FLAG_CAN_MERGE.

Основная проблема заключается в том, что ядро не смогло должным образом повторно инициализировать этот флаг (логическая ошибка). Вот анализ кода: В функциях copy_page_to_iter_pipe и push_to_pipe в ядре Linux до версии 5.16.11 при выполнении операций splice ядро подготавливает структуру pipe_buffer, но забывает очистить поле .flags.

Уязвимая структура кода:

// Местоположение проблемы: fs/pipe.c или include/linux/pipe_fs_i.h
struct pipe_buffer {
    struct page *page;
    unsigned int offset, len;
    const struct pipe_buf_operations *ops;
    unsigned int flags; // <--- ЭТОТ ФЛАГ НЕ СБРАСЫВАЕТСЯ
    unsigned long private;
};

Код до патча (уязвимый):

// lib/iov_iter.c - До патча CVE-2022-0847
static size_t copy_page_to_iter_pipe(struct page *page,
    size_t offset, size_t bytes, struct iov_iter *i) {
    // ---------пропуск-----------
    struct pipe_buffer *buf = &pipe->bufs[head & mask];
Скачать инструмент