
cve-2026-46331-audit script
Скрипт аудита только для чтения для CVE-2026-46331 (также известной как pedit COW) — ошибки частичного copy-on-write в действии act_pedit подсистемы net/sched ядра Linux, которая позволяет локальному непривилегированному пользователю повредить память page cache и повысить привилегии до root.
____ _____ ____ ___ _____ ____ _____ __
| _ \| ____| _ \_ _|_ _| / ___/ _ \ \ / /
| |_) | _| | | | | | | | | | | | | \ \ /\ / /
| __/| |___| |_| | | | | | |__| |_| |\ V V /
|_| |_____|____/___| |_| \____\___/ \_/\_/
CVE-2026-46331 net/sched act_pedit partial COW
tcf_pedit_act() вычисляет диапазон COW для skb_ensure_writable() один раз перед циклом по ключам, используя tcfp_off_max_hint. Типизированные ключи добавляют смещение заголовка во время выполнения, которое не покрывается этим hint, поэтому часть итоговой записи выходит за пределы COW-области. Результат: общие страницы page cache подвергаются записи, и кэшированный бинарник setuid (классическая цель: /bin/su) может быть отравлен в памяти. Хэши на диске остаются чистыми. Мониторы целостности файлов этого не увидят.
То же семейство ошибок, что и Dirty COW (CVE-2016-5195), Dirty Pipe (CVE-2022-0847), Copy Fail (CVE-2026-31431) и Dirty Frag (CVE-2026-46300). Точка входа другая, сбой владения страницами тот же.
| CVE | CVE-2026-46331 |
| Компонент | Ядро Linux net/sched / act_pedit |
| Класс | Частичный COW → повреждение page cache → LPE |
| Вектор атаки | Локальный (CAP_NET_ADMIN, обычно получаемый через непривилегированный userns) |
| Затронуто в upstream | 5.18 .. 7.1-rc6 |
| Исправление в upstream | 7.1-rc7 |
| Публичный PoC | packet_edit_meme (проверено на RHEL 10, Debian 13, Ubuntu 24.04.4) |
| Критичность по Red Hat | Important |
| SUSE CVSS 3.1 | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
Строго read-only триаж. Никогда не загружает модуль, никогда не трогает sysctl, никогда не выполняет PoC. Разработан так, чтобы его было безопасно запускать на продакшене.
act_pedit по четырём независимым сигналам:
lsmod)modinfo)/boot/config-$(uname -r), /proc/config.gz, modules.builtin)install ... /bin/true в modprobe.d или blacklist на ядрах, которые автозагружают act_pedit через его алиас net-act-pedit (6.9+; более старые ядра запрашивают его по имени, что blacklist не останавливает)tc action pedit (информационно; без изменений).user.max_user_namespaces, kernel.unprivileged_userns_clone, user.max_net_namespaces и ограничения userns в AppArmor на Ubuntu./etc/os-release (RHEL 8/9/10, Debian 11/12/13/14, Ubuntu 18.04→26.04, SUSE, Amazon Linux, семейство Arch с rolling-релизами).auditd и journalctl (настраиваемое окно через --since и --until).PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN.sudo ./cve-2026-46331-audit.sh # full text report
sudo ./cve-2026-46331-audit.sh --json # machine-readable JSON, no banner
sudo ./cve-2026-46331-audit.sh --quiet --no-hunt # one-line verdict for mass scans
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 # widen IoC hunt window
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 --until 2026-09-01 # bounded IoC window
sudo ./cve-2026-46331-audit.sh --no-banner # text report without the ASCII banner
./cve-2026-46331-audit.sh --version # print script version and exit
| Код | Значение |
|---|---|
| 0 | PATCHED или NOT_APPLICABLE (ядро старше уязвимости) |
| 1 | MITIGATED (защитная мера активна, ядро всё ещё уязвимо, патч всё равно нужен) |
| 2 | VULNERABLE (выполнено одно или несколько обязательных предварительных условий, исправленного ядра нет) |
| 3 | UNKNOWN (считать подозрительным в контекстах shared / CI / Kubernetes) |
| 4 | ERROR (скрипт не смог запуститься; отсутствуют инструменты или неверное окружение) |
См. examples/sample-output.txt для полного запуска и examples/sample-output.json для формы JSON.
Оценка представляет собой взвешенную комбинацию:
| Сигнал | Вес |
|---|---|
Вердикт вендора VULNERABLE | +50 |
Вердикт вендора UNKNOWN | +30 |
act_pedit встроен в ядро | +25 |
act_pedit загружаемый, без переопределения | +20 |
act_pedit загружаемый, переопределение или чёрный список активны | +5 |
act_pedit в данный момент загружен | +5 |
| Непривилегированные userns+netns доступны, без AppArmor-ограничения | +15 |
| Непривилегированные userns+netns доступны, AppArmor-ограничение активно | +8 |
| IoC найдены в окне поиска | +10 |
Ограничено 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})'
failed_when в play- 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
В порядке предпочтения. Скрипт порекомендует подходящий вариант на основе того, что он обнаружил.
# Option 1: block act_pedit if you don't use it.
tc actions list action pedit # MUST be empty before doing this
# 1a) Hard block via modprobe install override (strongest).
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
# 1b) `blacklist act_pedit` only stops the autoload on kernels 6.9+, which
# request the "net-act-pedit" alias. Older kernels load it by name and
# ignore the blacklist, so prefer 1a. Check your kernel:
modinfo -F alias act_pedit | grep -qx net-act-pedit && echo "blacklist works here"
lsmod | grep -q act_pedit && sudo rmmod act_pedit
# Option 2: restrict unprivileged user namespaces.
# Will break rootless Podman/Docker, browser sandboxes, Flatpak, unprivileged unshare, some CI sandboxes.
sudo sysctl -w user.max_user_namespaces=0 # EL-family
sudo sysctl -w kernel.unprivileged_userns_clone=0 # Debian/Ubuntu