
Скрипт для проверки системы на уязвимость к CVE-2026-23111
CVE-2026-23111 — это уязвимость ядра Linux в nf_tables, которая может быть использована для локального повышения привилегий непривилегированным пользователем в системах, где доступны пользовательские пространства имён и nftables.[1][2] Публичные рекомендации от производителей и правительственных организаций описывают её как локальную проблему, затрагивающую дистрибутивы Linux, и подчёркивают, что основным исправлением является установка патча.[3][4]
Этот репозиторий содержит защитный проверочный скрипт, предназначенный для оценки того, создаёт ли хост технические условия, связанные с данной CVE, не предоставляя эксплойт для повышения привилегий. Он проверяет соответствующие условия ядра и среды выполнения, опционально загружает модуль nf_tables для полного функционального тестирования, пытается выполнить контролируемый непривилегированный путь проверки с помощью unshare и nft, собирает локальные диагностические трассы и классифицирует хост по операционным вердиктам, таким как «вероятно безопасен», «заблокирован локальной политикой» или «доступен уязвимый путь».[1][5]
Согласно NVD, CVE-2026-23111 — это уязвимость ядра Linux в nf_tables, исправленная как логическая ошибка в netfilter, которая может быть использована для локального повышения привилегий от непривилегированного пользователя через пользовательские пространства имён и nftables в уязвимых конфигурациях.[1] Уведомление безопасности Ubuntu описывает тот же путь эксплуатации высокого уровня и отслеживает состояния уязвимых и исправленных пакетов по выпускам.[2]
Red Hat сообщает, что локальный пользователь с низким уровнем привилегий может использовать проблему для отказа в обслуживании или потенциально для повышения привилегий, и документирует путь смягчения, основанный на предотвращении загрузки модуля nf_tables, если это приемлемо для эксплуатации.[3] Национальные рекомендации от Канадского центра кибербезопасности также указывают затронутым организациям на обновления от производителей и упоминают регенерацию initramfs при использовании блокирующих модуль механизмов смягчения.[4]
Скрипт предназначен для защитной оценки подверженности, а не для эксплуатации. Он предназначен для:
CONFIG_USER_NS и CONFIG_NF_TABLES.[1]kernel.unprivileged_userns_clone и user.max_user_namespaces для оценки доступности непривилегированных пользовательских пространств имён.install nf_tables /bin/false) или слабого чёрного списка для модуля nf_tables./proc/kallsyms для уязвимого символа (nft_map_catchall_activate) по сравнению с исправленным символом (nft_catchall_set_activate) до любого взаимодействия с модулем.nf_tables через modprobe при указании (см. ниже) и автоматической выгрузки при выходе.Скрипт сохраняет журналы в подкаталог каталога скрипта и удаляет их по умолчанию, если не используется --keep-logs.
По умолчанию скрипт никогда не загружает nf_tables. Если модуль ещё не загружен на момент запуска скрипта, все функциональные тесты nft пропускаются, и вердикт выводится только на основе версии ядра, отпечатка kallsyms, конфигурации modprobe, журнала изменений RPM и свидетельств политики LSM.
Этот консервативный стандарт позволяет избежать непреднамеренного расширения поверхности атаки на производственных хостах. Для включения полного функционального тестирования на контролируемой или инструментированной системе используйте --allow-load-module от root (см. ниже).
# По умолчанию — без загрузки модуля, вердикт только на основе свидетельств политики
./check_cve_2026_23111.sh
./check_cve_2026_23111.sh --color
./check_cve_2026_23111.sh --keep-logs
./check_cve_2026_23111.sh --color --keep-logs
# Полное функциональное тестирование — загружает (и выгружает) nf_tables, требует root
sudo ./check_cve_2026_23111.sh --allow-load-module
sudo ./check_cve_2026_23111.sh --allow-load-module --color --keep-logs
--allow-load-moduleИспользуйте --allow-load-module, когда вам нужен вердикт с наибольшей степенью уверенности на изолированной, непроизводственной или специально созданной тестовой ВМ. Типичные сценарии:
Не используйте --allow-load-module на производственных хостах, где nf_tables намеренно заблокирован или где его загрузка нарушит политику усиления безопасности.
--allow-load-moduleПеред попыткой загрузить модуль скрипт выполняет следующие проверки и завершает работу с ошибкой, если любая из них не выполняется:
install nf_tables /bin/false) не должен присутствовать в /etc/modprobe.d/.modprobe должна быть доступна в системе.root (uid 0).Если модуль успешно загружен скриптом, при выходе вызывается modprobe -r nf_tables через обработчик cleanup(), независимо от того, как завершился скрипт (успех, ошибка или CTRL+C).
Скрипт использует операционные вердикты, а не результаты эксплуатации:
Эти вердикты предназначены для поддержки приоритизации патчей и защитной сортировки, а не для замены проверки статуса пакетов от вендора.
Скрипт сопоставляет работающее ядро с задокументированными точками исправления в upstream:
Основное рекомендуемое действие — установить обновление ядра от вендора и перезагрузиться в исправленное ядро.[2][3][4] Поскольку эксплуатация зависит от локальной поверхности атаки ядра, дополнительное усиление может уменьшить подверженность, пока патч планируется или проверяется.[5][6]
nf_tables, если система не требует функциональности nftables и изменение было проверено на операционное влияние.[3][4]CAP_NET_ADMIN, и уменьшите количество учётных записей, которые могут манипулировать состоянием брандмауэра.[5]Ограничение непривилегированных пользовательских пространств имён:
echo 'kernel.unprivileged_userns_clone=0' > /etc/sysctl.d/99-cve-2026-23111.conf
echo 'user.max_user_namespaces=0' >> /etc/sysctl.d/99-cve-2026-23111.conf
sysctl --load /etc/sysctl.d/99-cve-2026-23111.conf
Блокировка загрузки модуля nf_tables, когда это безопасно с точки зрения эксплуатации:
echo 'install nf_tables /bin/false' > /etc/modprobe.d/disable-nf_tables.conf
rmmod nf_tables 2>/dev/null || true
Если используется механизм смягчения на основе блокировки загрузки модуля, некоторые рекомендации советуют пересоздать initramfs, чтобы заблокированный модуль не загружался во время ранней загрузки.[4]
Ubuntu документирует ограничения AppArmor для непривилегированных пользовательских пространств имён как способ уменьшения поверхности атаки, а не как полную замену исправлений ядра.[6] Хост может казаться менее подверженным при тестировании среды выполнения, поскольку путь атаки блокируется локально, хотя долгосрочное устранение всё равно требует установки исправленного пакета ядра от вендора.[2][6] Скрипт проверяет эффективность ограничений AppArmor, пытаясь выполнить фактический вызов unshare --user и проверяя, работает ли CAP_NET_ADMIN внутри пространства имён пользователя+сети.
Red Hat явно указывает предотвращение загрузки модуля nf_tables в качестве меры смягчения для CVE-2026-23111, когда такое изменение уместно для среды.[3] Скрипт обнаруживает эту конфигурацию через check_modprobe_deny() и различает жёсткий запрет (install nf_tables /bin/false, который блокирует загрузку по требованию) и слабый чёрный список (который этого не делает). В системах RHEL-семейства скрипт также проверяет журнал изменений RPM работающего ядра на наличие записи о бэкпорте CVE-2026-23111, что позволяет вынести вердикт, подтверждённый вендором, независимо от номера версии upstream.
Этот README и сопутствующий скрипт предназначены для защитной проверки, инвентаризации и планирования смягчения последствий. Они не заменяют рекомендации вендоров, проверку на уровне пакетов или стандартные процессы управления патчами и не должны использоваться как замена применению официальных исправлений, описанных в связанных рекомендациях.[2][3][4]
Репозиторий для изучения, тестирования и исследования концепций кибербезопасности в контролируемых средах.
Этот репозиторий предназначен только для образовательных и авторизованных исследований в области безопасности.
Он разработан, чтобы помочь пользователям изучать:
Используйте этот репозиторий только в средах, где у вас есть разрешение, например:
Несанкционированное или незаконное использование строго запрещено.
Автор и участники не несут ответственности за любой ущерб, неправильное использование, юридические проблемы или убытки, вызванные этим проектом.
Используя этот репозиторий, вы соглашаетесь с тем, что:
Этот проект предназначен для:
Пожалуйста, соблюдайте практики ответственного раскрытия информации и соблюдайте все применимые законы.
Для ответственного раскрытия информации или сотрудничества свяжитесь с сопровождающим репозитория через GitHub.
--allow-load-moduleunshare -U -n --map-root-user + nft при загруженном модуле, с записью stdout, stderr и недавних сообщений ядра.unshare --user действительно создаёт пространство имён и что CAP_NET_ADMIN работает внутри него, чтобы подтвердить, действительно ли ограничения AppArmor или SELinux эффективны.| Параметр | Описание |
|---|
--allow-load-module | Разрешить скрипту загружать nf_tables через modprobe, если модуль ещё не загружен. Включает полный тест пути catchall в nft и тест эффективности CAP_NET_ADMIN. Модуль автоматически выгружается при выходе. Требует root. Отклоняется, если уже установлен жёсткий запрет modprobe. Используйте только на непроизводственных или инструментированных системах. |
--color | Включить цветной вывод в stdout, если терминал поддерживает. |
--keep-logs | Сохранять журналы и трассы в каталоге скрипта вместо удаления при выходе. |
--help | Показать информацию об использовании и выйти. |
| Вердикт | Значение |
|---|
not-affected | Версия ядра ниже 5.13; функция catchall-элементов ещё не была введена, и уязвимый путь кода отсутствует. |
likely-patched-vendor-confirmed | CVE-2026-23111 найдена в журнале изменений RPM ядра от вендора, что подтверждает бэкпортированное исправление независимо от версии upstream. |
likely-patched-upstream-confirmed | Версия ядра находится в исправленном диапазоне upstream и функциональный тест nft вернул ненулевой результат без сигнала от ядра — наиболее сильное статическое + динамическое свидетельство безопасного состояния. |
likely-patched-upstream | Версия ядра находится в исправленном диапазоне upstream, но функциональный тест не выполнялся (модуль отсутствует или результат неубедителен). Всё равно следует проверить статус патча от вендора. |
likely-safe-or-patched | Скрипт не подтвердил путь эксплуатации; причина неоднозначна: исправленное ядро, отсутствие уязвимого кода или неявная локальная блокировка. |
blocked-by-local-policy | Проверяемый путь заблокирован AppArmor, SELinux, ограничениями пользовательских пространств имён или запретом modprobe.[6] Блокировки политикой не заменяют патч от вендора. |
exposed-path-available | Хост предоставляет путь userns + nftables, совместимый с задокументированными предпосылками эксплуатации.[1][5] |
strong-signal-lab-confirmation | Наблюдался сигнал в журнале ядра, совместимый с повреждением памяти, связанным с nf_tables. Подтверждайте только в одноразовой, инструментированной лабораторной среде. |
prerequisites-missing | Отсутствуют необходимые диагностические инструменты (unshare, nft); не выполнено значимой проверки среды выполнения. |
| Ветка | Исправлено в | Коммит upstream |
|---|
| 6.13.x+ | ≥ 6.13.1 | f41c5d1 |
| 6.12.x | ≥ 6.12.12 | 8c760ba |
| 6.6.x | ≥ 6.6.75 | b9b6573 |
| 6.1.x | ≥ 6.1.128 | 8b68a45 |
| 6.2–6.5, 6.7–6.11 | EOL upstream | только бэкпорт от дистрибутива |
| 5.15.x | зависит от дистрибутива | Amazon Linux: ALAS2KERNEL-5.15-2026-098 |
| 5.10.x | зависит от дистрибутива | Amazon Linux 2: ожидается по состоянию на март 2026 |
| 5.4.x | зависит от дистрибутива | Amazon Linux 2: ожидается по состоянию на март 2026 |
| 5.13–5.14 | EOL upstream | только бэкпорт от дистрибутива |
| < 5.13 | не подвержено | функция catchall отсутствует |