
kpatch livepatch для CVE-2026-98432 (и CVE-2026-99999) на AlmaLinux и Rocky Linux 8, 9 и 10
Модули livepatch, исправляющие CVE-2026-98432 на работающем хосте AlmaLinux или Rocky Linux 8, 9 или 10 (x86_64) без перезагрузки. На ядрах, в которых также отсутствует исправление для CVE-2026-99999, тот же модуль исправляет и его, поэтому хосту достаточно одного модуля, независимо от того, какого из двух исправлений не хватает его ядру.
Статус (2026-11-02): каждый модуль собран и протестирован на загрузку; ни один ещё не
выпущен, поэтому применять пока нечего. Далее последуют релиз и тест
однострочной команды на каждом выпущенном модуле; до тех пор
scripts/livepatch.sh не имеет модулей в своей таблице и отказывает для любого
ядра.
684 ядра: 380 от AlmaLinux и 304 от Rocky Linux, от 8.3 до 10.2,
перечислены в tools/kernels.tsv. Это все ядра, чьи SRPM и
debuginfo находятся на зеркалах дистрибутива (включая vault), только x86_64,
за исключением Rocky 5.14.0-611.41.1.el9_7, чей debuginfo отсутствует ни на одном
зеркале. Он включает единственное ядро Rocky 8.3, 4.18.0-240.22.1.el8, которое
прежний репозиторий Rocky не покрывал, и ядра, выпущенные обоими
дистрибутивами после прежних репозиториев, вплоть до
4.18.0-553.180.1.el8_10 (AlmaLinux), 5.14.0-687.61.1.el9_8 и
6.12.0-211.69.1.el10_2. Вариант x86_64_v2 для AlmaLinux 10 не покрыт.
В 666 из 684 также отсутствует исправление для CVE-2026-99999, и их модуль содержит оба. Остальные 18 уже имеют его (начиная с AlmaLinux 4.18.0-553.177.1.el8_10 и Rocky 553.178.1.el8_10, а также с 5.14.0-687.59.1.el9_8 и 6.12.0-211.67.1.el10_2 в обоих), и их модуль содержит только изменение из CVE-2026-98432.
Каждый модуль был собран в CI и применён с помощью scripts/livepatch.sh к
поставляемому ядру в виртуальной машине (tools/loadtest.sh), 2026-10-31, по одному запуску
на дистрибутив и минорную версию, 40 запусков; все 684 вывели RESULT: PASS.
В каждом:
inet_sock_destruct и tcp_v4_reqsk_destructor указаны как
пропатченные функции vmlinux.tools/tcpopt.py). Это задействует оба освобождения,
которые изменяет исправление, при наличии опций; без IP-опций они освобождают
только NULL.nfnetlink_queue и xt_CHECKSUM (а на 9 и 10 —
nf_conntrack_bridge). На 8 и 9 (511 ядер, а также Rocky 8.3) специально сформированный
кадр фрагментировался поставляемым ядром и отбрасывался с применённым
модулем. На 10 (154 ядра) кадр отклоняется до того, как
достигнет уязвимости, поэтому эта проверка там ничего не говорит ни в ту, ни в другую сторону.Не тестировалось: сама гонка. Демонстрация CVE-2026-98432 на поставляемом
ядре и её отсутствия с модулем требует KASAN и искусственного
чередования повторно переданного SYN с освобождением дочернего сокета; в этих
виртуальных машинах это не происходит по требованию. Также ни один модуль не тестировался с включённой Secure
Boot (он не подписан и был бы отклонён) или загруженным при загрузке
через kpatch.service.
tools/mkdiffs.sh портирует каждый SRPM ядра минорной версии. Сначала он применяет
собственные патчи SRPM к его tarball, как это делает %prep
(tools/prep.py): AlmaLinux таким образом несёт свои собственные исправления, среди них
исправление CVE-2026-99999 в 4.18.0-553.177.1.el8_10, а 6.12.0-211.69.1 из 10.2
представляет собой tarball Red Hat 211.56.1 плюс 466 патчей, поэтому порт, сделанный
против голого tarball, упустил бы то, что есть в ядре. Затем изменённые
строки сверяются с tools/ref/: строки CVE-2026-98432 должны совпадать с
upstream, строки CVE-2026-99999 — с патчем AlmaLinux для 8 или 9 либо с upstream
для 10, или отсутствовать там, где ядро имеет это исправление. Все 684
совпали. tools/port.py также останавливается, если kfree_rcu() в дереве не
пропускал бы NULL-указатель, каковыми обычно являются оба указателя.
8 и 9 собираются с помощью kpatch-build, 10 — с помощью собственного klp-build ядра; оба собирают replace-патчи, что позволяет модулю заменить более ранний.
Исправление в upstream — torvalds/linux e3f33b0a1d89, "ipv4: free inet_opt and
ireq_opt after an RCU grace period". Когда SYN содержит IP-опции, слушатель
сохраняет их в request-сокете (ireq_opt) и передаёт дочернему сокету
(inet_opt) без копирования. Повторно переданный SYN для того же запроса
может быть отвечен SYN-ACK на другом CPU, читая эти опции под RCU, в то время
как дочерний сокет закрывается и inet_sock_destruct() освобождает их
обычным kfree(): use after free. Миграция request-сокета имеет ту же
проблему в tcp_v4_reqsk_destructor(). Исправление освобождает оба
указателя через kfree_rcu().
Ни один из дистрибутивов не выпустил исправление: на 2026-10-27 новейшие
ядра AlmaLinux и Rocky Linux 8, 9 и 10 не упоминали CVE в своих changelog,
а исходники 4.18.0-305.3.1.el8_4, 4.18.0-553.179.1.el8_10,
5.14.0-687.61.1.el9_8 и 6.12.0-211.68.1.el10_2 по-прежнему освобождают оба
указателя через kfree().
Исправлено ранее, отдельно для каждого дистрибутива, с помощью nsrg-fmlorg/kpatch-alma-cve-2026-99999 и nsrg-fmlorg/kpatch-rocky-cve-2026-99999. Оба дистрибутива теперь поставляют ядра с этим исправлением, начиная с 4.18.0-553.177.1.el8_10 (AlmaLinux) или 553.178.1.el8_10 (Rocky), 5.14.0-687.59.1.el9_8 и 6.12.0-211.67.1.el10_2. Там, где ядро его не содержит, модуль из этого репозитория несёт то же изменение, что и более ранние, и заменяет уже загруженный более ранний модуль (проверено на каждом из 665 ядер, где он был, см. выше).
| Путь | Что это |
|---|---|
build.sh | Собирает модуль для одного ядра внутри контейнера дистрибутива |
tools/kernels.tsv | Ядра, которые собирает CI: дистрибутив, минорная версия, версия ядра |
tools/select-kernels.py | Какие из них берёт запуск CI |
tools/mkdiffs.sh | Делает порт для каждого ядра минорной версии и проверяет его по tools/ref/ |
tools/prep.py | Применяет собственные патчи SRPM к его tarball, как это делает %prep, перед портированием |
tools/port.py | Само изменение, применяемое к дереву ядра |
tools/kpatchify.py | Превращает порт в форму, подаваемую в kpatch-build |
tools/klp-overlay.sh, tools/klp-overlay-lds.py, tools/klp-overlay/ | Передаёт klp-build из 10.2 в 10.0 и 10.1 |
tools/klpsymcheck.py | Проверяет символы модуля klp-build по поставляемому ядру |
tools/loadtest.sh, tools/loadtest-guest.sh, tools/loadtest-bootprep.sh, tools/loadtest-bootinfo.sh | Загружает поставляемое ядро в VM и применяет, проверяет и удаляет модуль |
tools/csum-probe.sh, tools/csum-inject.py | Проверяет CVE-2026-99999 до и после |
tools/tcpopt.py | Управляет двумя освобождениями, которые меняет CVE-2026-98432, при наличии IP-опций |
tools/doccheck.py | Завершается с ошибкой, если файл не упомянут в обоих README или ссылка битая |
scripts/livepatch.sh | Применяет, проверяет и удаляет выпущенный модуль на хосте |
scripts/build-local.sh | Собирает и проводит load-тест модуля одного ядра на вашей машине |
.github/workflows/diffs.yml | Запускает tools/mkdiffs.sh для каждой минорной версии обоих дистрибутивов |
.github/workflows/build.yml | Собирает модули и проводит их load-тесты |
.github/workflows/docs.yml | Запускает tools/doccheck.py |