
Идемпотентный shell-скрипт, который устанавливает постоянное правило iptables, отбрасывающее IPv4 TCP-пакеты с IP-опциями, для смягчения CVE-2026-98432 на Ubuntu и Debian до выхода исправленного ядра.
Единый идемпотентный скрипт, который отбрасывает входящие TCP-пакеты IPv4 с IP-опциями, сохраняет правило между перезагрузками и проверяет его работоспособность. Он предназначен для серверов Ubuntu (18.04 – 24.04) и Debian (11 – 13), которые пока не могут получить исправленное ядро.
Это временная мера, а не исправление. Единственное настоящее исправление — пропатченное ядро плюс перезагрузка. Удалите это смягчение, как только сервер будет работать на исправленном ядре.
curl -fsSL https://raw.githubusercontent.com/Mervent/cve-2026-98432/master/install.sh | sudo sh
Вы можете запускать его любое количество раз: файлы перезаписываются, а правило никогда не дублируется. В конце скрипт проверяет результат и завершается с ненулевым кодом при любой ошибке:
--- validation ---
OK helper installed: /usr/local/sbin/cve-2026-98432-mitigation
OK cron entry: /etc/cron.d/cve-2026-98432
OK cron service enabled
OK iptables rule active (raw/PREROUTING)
OK exactly one rule (no duplicates)
plain SYN: connected, SYN with IP options: timeout
OK drop test: packets with IP options are dropped
--- rule counters ---
pkts bytes target prot opt in out source destination
3 204 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 u32 "0x0>>0x18&0xf=0x6:0xf" /* cve-2026-98432 */
| Путь | Назначение |
|---|---|
/usr/local/sbin/cve-2026-98432-mitigation | Вспомогательный скрипт, который содержит правило. Без аргументов добавляет правило, если оно отсутствует. --check завершается с кодом 0, если правило активно. --remove удаляет его. |
/etc/cron.d/cve-2026-98432 | Запись @reboot, которая повторно применяет правило после каждой загрузки |
Само правило:
iptables -t raw -I PREROUTING -p tcp -m u32 --u32 "0>>24&0xF=6:15" \
-m comment --comment cve-2026-98432 -j DROP
sudo /usr/local/sbin/cve-2026-98432-mitigation --check && echo active
sudo iptables -t raw -L PREROUTING -v -n | grep cve-2026-98432
sudo /usr/local/sbin/cve-2026-98432-mitigation --remove
sudo rm /usr/local/sbin/cve-2026-98432-mitigation /etc/cron.d/cve-2026-98432
Чтобы узнать, выпустил ли ваш дистрибутив исправление, проверьте
Ubuntu или Debian
(для Debian 9 – 11 — трекер Freexian ELTS).
Как только для вашего релиза появится статус "Fixed", выполните apt update && apt full-upgrade, перезагрузитесь, а затем удалите временную меру защиты.
По состоянию на 1 ноября 2026 года Debian 12 (linux 6.1.190-1, DLA-4841-1) и Debian 13 (linux 6.12.113-1,
DSA-6568-1) уже имеют исправленные ядра, поэтому на этих релизах выполняйте обновление вместо использования этого скрипта.
Исправление для Debian 11 (linux 5.10.272-1, ELA-1846-1) доступно только в репозитории ELTS от Freexian: коммерческом,
но бесплатном по запросу для частных лиц и небольших некоммерческих организаций.
CVE-2026-98432 ("ipv4: free inet_opt and ireq_opt after an RCU grace period") — это use-after-free в рукопожатии IPv4 TCP. Она затрагивает Linux 4.4 и более поздние версии и имеет оценку CVSS 9.8.
Если SYN содержит опции IPv4, ядро сохраняет их в request-сокете, чтобы отразить их в
SYN-ACK. Затем tcp_v4_syn_recv_sock() передаёт этот буфер дочернему сокету без копирования.
Когда дочерний сокет уничтожается, буфер освобождается обычным kfree(), в то время как другой CPU может всё ещё
читать его для формирования SYN-ACK в ответ на повторно переданный SYN.
Всё это происходит в ядре до того, как какое-либо приложение увидит соединение. Любой прослушиваемый порт IPv4 TCP достижим таким образом (SSH, HTTP, PostgreSQL и так далее), и учётные данные не требуются. Anthropic сообщила о работающем эксплойте для удалённого получения root на хостах, имеющих слушатель multipath TCP (MPTCP). Команда безопасности Go отмечает, что ошибка не специфична для MPTCP.
Память, которая освобождается слишком рано, существует только тогда, когда входящий SYN содержит опции IPv4. Без опций сохранённого буфера нет, поэтому use-after-free не на что воздействовать. Легитимный трафик TCP практически никогда не содержит опций IPv4, поэтому отбрасывание таких пакетов ничего не стоит на практике. Red Hat (RHSB-2026-016) и AlmaLinux публикуют эквивалентное правило nftables.
u32 "0>>24&0xF=6:15" читает поле IHL — длину заголовка IPv4 в 32-битных словах. Значение 5 —
это голый 20-байтовый заголовок. Значения от 6 до 15 означают наличие опций.
Red Hat заявляет, что такое правило "снижает подверженность этой уязвимости, но не может полностью её предотвратить". Рассматривайте его как снижение риска до тех пор, пока ядро не будет исправлено.
raw / PREROUTINGPREROUTING видит каждый входящий пакет — как трафик к хосту, так и трафик, перенаправляемый в контейнеры Docker
на опубликованных портах. Правило в INPUT, куда ufw помещает свои правила, пропустило бы
перенаправляемый трафик.raw обрабатывается до отслеживания соединений, поэтому отброшенные пакеты никогда не создают записи conntrack.raw/PREROUTING, поэтому правило переживает их перезапуски.iptables присутствует на каждом целевом релизе Ubuntu. На Ubuntu 18.04 и 20.04 он использует legacy
backend; начиная с Ubuntu 22.04 и на Debian 11+ это iptables-nft. Бинарный файл nft не установлен
по умолчанию везде. В Debian сам iptables может отсутствовать; тогда скрипт попросит вас выполнить
apt install iptables.iptables-nft ufw/Docker и это правило используют общий backend nf_tables, поэтому одно правило покрывает оба.u32 нужен модуль ядра xt_u32. Если он отсутствует, скрипт завершится с ошибкой и сообщит вам
проверить modinfo xt_u32.@rebootnftables.service. В Ubuntu /etc/nftables.conf начинается с flush ruleset, а
служба при остановке выполняет nft flush ruleset. Любое из этих действий стирает правила ufw и Docker.iptables-persistent. netfilter-persistent save сохраняет все текущие правила, включая
правила Docker, а восстановление этого снимка при загрузке конфликтует с правилами, которые Docker создаёт сам.before.rules. Это работает только при включённом ufw, а его цепочки не видят
перенаправляемый трафик к контейнерам./etc/cron.d идемпотентен за счёт
перезаписи, а его удаление — это один rm. Компромисс — окно в несколько секунд после загрузки, когда
сеть уже работает, но cron ещё не применил правило. Это приемлемо для меры смягчения, которая
должна действовать лишь до следующего обновления ядра.net.mptcp.enabled=0Отключение MPTCP устраняет предусловие единственного опубликованного эксплойта, но не саму уязвимость. Обычные TCP-слушатели
всё равно проходят через тот же уязвимый код. На сервере без слушателей MPTCP
(ss -Mlnp ничего не выводит) sysctl вообще ничего не меняет. Это безвредное дополнение, а не
замена этому правилу.
Скрипт проверяет, что вспомогательный скрипт и запись в cron установлены, что cron включён и что
активно ровно одно правило. Затем он запускает сквозной тест отбрасывания с помощью python3, пропускаемый, если python3
отсутствует: