
CVE-2026-46331 act_pedit эксплойт повреждения page-cache, с исправлением Alpine PIE
net/sched act_pedit — частичное повреждение page-cache при copy-on-write (коммит 899ee91156e5,
присутствует с v5.18 .. исправлено в v7.1-rc7). packet_edit_meme.c превращает её
в непривилегированный локальный root: дочерний процесс в userns с CAP_NET_ADMIN перезаписывает
кэшированные ELF-метаданные setuid-root бинарника шеллкодом
setgid(0)+setuid(0)+execve("/bin/sh").
make
./packet_edit_meme
./packet_edit_meme --ubuntu # AppArmor-gated Ubuntu: aa-exec bypass first
| Дистрибутив | Ядро | Флаг | Результат |
|---|---|---|---|
| RHEL 10.0 | 6.12.0 | (none) | ROOT |
| Debian 13 trixie | 6.12.90+deb13.1 | (none) | ROOT |
| Ubuntu 24.04.4 | 6.17.0-22 | --ubuntu | ROOT |
| Alpine edge | 7.0.10-0-stable | (none) | ROOT |
Alpine Linux (musl) компилирует PIE-исполняемые файлы, у которых исполняемый PT_LOAD
сегмент начинается со смещения в файле ≥ 0x1000 — за пределами ограничения
смещения TCP-заголовка pedit в 511 байт. Заголовок ELF и программные заголовки
занимают первый read-only PT_LOAD (смещение в файле 0). Этот адаптированный эксплойт:
Делает страницу 0 исполняемой, добавляя PF_X в поле p_flags первого PT_LOAD
по смещению в файле 0xB4 (phdr[2] + 4).
Разбивает шеллкод, чтобы не повредить критические программные заголовки LOAD:
e_entry → 0x28 (поле e_shoff, которое ядро не проверяет при
exec).0x28: 5-байтовый jmp 0x1C8.0x1C8, перезаписывающий программные заголовки PT_NOTE,
которые ядро игнорирует во время exec.Автоматически находит цель во время выполнения через find / -xdev -type f -perm -4000 -user root вместо прописанных вручную путей. Используется первый найденный читаемый всеми
setuid-root ELF-бинарник — /bin/su в Alpine (-> /bin/bbsuid,
) пропускается автоматически, так как его невозможно открыть.
Ubuntu запрещает непривилегированным процессам без AppArmor-профиля создавать userns с помощью двух sysctl:
kernel.apparmor_restrict_unprivileged_userns # denies unconfined userns creation
kernel.apparmor_restrict_unprivileged_unconfined # forces unconfined change_profile to STACK,
# so an aa-exec permissive profile cannot
# shed the userns restriction
--ubuntu повторно запускает процесс через aa-exec -p {trinity,chrome,flatpak}
(профили, содержащие правило userns,).
| Ubuntu | userns | unconfined | обход aa-exec |
|---|---|---|---|
| 24.04.4 | 1 | 0 | РАБОТАЕТ |
| 26.04 | 1 | 1 | ЗАКРЫТО |
Статический кросс-компилятор x86_64-linux-gnu:
# Debian / Ubuntu
apt install gcc-x86-64-linux-gnu
# Alpine
apk add gcc musl-dev
---s--x--x