
Проверка подверженности и безопасная лаборатория одноразовых ВМ для CVE-2026-23111 (повышение привилегий на локальном уровне из-за use-after-free в nf_tables Linux). Защита: обнаружение, смягчение, лаборатория с несколькими дистрибутивами. Без эксплойта.
Оборонительные средства и воспроизводимая виртуальная машина для CVE-2026-23111 — use-after-free локальное повышение привилегий в nf_tables ядра Linux (инвертированная проверка активности элемента в nft_map_catchall_activate(), ошибка «off by !»). Непривилегированный локальный пользователь может повысить привилегии до root и выйти из контейнера через непривилегированные пользовательские пространства имён.
Этот репозиторий не содержит эксплойта. В нём представлены: проверяющий скрипт только для чтения, скрипт для создания действительно непривилегированного пользователя и определения ВМ, чтобы вы могли безопасно воспроизвести ошибку и изучить публичные исследования. Полная цепочка получения root находится в раскрытиях по ссылкам ниже, а не здесь.
Полный отчёт: https://techearl.com/cve-2026-23111-nftables-lpe
check-exposure.sh — детектор только для чтения: версия ядра по сравнению с исправленной сборкой, наличие nf_tables, предусловие с непривилегированным userns, а также сигнатуры крахов в логе ядра.setup-unprivileged-user.sh — создаёт пользователя labuser без прав sudo и доказывает, что он непривилегирован. Смысл теста LPE в том, чтобы начать с пользователя, который ещё не может стать root.Vagrantfile — одноразовые ВМ с Debian 12 и AlmaLinux 10 (дистрибутивы, которые Multipass не может запустить).Контейнер использует ядро хоста. Запуск эксплойта ядра внутри контейнера запускает его против реального ядра хоста, поэтому «тест» может скомпрометировать реальную машину. Используйте одноразовую ВМ со своим собственным ядром.
Multipass запускает только Ubuntu, поэтому для остальных используется Vagrant.
Каждому дистрибутиву нужен был свой трюк для загрузки действительно пред-исправленного ядра, которое всё ещё имеет рабочую сеть на облачной ВМ:
linux-aws, а не linux-generic. Обычному ядру не хватает драйвера ENA NIC от AWS, и на экземпляре Nitro теряется SSH. sudo apt install -y linux-image-6.8.0-1028-aws (ниже исправленного 6.8.0-1051), установите его по умолчанию в GRUB, перезагрузитесь. На локальной виртуализации обычное ядро подходит.deb [check-valid-until=no trusted=yes] https://snapshot.debian.org/archive/debian/20251201T000000Z/ bookworm main, затем apt install -y linux-image-6.1.0-39-cloud-amd64=6.1.148-1 (ниже исправленного 6.1.164-1, DSA-6163-1).el10_1 находятся в хранилище версии 10.1. Укажите dnf на https://vault.almalinux.org/10.1/BaseOS/x86_64/os/ и выполните dnf install kernel-6.12.0-124.38.1.el10_1, затем .# 1. Создайте действительно непривилегированного пользователя и докажите, что он не может использовать sudo.
# (useradd, а не adduser от Debian, чтобы работало и на RHEL.)
sudo bash setup-unprivileged-user.sh labuser
# 2. Заключение о подверженности.
sudo ./check-exposure.sh
# 3. От имени labuser — предусловие, затем публичный nft-триггер внутри пространства имён сети.
sudo -u labuser unshare -Ur id # uid=0 в новом userns = предусловие открыто
# (отклонено на стандартной Ubuntu 24.04 = смягчение работает)
# Публичный триггер FuzzingLabs (catchall GOTO + прерванная транзакция). Приведён здесь в качестве
# документации; этот репозиторий не содержит исполняемого файла эксплойта/триггера.
sudo -u labuser unshare -Urn bash -c '
nft add table inet t; nft add chain inet t c
nft add map inet t m "{ type ipv4_addr : verdict; }"
nft add element inet t m "{ * : goto c }"
printf "delete element inet t m { * }\ndelete element inet t m { 1.2.3.4 }\n" > /tmp/b.nft
nft -f /tmp/b.nft; nft flush ruleset'
Эта последовательность запускает ошибочный путь прерывания; она не включает цепочку повышения привилегий, и на стандартном ядре она молчалива (см. ниже).
Честный вывод по триггеру: на стандартном рабочем ядре он молчалив. Он запускает ошибочный путь прерывания без краха и вывода в dmesg, даже в цикле с освобождением и повторным использованием. Вывод KASAN: slab-use-after-free в отчётах появляется на ядре с KASAN/отладкой; превращение латентного use-after-free в эксплойт требует кучевую атаку (не в этом репозитории). Лаборатория доказывает, что непривилегированный пользователь достигает ошибки, показывает, что стандартное ограничение AppArmor в Ubuntu блокирует этот путь, и даёт чёткое заключение УЯЗВИМО / СМЯГЧЕНО / ИСПРАВЛЕНО. Она не предоставляет оболочку root, и это сделано намеренно.
Ограничьте непривилегированные пользовательские пространства имён (закрывает реалистичный путь для публичных эксплойтов), затем исправьте ядро.
# Ubuntu 23.10+ (на основе AppArmor, оставляет работоспособными легитимные userns):
echo "kernel.apparmor_restrict_unprivileged_userns=1" | sudo tee /etc/sysctl.d/99-restrict-userns.conf
sudo sysctl --system
# Остальные системы (полное отключение; установите оба на Debian/Ubuntu):
printf 'kernel.unprivileged_userns_clone=0\nuser.max_user_namespaces=0\n' | sudo tee /etc/sysctl.d/99-restrict-userns.conf
sudo sysctl --system
# Исправление (Ubuntu 24.04 generic исправлен на 6.8.0-107.107):
sudo apt update && sudo apt install --only-upgrade linux-image-generic && sudo reboot
MIT. Для оборонительного и образовательного использования.
| Дистрибутив | Запуск с | Почему |
|---|
| Ubuntu 24.04 / 22.04 | Multipass (только Ubuntu) | Exodus воспроизведён на обоих; в 24.04 ограничение AppArmor userns включено по умолчанию, поэтому показывает работу смягчения. |
| Debian 12 | Vagrant (vagrant up debian) | Exodus воспроизведён на нём; непривилегированный userns открыт по умолчанию. |
| AlmaLinux / Rocky 10.1 | Vagrant (vagrant up alma) | Соответствует целевому ядру 6.12.0-124.x.el10 от FuzzingLabs, поэтому их публичный триггер воспроизводится так, как опубликован. |
grubby --set-default| Дистрибутив | Загружено уязвимое ядро | userns по умолчанию | Заключение |
|---|
| Ubuntu 24.04 | 6.8.0-1028-aws | ограничен (AppArmor) | СМЯГЧЕНО, не исправлено |
| Debian 12 | 6.1.0-39-cloud (6.1.148-1) | открыт | УЯЗВИМО |
| AlmaLinux 10.1 | 6.12.0-124.38.1.el10_1 | открыт | УЯЗВИМО |