
Безопасное обновление ядра для CVE-2026-98432 на Ubuntu 24.04 с NVIDIA и анализ ошибки
Это переводит машину с Ubuntu 24.04 и GPU NVIDIA на ядро, которое исправляет CVE-2026-98432 — use-after-free в коде IPv4 TCP ядра. Оно создано для машины, до которой вы можете не иметь доступа, если обновление пойдёт не так: ничему не доверяют, пока оно не загрузилось, а неудачный шаг останавливается явно, вместо того чтобы оставить сломанный хост.
Предпочитайте обычные обновления Ubuntu, если они содержат исправление. Это существует потому, что в чрезвычайной ситуации, для которой оно было написано, единственным исправленным ядром была предрелизная сборка в staging-архиве Canonical. Новейшее опубликованное ядро, 7.0.0-42, всё ещё содержало ошибку.
Не ориентируйтесь на номер версии. Прочитайте собственный код работающего ядра с помощью шлюза personal_server:
sudo bash scripts/14_verify_kernel_fixes.sh
Он считывает машинный код работающего ядра из оперативной памяти, а также ядра, которое GRUB загрузит следующим, из его образа. В исправленном ядре inet_sock_destruct и tcp_v4_reqsk_destructor вызывают kvfree_call_rcu. В уязвимом они вызывают kfree.
Если это не сработает, сначала попробуйте обычный путь:
sudo apt-get update
sudo apt-get install --only-upgrade linux-generic-hwe-24.04
sudo systemctl reboot
Используйте этот репозиторий, только если это не влечёт фиксированного ядра.
Вам нужна собственная копия, поскольку процесс публикует свой журнал аудита в Git по мере выполнения. Сделайте форк этого репозитория и на машине:
git clone <your fork> && cd <it>
kernel-upgrade/install.sh
sudo systemctl reboot
Подождите около 8 минут для перезагрузок. Машина перезагрузится сама ещё дважды, и от вас ничего не потребуется:
uname -r # must print 7.0.0-43-generic
python3 -I kernel-upgrade/upgrade.py status # must say complete
Если машина не подходит, установщик сообщает причину и ничего не меняет. В kernel-upgrade/PROCEDURE.md описано, что требуется хосту, все возможные сбои и что с ними делать, а также граница краха.
| Загрузка | Кто её запускает | Ядро | Что происходит |
|---|---|---|---|
| 1 | Вы | Ядро, о котором известно, что оно здесь работает | Доказывает, что GRUB умеет писать на этот диск, поэтому однократная загрузка действительно однократна |
| 2 | Процесс, один раз | -43, только один раз | Считывает исправление из памяти ядра и проверяет всё, что было у хоста раньше. При панике система сама возвращается к заведомо рабочему ядру |
| 3 | Процесс, один раз | -43, через штатный GRUB | Доказывает конечное состояние: штатный GRUB восстановлен, все остальные ядра удалены |
Что он гарантирует:
complete означает доказано. Этот статус достигается только после загрузки через конечное состояние GRUB и ядра, и итоговая запись попадает в Git до сохранения статуса.lock.json указывает, что устанавливать, и не содержит сведений о какой-либо машине. Резервное ядро, списки удаления и базовый уровень здоровья считываются с хоста и публикуются до первого изменения.PROCEDURE.md. Следующая загрузка продолжает или явно останавливается.kernel-upgrade/vm/final-run.sh создаёт с нуля тестовые UEFI-машины с эмулируемым NVMe-диском на 4 ТБ и запускает в них точный установщик. test-report.json записывает хеши того, что прошло проверку, и install.sh отказывается запускаться, если код отличается от этого отчёта.
24 сценария охватывают реальные отключения питания во время работы с пакетами, во время финальной очистки и после финальной записи, паники и зависания ядра, падение GitHub на каждом этапе и машину, которую необходимо отклонить. from-zero собирает машину с настоящим скриптом personal_server из настоящего архива Ubuntu, видит, как проверка её отклоняет, обновляет её и видит, как проверка проходит. Для from-zero нужен клон personal_server рядом с этим репозиторием.
То, что не могут показать виртуальные машины, перечислено в PROCEDURE.md. Главное — реальная прошивка, которую проверяет загрузка 1 на самой машине.
Это запускалось на сервере, доступном из интернета, с NVMe-диском на 4 ТБ и RTX 5090 2026-11-02. У той машины нет удалённой консоли, только выключатель питания в сети. Первая загрузка через штатный GRUB прошла все проверки: 7.0.0-43 было единственным ядром, а исправление подтверждено в живой памяти ядра.
Первая версия этого процесса там работала, но была неправильной. systemd убил её в последние миллисекунды, потому что она удаляла свой собственный unit-файл во время работы. Она также объявляла себя complete до того, как загрузился штатный GRUB, и содержала в себе сведения о той машине. Этот репозиторий — переработка. Независимые проверки затем нашли ещё реальные дефекты до повторного запуска, включая проверку, которая остановила бы каждый реальный NVMe-хост после изменения его пакетов.
├── ANALYSIS.md what the bug is, what MPTCP changes, and the limits of that
├── upstream-fix.diff the two-line upstream fix
├── filter/ an interim packet filter. It reduces exposure and isn't a fix
└── kernel-upgrade/
├── PROCEDURE.md the full procedure, failure table and crash boundary
├── install.sh the entry point
├── upgrade.py the controller and the audit publisher
├── lock.json what to install, with hashes
├── cuda-probe.c a real GPU allocation, for the health check
├── test_upgrade.py logic tests against a real Git remote
├── test-report.json what passed, and the exact bytes it covered
├── test-evidence/ the journal of each VM scenario
└── vm/ the VM test harness
Код выпущен под лицензией Unlicense. Пакеты сохраняют собственные лицензии. В релизе размещены пакеты ядра от Canonical и dkms, поскольку промежуточный архив удаляет старые сборки. Пакеты NVIDIA здесь не распространяются: они берутся из вашего собственного архива Ubuntu.