
Временное средство смягчения на nftables для уязвимости ядра Linux CVE-2026-98432 (UAF при обработке параметров IPv4 в tcp_v4_syn_recv_sock) в виде воспроизводимого навыка агента
Навык агента, который применяет, проверяет, сохраняет и впоследствии удаляет временное средство защиты хоста
для уязвимости ядра Linux CVE-2026-98432 (CVSS 9.8): единственное правило nftables, отбрасывающее TCP-пакеты,
несущие параметры IPv4, — единственный ввод, достигающий
use-after-free в inet_opt/ireq_opt в tcp_v4_syn_recv_sock().
Полезный контекст: Frontier Red Team компании Anthropic публично описал работающий
PoC с повышением привилегий от неаутентифицированного пользователя до root против серверов, предоставляющих доступ через слушатель MPTCP (октябрь 2026); сообщений
об эксплуатации в реальных условиях не поступало. CNA ядра оценивает в 9.8; upstream и Red Hat оценивают в 8.1
(высокая сложность атаки). Исправление от производителя — бэкпорты класса ядра Ubuntu 6.8.0-149 —
пока работающее ядро не содержит исправления, это правило служит временной мерой. Оно ограничено одним
полем одного заголовка одного протокола, поэтому обычный трафик не затрагивается.
Это правило не является новым — рассматривайте его как упакованный предшествующий опыт. См. раздел «Предшествующий опыт» ниже; вклад этого репозитория — воспроизводимая форма навыка агента плюс производственные подводные камни.
| Путь | Что |
|---|---|
SKILL.md | Навык — триггеры frontmatter, набор правил, проверки, сохранение, подводные камни, удаление |
files/cve98432.nft | Готовый к копированию набор правил nftables (prerouting, приоритет −300) |
files/nft-cve98432.service | Готовый к копированию юнит systemd (сохранение) |
cp -R cve-2026-98432-nft-mitigation ~/.claude/skills/ # Claude Code
cp -R cve-2026-98432-nft-mitigation ~/.agents/skills/ # agents-style runtimes
description во frontmatter — это поверхность обнаружения: агенты выбирают этот навык, когда их просят
устранить CVE-2026-98432, «исправление TCP/IP», UAF в параметрах IPv4 ядра или удалить
митигацию после выхода исправленного ядра от вендора.
zgrep -c CVE-2026-98432 /usr/share/doc/linux-modules-$(uname -r)/changelog.Debian.gz # Debian/Ubuntu
rpm -q --changelog kernel-core-$(uname -r) | grep -c CVE-2026-98432 # RHEL/Rocky/Alma
> 0 = исправлено, пропустите митигацию. (Также проверьте трекер вашего вендора; и
apt-cache policy linux-image-generic для установленного, но не загруженного более нового ядра.)ss -lnMp): опубликованный PoC нацелен на них, а Go ≥ 1.24 по умолчанию слушает
с MPTCP на ядрах, которые это позволяют. sysctl net.mptcp.enabled=0 влияет только на
новые сокеты — уже открытые слушатели сохраняют MPTCP до перезапуска их сервиса
(GODEBUG=multipathtcp=0 согласно команде Go).cat /sys/kernel/security/lsm перечисляет SELinux или Smack и
вы используете сопоставление NetLabel CIPSOV4, опции IPv4 там легитимны — это правило нарушит
этот путь. Не применяйте в сетях с метками CIPSO (RFC 7126 обсуждает этот компромисс).files/cve98432.nft и files/nft-cve98432.service.nft -c -f /usr/local/sbin/cve98432.nft — проверка разбора; требуются права root (без root происходит сбой
на netlink: cache initialization failed).systemctl daemon-reload && systemctl enable --now nft-cve98432.servicedestroy table … должна быть
первой строкой файла: добавленная в конец, она создаёт таблицу, а затем уничтожает её,
оставляя пустой набор правил, при этом сервис всё равно завершается с кодом 0.nft list table inet cve98432 должна показывать
meta l4proto tcp ip hdrlength > 5 counter drop в цепочке с priority -300
(до conntrack, в соответствии с опубликованным правилом).table inet … не принадлежит iptables, поэтому iptables-restore /
инструменты ufw / firewalld оставляют её нетронутой (выполните ваш restore один раз и повторно выведите список для подтверждения).Удаление после установки исправленного ядра и перезагрузки: раздел 7 в SKILL.md.
Состояние nftables привязано к сетевому пространству имён. Правила хоста видят трафик контейнера только там, где
он пересекает хост (например, контейнер → внешняя сеть); трафик, остающийся внутри собственного
пространства имён контейнера (контейнер → его собственный loopback/IP), никогда не проходит через prerouting хоста —
однако ядро общее, поэтому код внутри контейнера всё равно может локально достичь UAF. Внедрите
тот же набор правил в каждый запущенный контейнер:
# Docker (host-side nsenter keeps the needed capabilities)
for c in $(docker ps -q); do
pid=$(docker inspect -f '{{.State.Pid}}' "$c")
nsenter -t "$pid" -n /usr/sbin/nft -f /usr/local/sbin/cve98432.nft
done
# LXC (privileged CLI as root)
for c in $(lxc-ls -1 2>/dev/null); do lxc-attach -n "$c" -- nft -f /usr/local/sbin/cve98432.nft; done
Пространства имён контейнеров не сохраняют правила nft — повторно запускайте при каждом перезапуске контейнера (подключите это к шагу post-start вашего оркестратора). Предшествующие наработки по этому конкретному пробелу, со скриптами:
typhoon1217/cve-2026-98432-mitigation (inject-netns.sh).
Достаточно стандартных сокетов — никакой генерации пакетов на сервере: клиент задаёт опцию IPv4 Record
Route через setsockopt(IP_OPTIONS) и подключается; обычное подключение проходит успешно, а
подключение с опциями должно завершиться по тайм-ауту, пока счётчик правила увеличивается. Готовые клиенты:
check-blocked.py / verify-synack.sh в typhoon1217/cve-2026-98432-mitigation.
Оговорка из того проекта: клиент, который сам применяет митигацию, также будет отбрасывать
SYN-ACK-эхо целевой системы — для чистого вердикта тестируйте с клиента без митигации.
prerouting с priority -300: до conntrack, поэтому отброшенные пакеты никогда не создают
состояние conntrack — и, в отличие от input, это также охватывает трафик, пересылаемый в контейнеры/ВМ,
который проходит через хост.@nh,4,4 > 5 в
ip hdrlength > 5 — поле IHL, что подтверждается самим инструментом.typhoon1217/cve-2026-98432-mitigation — то же правило отбрасывания + инъекция в netns контейнера,
оговорка про CIPSO, клиенты для проверки (EN/KO)Извлечено из промышленного развёртывания, включая встреченные там сбои: nft -c без root, ошибка
порядка destroy в конце, неэкранированный heredoc, молча съедающий \$, и семантика
двойного применения. Репозиторий только с документацией — зависимости времени выполнения: nft ≥ 1.0 + systemd; нет набора тестов
(н/д).