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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-46331 — pedit COW | Kitploit
Инструменты/GitHubGitHub/v0idnetwork/cve-2026-46331
Повышение привилегийАнализ уязвимостейЭксплуатацияCTFСтатьи и ИсследованияОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubv0idnetwork/cve-2026-46331

CVE-2026-46331

pedit COW

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

Популярное

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

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

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

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

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

CVE-2026-46331 (pedit COW) – Уязвимость отравления кэша страниц в net/sched Packet-Editor ядра Linux

Сводка

CVE-2026-46331 (также известна как «pedit COW») — это локальная ошибка повышения привилегий в подсистеме управления трафиком ядра Linux. Непривилегированный пользователь (в непривилегированном сетевом пространстве имён) может настроить фильтр act_pedit (редактор пакетов), чтобы вызвать частичную запись с копированием при записи (COW) в кэш страниц. В результате ядро записывает подконтрольные злоумышленнику данные в образ файла в памяти без пометки страницы как приватной, повреждая кэшированную копию этого файла. Важно отметить: для эксплуатации требуется только CAP_NET_ADMIN (получаемое в пользовательском пространстве имён) и не изменяет файл на диске. На практике 17 июня 2026 года было опубликовано рабочее доказательство концепции (PoC) под названием packet_edit_meme, демонстрирующее, как перезаписать образ setuid-бинарного файла (например, /bin/su) в кэше страниц для получения root-оболочки. Уязвимость связана с некорректным расчётом диапазона COW в tcf_pedit_act() и была исправлена в апстриме (4 июня 2026) путём переноса проверки области записи внутрь цикла по ключам.

  • Затрагиваемые версии: Ядра Linux (примерно v5.18 – 7.1-rc6) с act_pedit. Незапатченные стабильные релизы (включая многие дистрибутивные ядра) уязвимы.
  • Воздействие: Локальное повышение привилегий до root путём повреждения кэша страниц (отравление кэша страниц). CVSS v3.1: 6.0 (Средний, AV:L/AC:L/PR:H/UI:N/C:N/I:H/A:H).
  • Эксплуатация: PoC использует непривилегированное пользовательское и сетевое пространства имён для получения CAP_NET_ADMIN, настраивает фильтр tc pedit и перезаписывает точку входа ELF setuid-бинарного файла в памяти шелл-кодом.
  • Смягчение: Обновите ядро (патч апстрима перенёс skb_ensure_writable() внутрь цикла по ключам). В качестве временного решения заблокируйте или выгрузите модуль act_pedit или отключите непривилегированные пользовательские пространства имён (например, sysctl user.max_user_namespaces=0). После смягчения сбросьте кэши (echo 3 > /proc/sys/vm/drop_caches), чтобы удалить отравленные страницы.

Этот отчёт содержит подробный технический анализ CVE-2026-46331: её причину, эксплуатацию, обнаружение и стратегии устранения, со ссылками на уведомления производителей, CVE и публичный эксплойт.

Обзор уязвимости

Определение: CVE-2026-46331 — это ошибка записи за пределами границ в подсистеме Traffic Control (net/sched) ядра Linux, а именно в действии act_pedit (редактор пакетов). Функция tcf_pedit_act() вычисляет диапазон «копирования при записи» для операций редактирования пакета до итерации по типизированным ключам, используя статическую подсказку tcfp_off_max_hint. Однако некоторые ключи (например, редактирование заголовков TCP/UDP) определяют свой окончательный байтовый сдвиг только во время выполнения. Код никогда не перепроверяет возможность записи для этих динамических смещений. В результате записи могут происходить за пределами предварительно скопированного региона: часть записи пакета никогда не делается приватной, что приводит к частичному COW. Эта ошибочная запись распространяется на разделяемую память кэша страниц файла (если буферы пакетов случайно ссылаются на страницы файла), повреждая кэшированный образ файла.

Предыстория: Действие редактора пакетов (pedit) в Linux позволяет администраторам перезаписывать произвольные байты в заголовках пакетов (канального, сетевого или транспортного уровней) при прохождении пакетов через настроенный фильтр tc. Оно работает путём указания смещения (возможно, привязанного к заголовку) и 32-битного значения/маски. Внутренне pedit работает с сокетными буферами (sk_buff) и должен сделать целевую память пакета доступной для записи перед её изменением (с помощью skb_ensure_writable() в стиле COW). В идеале ядро должно клонировать (приватно копировать) любые разделяемые страницы перед записью, чтобы избежать изменения памяти, используемой в других местах.

Основная причина: В tcf_pedit_act() код ошибочно рассчитывает доступную для записи область только один раз заранее, используя tcfp_off_max_hint (максимальное статическое смещение). Эта подсказка не включает смещение заголовка времени выполнения, которое добавляют типизированные ключи при обработке пакета. Ключи, такие как TCP или UDP, могут вычислять смещение на основе положения IP-заголовка во время выполнения (например, если предыдущий ключ сместил сетевой заголовок). Таким образом, во время цикла по ключам фактическое смещение для ключа может превышать диапазон, который был предварительно выделен как доступный для записи. Затем код записывает в память пакета через skb_store_bits(), но поскольку страница за пределами предварительно скопированного региона не была сделана приватной, запись повреждает страницу, которая всё ещё разделяется с кэшем страниц. Короче говоря, «слишком ранний расчёт доступного для записи диапазона пакета» приводит к записи за границы и пересечению страниц. Отрицательные смещения (например, редактирование Ethernet-заголовков на входящем трафике) также обрабатываются некорректно, и даже offset_valid() не имел защиты от INT_MIN, усугубляя ошибку.

Почему это происходит: Эта ошибка по сути является логической ошибкой в расчёте диапазона копирования при записи. Ядро предполагало, что статическое максимальное смещение (известное во время загрузки) достаточно для всех изменений. Оно не обновляло диапазон COW, когда ключи с динамическими смещениями фактически применялись. После серии поставленных в очередь изменений финальная запись могла оказаться за пределами предварительно проверенной области. Поскольку буферы пакетов могут ссылаться на страницы файлов, отображённых в память (например, через механизмы нулевого копирования), эта «частичная COW» запись может достичь кэша страниц файла на диске. На практике действие редактора пакетов может получать страницы от sendfile или splice; таким образом, одна операция фильтра пакетов может косвенно записать выбранные злоумышленником данные в образ файла в памяти, не изменяя диск.

Технический анализ

Компоненты и поток данных: Уязвимый код находится в подсистеме Linux net/sched (act_pedit.c). Когда пакет соответствует настроенному правилу pedit, вызывается tcf_pedit_act(). Внутренне он вызывает skb_ensure_writable(skb, X) ровно один раз, где X = tcfp_off_max_hint. Это делает первые X байт пакета приватными (COW). Затем в цикле по каждому ключу (операции редактирования) вычисляется фактическое смещение записи для ключа путём добавления смещения заголовка времени выполнения к указанному смещению ключа и записывается 32-битное значение в пакет. В псевдокоде:```c u32 off_max = action->tcfp_off_max_hint; skb_ensure_writable(skb, off_max); for (i = 0; i < num_keys; i++) { u32 hdr_off = compute_header_offset(skb, key[i].hdr_type); u32 write_off = hdr_off + key[i].offset; skb_store_bits(skb, write_off, &key[i].value, 4); }

Поскольку `hdr_off` вычисляется только при обработке каждого ключа, первоначальный вызов `skb_ensure_writable()` не учитывал его. Если `hdr_off + key[i].offset` превышает `off_max`, код переключается на `skb_store_bits()` на фрагментах, а не на основной линейной области, то есть он записывает в страницу, которая не была сделана приватной. Это и есть точка отказа.
Скачать инструмент