
Скрипт оболочки, который оценивает состояние патча ядра Ubuntu для CVE-2026-98432 и применяет постоянную временную меру через nftables или iptables, отбрасывающую IPv4 TCP-пакеты с IP-опциями.
# 1. Inspect the host; no changes.
sudo ./cve-2026-98432-mitigate.sh check
# 2. Get a patch-state verdict for the exact running kernel package.
sudo ./cve-2026-98432-mitigate.sh assess
# 3. Apply the stopgap filter and make it survive reboot.
sudo ./cve-2026-98432-mitigate.sh enable
# 4. Prove that normal TCP still works and IP-option TCP is dropped.
sudo ./cve-2026-98432-mitigate.sh verify
# 5. Monitor. Exit 0 = healthy, 1 = mismatch/persistence failure, 2 = no state.
sudo ./cve-2026-98432-mitigate.sh status
# 6. After booting a kernel that Ubuntu marks as fixed.
sudo ./cve-2026-98432-mitigate.sh disable
enable отказывается изменять набор правил при обнаружении CIPSO/NetLabel, поскольку правило отбрасывает весь TCP, несущий IP-опции, включая помеченный трафик. Используйте --ignore-cipso, только если вы принимаете этот компромисс. Контейнеры или хосты без systemd должны использовать --no-persist; в противном случае enable завершается с кодом 4, когда невозможно обеспечить сохранение после перезагрузки, при этом активное правило остаётся на месте.
CVE-2026-98432 — это use-after-free в рукопожатии IPv4 TCP в Linux. Он достижим, когда входящий SYN несёт IP-опции. Настоящее исправление — это пропатченное ядро; этот скрипт является временной мерой, которая отбрасывает входящие пакеты IPv4 TCP, длина IP-заголовка которых больше 5 (IHL 6-15), то есть пакеты, несущие IP-опции, до conntrack и Docker NAT.
Он поддерживает два эквивалентных бэкенда:
table ip cve_2026_98432, prerouting priority -310, только TCP, counter, drop.raw PREROUTING, u32 match 0>>24&0xf=6:15, только TCP, counter, drop.Форма nft использует семейство ip и числовой приоритет, поэтому она работает как на nft 0.5 в Ubuntu 16.04, так и на текущем nft 1.x. Форма iptables работает с iptables 1.6 и более поздними. Никакие пакеты не устанавливаются, если не передан --install-nft.
Скрипт проверяет полное ожидаемое правило, а не фрагменты. Для nft он требует, чтобы цепочка pre несла хук prerouting ровно с приоритетом -310 (или устаревшим написанием raw - 10), а ожидаемый DROP был первым правилом. Для iptables он требует успешного выполнения iptables -C и совпадения полного первого правила raw PREROUTING после нормализации. enable исправляет смещённое правило вместо отказа от повторного применения.
Скрипт Akamai дал идеи оценки и безопасности, приведённые ниже. Его форма принудительного применения не была принята, поскольку наша строже и совместима с 16.04. Наиболее важные включённые находки в порядке приоритета:
assess определяет точный пакет образа работающего ядра (linux-image-$KVER, затем linux-image-unsigned-$KVER, затем владельца /boot/vmlinuz-$KVER). Метапакеты, такие как linux-image-generic, показываются только как контекст и никогда не используются как доказательство для вердикта. Совпадение в changelog — сильное, но подверженное ошибкам доказательство; отсутствующий changelog плюс независимо убедительная чистая upstream-версия на уровне исправленного релиза или выше всё равно даёт PATCHED; ядро вендора без доказательств даёт UNKNOWN.enable с кодом 4 при сохранении правила активным. status оценивает сохранение независимо от runtime-состояния oneshot и отвергает enabled-runtime как непостоянное.detected отказывает по умолчанию, unknown предупреждает, not_detected продолжает. Отсутствие netlabelctl не доказывает отсутствие CIPSO.check различает проверенно-пригодный, присутствующий-непроверенный, непригодный и неизвестный; --backend nft оценивает nft, даже когда iptables работает.XDP_PASS всё равно попадает в стек ядра.-x) вывод, где это возможно, а устаревшее правило filter/INPUT из более ранней версии сообщается и удаляется после загрузки замены raw.Сопоставление правил и формат файла состояния обратно совместимы. Вам не нужно сначала выполнять disable; повторный запуск enable с этой версией исправляет правило на месте, устанавливает обновлённый загрузочный юнит и записывает новое поле персистентности. Если в старом файле состояния нет строки persist=, status определяет персистентность по состоянию юнита, а не завершается ошибкой из-за отсутствующего поля.
Операционные изменения, о которых следует знать:
enable теперь завершается с кодом 4, когда правило активно, но сохранение после перезагрузки не удалось. Ранее в этом случае он мог завершиться с кодом 0.check теперь возвращает 0 только для проверенного работоспособного бэкенда, 1 — если работоспособного бэкенда нет, 4 — если бэкенд присутствует, но не проверен, и 2 — при ошибке использования.assess — новая команда, возвращает 0/1/3/4, как описано ниже.enable, если не передан --ignore-cipso.enable, чтобы применились новый порядок юнитов и ExecStart.Подготовлено: 2026-10-30 (обновлено 2026-10-31)
Трекер Ubuntu проверен: 2026-10-31 11:59 UTC (страница последний раз обновлялась 2026-10-30). Исправленное ядро пока не выпущено.
Область применения: серверы Linux, в первую очередь Ubuntu 16.04 (xenial), 22.04 (jammy), 24.04 (noble) и 26.04 (resolute), включая хосты Docker/BTCPay.
Результат: cve-2026-98432-mitigate.sh в этом каталоге.
Протестировано на: Ubuntu 16.04, 22.04, 24.04 и 26.04.