
cve-2026-46331-audit script
Сценарий аудита только для чтения для CVE-2026-46331 (также известного как pedit COW) — частичной ошибки копирования при записи в действии act_pedit модуля net/sched ядра Linux, которая позволяет локальному непривилегированному пользователю повредить память страничного кеша и повысить привилегии до root.
____ _____ ____ ___ _____ ____ _____ __
| _ \| ____| _ \_ _|_ _| / ___/ _ \ \ / /
| |_) | _| | | | | | | | | | | | | \ \ /\ / /
| __/| |___| |_| | | | | | |__| |_| |\ V V /
|_| |_____|____/___| |_| \____\___/ \_/\_/
CVE-2026-46331 net/sched act_pedit partial COW
Функция tcf_pedit_act() вычисляет диапазон COW для skb_ensure_writable() один раз перед циклом ключей, используя tcfp_off_max_hint. Типизированные ключи добавляют смещение заголовка во время выполнения, которое подсказка не покрывает, поэтому часть итоговой записи оказывается за пределами области COW. В результате: общие страницы страничного кеша повреждаются, а кэшированный бинарный файл setuid (классическая цель: /bin/su) может быть отравлен в памяти. Хэши на диске остаются чистыми. Мониторы целостности файлов этого не увидят.
Тот же семейство ошибок, что и Dirty COW (CVE-2016-5195), Dirty Pipe (CVE-2022-0847), Copy Fail (CVE-2026-31431) и Dirty Frag (CVE-2026-46300). Точка входа отличается, ошибка владения страницей та же.
Строго триаж только для чтения. Никогда не загружает модули, не трогает sysctl, не выполняет PoC. Разработан для безопасного запуска в рабочей среде.
act_pedit по четырем независимым сигналам:
lsmod)modinfo)/boot/config-$(uname -r), /proc/config.gz, modules.builtin)blacklist или переопределение install ... /bin/true в modprobe.dtc action pedit (информационно; без изменений).user.max_user_namespaces, kernel.unprivileged_userns_clone и ограничения AppArmor в Ubuntu.sudo ./cve-2026-46331-audit.sh # полный текстовый отчёт
sudo ./cve-2026-46331-audit.sh --json # машиночитаемый JSON, без баннера
sudo ./cve-2026-46331-audit.sh --quiet --no-hunt # однострочный вердикт для массового сканирования
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 # расширение окна поиска IoC
sudo ./cve-2026-46331-audit.sh --no-banner # текстовый отчёт без ASCII-баннера
Смотрите examples/sample-output.txt для полного запуска и examples/sample-output.json для JSON-формы.
Оценка представляет собой взвешенную комбинацию:
Ограничено 100. Всё выше ~70 следует считать срочным на мультитенантных узлах/CI/Kubernetes; ниже ~20 обычно подтверждает, что хост в порядке.
ansible -i inventory all -m script \
-a "cve-2026-46331-audit.sh --json --quiet --no-hunt" \
--become \
| tee /tmp/audit.jsonl
Затем агрегируйте с помощью jq:
grep -v '^[a-z]' /tmp/audit.jsonl | jq -s 'group_by(.verdict) | map({verdict: .[0].verdict, hosts: length})'
- name: audit CVE-2026-46331
ansible.builtin.script: cve-2026-46331-audit.sh --quiet --no-hunt
register: audit
failed_when: audit.rc == 2
changed_when: false
В порядке предпочтения. Сценарий порекомендует правильную на основе того, что он обнаружил.
# Вариант 1: заблокировать act_pedit, если вы его не используете.
tc actions list action pedit # ДОЛЖНО быть пустым перед этим действием
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
lsmod | grep -q act_pedit && sudo rmmod act_pedit
# Вариант 2: ограничить непривилегированные пространства имён пользователей.
# Нарушит работу rootless Podman/Docker, песочниц браузера, Flatpak, непривилегированного unshare, некоторых CI-песочниц.
sudo sysctl -w user.max_user_namespaces=0 # Семейство EL
sudo sysctl -w kernel.unprivileged_userns_clone=0 # Debian/Ubuntu
Реальное исправление — обновление ядра от вендора и перезагрузка. uname -r после перезагрузки — единственное, что это подтверждает.
Это пятая итерация одного и того же архитектурного недостатка. Каждый раз исправлялась непосредственная причина, но не коренная: быстрые пути с нулевым копированием, разделяющие страницы между границами владения, где каждый писатель должен доказать приватность перед изменением байтов, в сотнях мест вызова.
Rust в ядре решает именно этот класс через типы владения. Завтра в net/sched этого не появится.
MIT. См. LICENSE.
Для авторизованного защитного использования на системах, которыми вы владеете или на которые имеете явное разрешение на аудит. Сценарий никогда не выполняет публичный PoC, не изменяет состояние системы и не загружает модули. Относитесь к вердикту как к триажу, а не как к доказательству компрометации или безопасности.
| CVE | CVE-2026-46331 |
| Компонент | Linux kernel net/sched / act_pedit |
| Класс | Частичный COW → повреждение страничного кеша → LPE |
| Вектор атаки | Локальный (CAP_NET_ADMIN, обычно получаемый через непривилегированные пространства имён пользователей) |
| Затронутые версии upstream | 5.18 .. 7.1-rc6 |
| Исправление upstream | 7.1-rc7 |
| Публичный PoC | packet_edit_meme (проверено на RHEL 10, Debian 13, Ubuntu 24.04.4) |
| Серьёзность Red Hat | Важная |
| SUSE CVSS 3.1 | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
/etc/os-release (RHEL 8/9/10, Debian 11/12/13/14, Ubuntu 18.04→26.04, SUSE, Amazon Linux, Arch-family rolling).auditd и journalctl (настраиваемое окно через --since).PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN.| Код | Значение |
|---|
| 0 | PATCHED или NOT_APPLICABLE (ядро предшествует ошибке) |
| 1 | MITIGATED (активно смягчение, ядро всё ещё уязвимо, всё равно примените исправление) |
| 2 | VULNERABLE (выполнено одно или несколько необходимых условий, ядро не исправлено) |
| 3 | UNKNOWN (считайте подозрительным в общих/CI/Kubernetes контекстах) |
| 4 | ERROR (сценарий не может быть запущен; отсутствующие инструменты или неправильное окружение) |
| Сигнал | Вес |
|---|
Vendor verdict VULNERABLE | +50 |
Vendor verdict UNKNOWN | +30 |
act_pedit встроено в ядро | +25 |
act_pedit загружаемо, не переопределено | +20 |
act_pedit загружаемо, активно переопределение | +5 |
act_pedit сейчас загружено | +5 |
| Непривилегированное userns доступно, без шлюза AppArmor | +15 |
| Непривилегированное userns доступно, активно шлюз AppArmor | +8 |
| IoC найдены в окне поиска | +10 |
| CVE | Год | Подсистема | Примитив |
|---|
| CVE-2016-5195 | 2016 | mm | COW race on read-only mapping |
| CVE-2022-0847 | 2022 | pipe / splice | pipe_buffer flag leak into page cache |
| CVE-2026-31431 | 2026 | crypto AF_ALG/AEAD | in-place crypto over read-only file cache |
| CVE-2026-46300 | 2026 | XFRM ESP-in-TCP | skbuff shared-frag marker loss |
| CVE-2026-46331 | 2026 | net/sched act_pedit | partial COW from late-resolved typed-key offset |