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

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

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

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

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

Категории

Все категории
Loading categories
StackRot — CVE-2023-3269: Уязвимость повышения привилегий в ядре Linux | Kitploit
Инструменты/GitHubGitHub/lrh2000/stackrot
Повышение привилегийАнализ уязвимостейЭксплуатацияCTFЭксплуатация Бинарных Файлов
GitHublrh2000/stackrot

StackRot

CVE-2023-3269: Уязвимость повышения привилегий в ядре Linux

Репозиторий
4993797 месяцев назадПроверено Kitploit

Популярное

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

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

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

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

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

StackRot (CVE-2023-3269): уязвимость повышения привилегий в ядре Linux

GitHub CI (GitHub-CI-verified exploit)

Demo

В обработке расширения стека в ядре Linux версий с 6.1 по 6.4 была обнаружена ошибка, также известная как «Stack Rot». Дерево maple, отвечающее за управление виртуальными областями памяти, может выполнять замену узлов без надлежащего получения блокировки записи MM, что приводит к проблемам use-after-free. Непривилегированный локальный пользователь может использовать эту ошибку для компрометации ядра и повышения своих привилегий.

Поскольку StackRot — это уязвимость ядра Linux, обнаруженная в подсистеме управления памятью, она затрагивает почти все конфигурации ядра и требует минимальных привилегий для срабатывания. Однако следует отметить, что узлы maple освобождаются с помощью RCU-колбэков, что задерживает фактическое освобождение памяти до завершения периода ожидания RCU. Следовательно, эксплуатация этой уязвимости считается сложной.

Насколько мне известно, в настоящее время не существует публично доступных эксплойтов, нацеленных на ошибки use-after-free-by-RCU (UAFBR). Это первый случай, когда ошибки UAFBR были признаны эксплуатируемыми даже без наличия параметров CONFIG_PREEMPT или CONFIG_SLAB_MERGE_DEFAULT. Примечательно, что этот эксплойт был успешно продемонстрирован в среде, предоставленной [Google kCTF VRP][ctf] ([bzImage_upstream_6.1.25][img], [config][cfg]).

Уязвимость StackRot присутствует в ядре Linux начиная с версии 6.1, когда структура дерева VMA была изменена с красно-чёрных деревьев на деревья maple.

Предыстория

Всякий раз, когда системный вызов mmap() используется для создания отображения памяти, ядро создаёт структуру vm_area_struct, представляющую соответствующую область виртуальной памяти (VMA). Эта структура хранит различные сведения, включая флаги, свойства и другие важные детали, относящиеся к отображению.```c struct vm_area_struct { long unsigned int vm_start; /* 0 8 / long unsigned int vm_end; / 8 8 / struct mm_struct * vm_mm; / 16 8 / pgprot_t vm_page_prot; / 24 8 / long unsigned int vm_flags; / 32 8 / union { struct { struct rb_node rb attribute((aligned(8))); / 40 24 / / --- cacheline 1 boundary (64 bytes) --- / long unsigned int rb_subtree_last; / 64 8 / } attribute((aligned(8))) shared attribute((aligned(8))); / 40 32 / struct anon_vma_name * anon_name; / 40 8 / } attribute((aligned(8))); / 40 32 / / --- cacheline 1 boundary (64 bytes) was 8 bytes ago --- / struct list_head anon_vma_chain; / 72 16 / struct anon_vma * anon_vma; / 88 8 / const struct vm_operations_struct * vm_ops; / 96 8 / long unsigned int vm_pgoff; / 104 8 / struct file * vm_file; / 112 8 / void * vm_private_data; / 120 8 / / --- cacheline 2 boundary (128 bytes) --- / atomic_long_t swap_readahead_info; / 128 8 / struct vm_userfaultfd_ctx vm_userfaultfd_ctx; / 136 0 */

    /* size: 136, cachelines: 3, members: 14 */
    /* forced alignments: 1 */
    /* last cacheline: 8 bytes */

} attribute((aligned(8)));

Впоследствии, когда ядро сталкивается со сбоями страниц или другими системными
вызовами, связанными с памятью, ему требуется быстрый поиск VMA только по адресу.
Ранее VMA управлялись с помощью красно-чёрных деревьев. Однако начиная с
версии ядра Linux 6.1 произошёл переход на кленовые деревья. [Кленовые
деревья][mt] — это RCU-безопасные структуры данных B-дерева, оптимизированные для хранения
непересекающихся диапазонов. Тем не менее их сложное устройство добавляет сложность
кодовой базе и порождает уязвимость StackRot.

 [mt]: https://docs.kernel.org/6.4/core-api/maple_tree.html

По своей сути кленовое дерево состоит из кленовых узлов. Хотя структура дерева
может быть сложной, важно отметить, что эта сложность никак не связана
с багом StackRot. Поэтому в этой статье предполагается, что
кленовое дерево состоит только из одного узла, то есть корневого узла.

Этот корневой узел может содержать до 16 интервалов. Эти интервалы могут либо
представлять собой промежуток, либо указывать на VMA. Поскольку промежутки также считаются
интервалами, все интервалы соединены последовательно, поэтому в структуре узла
требуется только 15 конечных точек, также известных как pivots. Обратите внимание, что
самая левая и самая правая конечные точки опущены, поскольку их можно
получить из родительского узла.```c
struct maple_range_64 {
        struct maple_pnode *       parent;               /*     0     8 */
        long unsigned int          pivot[15];            /*     8   120 */
        /* --- cacheline 2 boundary (128 bytes) --- */
        union {
                void *             slot[16];             /*   128   128 */
                struct {
                        void *     pad[15];              /*   128   120 */
                        /* --- cacheline 3 boundary (192 bytes) was 56 bytes ago --- */
                        struct maple_metadata meta;      /*   248     2 */
                };                                       /*   128   128 */
        };                                               /*   128   128 */

        /* size: 256, cachelines: 4, members: 3 */
};

Структура maple_range_64, как показано выше, представляет узел maple. В дополнение к поворотным точкам (pivots), слоты используются для ссылки на структуру VMA, когда узел функционирует как листовой узел, или на другие узлы maple, когда узел функционирует как внутренний узел. Если интервал соответствует промежутку (gap), слот просто содержит значение NULL. Расположение поворотных точек и слотов можно визуализировать, как показано ниже:``` Slots -> | 0 | 1 | 2 | ... | 12 | 13 | 14 | 15 | ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ │ │ │ └─ Implied maximum │ │ │ │ │ │ │ └─ Pivot 14 │ │ │ │ │ │ └─ Pivot 13 │ │ │ │ │ └─ Pivot 12 │ │ │ │ └─ Pivot 11 │ │ │ └─ Pivot 2 │ │ └─ Pivot 1 │ └─ Pivot 0 └─ Implied minimum

Что касается конкурентной модификации, кленовое дерево накладывает определённое ограничение: писатели должны удерживать эксклюзивную блокировку (*правило W*). В случае дерева VMA эксклюзивная блокировка соответствует блокировке записи MM. Что касается читателей, доступны два варианта. Первый вариант предполагает удержание блокировки чтения MM (*правило A1*), в результате чего писатель блокируется блокировкой чтения-записи MM. Второй вариант — войти в критическую секцию RCU (*правило A2*). В этом случае писатель не блокируется, а читатели могут продолжать свои операции, поскольку кленовое дерево является RCU-безопасным. Хотя большинство существующих обращений к VMA выбирают первый вариант (т.е. правило A1), правило A2 применяется в немногих критически важных для производительности сценариях, таких как страничные ошибки без блокировок.
Скачать инструмент