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

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

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

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

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

Категории

Все категории
Loading categories
cve-2026-52910-poc — Воспроизводитель гонки и стресс-инструментарий для CVE-2026-52910 — use-after-free в ядре Linux в программах-селекторах cBPF для reuseport, с проверками dmesg и утечек. | Kitploit
Инструменты/GitHubGitHub/yolkfull/cve-2026-52910-poc
Оборонительные ИнструментыАнализ уязвимостейЭксплуатацияФаззингСтатьи и ИсследованияЭксплуатация Бинарных Файлов
GitHubyolkfull/cve-2026-52910-poc

cve-2026-52910-poc

Воспроизводитель гонки и стресс-инструментарий для CVE-2026-52910 — use-after-free в ядре Linux в программах-селекторах cBPF для reuseport, с проверками dmesg и утечек.

Репозиторий
113320 дней назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2026-52910 — воспроизведение use-after-free в cBPF reuseport

CI

Инструмент для воспроизведения гонки и стресс-тестирования CVE-2026-52910 — use-after-free (UAF) в обработке ядром Linux классических BPF-программ (cBPF) селектора reuseport, исправленной в upstream коммитом "bpf: Free reuseport cBPF prog after RCU grace period".

CVECVE-2026-52910
ТипUse-after-free / чтение за границами (CWE-125), CVSS 3.1 7.8 HIGH AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Появилась вv4.5 (вместе с поддержкой cBPF reuseport)
Исправлена в5.10.259, 5.15.210, 6.1.176, 6.6.143, 6.12.94, 6.18.36, 7.0.13 (stable); mainline v7.1
Upstream splatBUG: KASAN: vmalloc-out-of-bounds in reuseport_select_sock (net/core/sock_reuseport.c:596)
ОбнаружилEulgyu Kim

[!WARNING] Это инструмент стресс-тестирования ядра. На уязвимом ядре он намеренно расширяет окно гонки use-after-free; попадание может привести к падению или повреждению системы. Запускайте его только на машинах, которыми вы владеете или на которых вам явно разрешено тестирование (тестовые ВМ, одноразовые CI-машины), никогда — на продакшн-системах.

Суть бага за минуту

SO_REUSEPORT позволяет множеству сокетов привязываться к одному UDP-порту; для каждого входящего пакета ядро выбирает один сокет из группы в reuseport_select_sock() (net/core/sock_reuseport.c). Группа может установить программу-селектор — классическую BPF-программу, прикрепляемую через setsockopt(SO_ATTACH_REUSEPORT_CBPF) — которая решает для каждого пакета, какой сокет группы его получит. Программа выполняется в RX softirq (обработка приёма сетевых пакетов) внутри критической секции чтения RCU.

Баг: когда программа заменяется или отсоединяется через setsockopt() (reuseport_attach_prog() / reuseport_detach_prog()), старая cBPF-программа освобождается немедленно функцией sk_reuseport_prog_free(), без ожидания активных RCU-читателей. CPU, всё ещё выполняющий инструкции освобождённой программы, читает освобождённую память vmalloc:

sequenceDiagram
    autonumber
    participant C as CPU0 — churner thread
    participant K as setsockopt() path
    participant R as CPU1 — RX softirq

    R->>R: rcu_read_lock()
    R->>R: prog = rcu_dereference(reuse->prog)
    C->>K: setsockopt(SO_ATTACH_REUSEPORT_CBPF, progB)
    K->>K: swap progA → progB
    K->>K: sk_reuseport_prog_free(progA)
    Note right of K: unfixed kernels: bpf_prog_free()<br/>runs NOW — no RCU grace period
    R->>R: execute progA->insns (run_bpf_filter)
    Note right of R: progA was already freed<br/>KASAN: vmalloc-out-of-bounds
    Note over K: fix: call_rcu(sk_reuseport_prog_free_rcu) —<br/>free deferred by one RCU grace period

Путь селектора eBPF (SO_ATTACH_REUSEPORT_EBPF) не затронут: он уже освобождает программы через отложенные стадии bpf_prog_put(). Исправление применяет к пути cBPF тот же подход — один период отсрочки RCU перед освобождением старой программы.

Отчёт KASAN из upstream (на отладочном ядре 7.0):

BUG: KASAN: vmalloc-out-of-bounds in reuseport_select_sock+0xedc/0x1220
Read of size 4 at addr ffffc9000051e004 by task slowme/10208
 net/core/sock_reuseport.c:596

Что в этом репозитории

ФайлНазначение
reuseport_race_hammer.cВоспроизведение: многопоточный hammer, который непрерывно меняет cBPF-селектор под полной UDP-нагрузкой, а затем проверяет целостность доставки.
run_hammer.shОбёртка для одного запуска: повышает net.core.optmem_max, запускает hammer, затем проверяет dmesg на splat'ы, /proc/vmallocinfo на утечки аллокаций bpf_prog и, опционально, kmemleak.
livepatch_cycle.shПрименяет/откатывает livepatch с исправлением, пока работает hammer — ищет опасности жизненного цикла livepatch для исправления на основе call_rcu().
MakefileСобирает hammer.
.github/workflows/ci.ymlCI: сборка + shellcheck (без runtime-тестов ядра; см. CI).

Быстрый старт

На тестовой машине с Linux:

$ make
$ sudo ./run_hammer.sh 600        # 10-minute run
...
== result: RC=0 (0 clean / 1 setup / 2 splat / 3 leak / 4 integrity) ==

Требования:

  • Тестовая машина с Linux, которую можно уронить (ВМ или железо). Ядро с включённым KASAN настоятельно рекомендуется — без KASAN попадание в гонку может остаться полностью незамеченным.
  • gcc и bash.
  • Root для проверок обёртки (dmesg, /proc/vmallocinfo, sysctl); сам hammer работает без привилегий (upstream-воспроизведение запускалось от UID 1000).
  • Простаивающая машина: фоновый трафик и другие пользователи BPF добавляют шум в проверку утечек.
  • Hammer привязывает UDP-порты начиная с 21000 (один порт на группу reuseport) — убедитесь, что они свободны.

Ожидаемые результаты:

  • Уязвимое ядро — splat KASAN в dmesg → RC=2; иногда проверка целостности hammer срабатывает первой → RC=4.
  • Исправленное ядро — чистый запуск, RC=0, стабильное количество vmalloc-аллокаций bpf_prog.

Окно гонки крошечное (освобождение против выполняющегося RX), поэтому один чистый запуск считается неубедительным. Для реального тестирования запускайте часами, например:

$ sudo ./run_hammer.sh 86400 512 8 16 4 127.0.0.1 0

Hammer: reuseport_race_hammer

$ ./reuseport_race_hammer [dur_sec] [insns] [nports] [nsocks] [nsenders] [ip] [ebpf]
АргументПо умолчаниюЗначение
dur_sec300 (мин. 45)общее время работы в секундах
insns256количество инструкций-заполнителей в переключаемой cBPF-программе; чем больше программа, тем больше освобождаемая область для попадания. Если attach завершается с ENOMEM, увеличьте net.core.optmem_max (обёртка делает это за вас).
nports4 (макс. 64)группы reuseport (по одному UDP-порту на каждую, начиная с 21000)
nsocks8 (макс. 512)сокетов на группу
nsenders4 (макс. 32)потоков UDP-отправителей на группу
ip127.0.0.1целевой адрес; используйте IP физического NIC, чтобы распределить RX softirq по CPU (RSS)
ebpf01 = также переключать attach/detach SO_ATTACH_REUSEPORT_EBPF (требуется CAP_BPF/CAP_NET_ADMIN); этот путь не уязвим, это для сравнения/покрытия

Каждая группа запускает один поток churner, который в тесном цикле меняет и отсоединяет cBPF-селектор через setsockopt(), и потоки-отправители, заливающие группу 64-байтовыми UDP-датаграммами, пока приёмники считают доставку по сокетам.

Фазы запуска (T = dur_sec):

time ──────────────────────────────────────────────────────────────►
 [0 ──────────── T-15s)   [T-15s ── T-10s)   [T-10s ─────────── T]
       CHURN + FLOOD             SETTLE               MEASURE
 churner swaps/detaches    churn frozen,       deterministic program
 the selector prog at      final program       (selects the LAST
 max rate under full       attached             socket): EVERY packet
 UDP flood — THE           (selects LAST        must land on the LAST
 race window open          socket)              socket; snapshot A →
                                               run → snapshot B

Проверка целостности: во время фазы измерения финальная программа детерминированно выбирает последний сокет группы. Если пакеты, полученные группой в течение этого окна, не все попали на этот сокет, выбор сработал неправильно (возможный эффект UAF даже без KASAN) → код выхода 2.

Коды выхода hammer: 0 PASS · 1 ошибка настройки/выполнения · 2 WARN целостности.

run_hammer.sh — обёртка для одного запуска

Запускает hammer и добавляет проверки, которые делают одиночный запуск осмысленным:

Скачать инструмент