
Локальный эксплойт для повышения привилегий для CVE-2026-31431, перезапись page-cache в Linux kernel AF_ALG + splice. Включает PoC, скрипт обнаружения BPFtrace и тестовую среду QEMU для авторизованных исследований в области безопасности.
Локальное повышение привилегий в ядре Linux через AF_ALG + перезапись page-cache через splice
Только для авторизованных исследований безопасности, пентеста и образовательных целей. Не используйте против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения.
CVE-2026-31431 — это уязвимость локального повышения привилегий (LPE) в ядре Linux.
Непривилегированный локальный пользователь может получить root-доступ, комбинируя
интерфейс сокетов AF_ALG с splice() для выполнения аутентифицированной записи
напрямую в страницу page-cache, принадлежащую setuid-бинарнику.
Эксплойт перезаписывает бинарник su в page-cache без изменения inode на диске,
в обход механизмов целостности, которые полагаются исключительно на метаданные файла
или контрольные суммы на уровне блоков.
.
├── exploit.py # PoC — перезапись page-cache и повышение привилегий
├── detect.bt # BPFtrace-скрипт для обнаружения в реальном времени
├── run-vm.sh # Автоматизация тестовой среды QEMU (необязательно)
├── PAYLOAD.md # Анализ кодирования полезной нагрузки (hex → zlib → ELF → shellcode)
└── LICENSE
Запустите exploit.py от имени непривилегированного локального пользователя на любой
уязвимой системе — sudo не требуется:
python3 exploit.py
Скрипт выполняет следующие шаги:
AF_ALG (algif_aead) и находит бинарник su.su как сырой файловый дескриптор и перезаписывает его страницы
page-cache через AF_ALG + sendfile.Поддерживаемые архитектуры:
Отслеживайте попытки эксплуатации в реальном времени с помощью detect.bt. Требуется root:
sudo bpftrace detect.bt
# или
doas bpftrace detect.bt
Скрипт отслеживает три индикатора для каждого PID с помощью битовой маски в @suspect[pid]:
Срабатывание сигнала происходит, когда все три бита установлены (@suspect[pid] == 0x7)
для одного и того же PID.
exploit.pyAF_ALG/algif_aeaddetect.btbpftrace ≥ 0.12# Ubuntu/Debian
sudo apt install bpftrace
# RHEL/CentOS/Fedora
sudo dnf install bpftrace
# Amazon Linux
sudo yum install bpftrace
# SUSE
sudo zypper install bpftrace
# Alpine
sudo apk add bpftrace
Обновите пакет ядра вашего дистрибутива до версии, включающей коммит из основной ветки
a664bf3d603d,
который отменяет оптимизацию algif_aead на месте 2017 года, чтобы страницы page-cache
больше не могли попадать в записываемый scatterlist назначения. Большинство крупных
дистрибутивов уже распространяют это исправление.
algif_aead (в ожидании патча)blacklist можно обойти явным modprobe algif_aead. Директива install .../bin/false
полностью переопределяет команду установки, заставляя каждую попытку загрузки завершаться
неудачей:
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead 2>/dev/null || true
Подсистемы в строке «Нет» используют криптографический API ядра напрямую — они никогда
не проходят через AF_ALG. Производительность откатывается к обычным пользовательским
криптобиблиотекам, которые и так использует почти всё остальное.
Чтобы проверить, использует ли что-либо на вашей системе AF_ALG активно перед его
отключением:
lsof | grep AF_ALG
ss -xa | grep alg
Запретите создание socket(AF_ALG, ...) для недоверенных рабочих нагрузок независимо от
состояния патча. Добавьте AF_ALG (семейство 38) в ваш seccomp deny-list или используйте
политику AppArmor/SELinux, ограничивающую вызовы socket для непривилегированных процессов.
detect.btРазверните прилагаемый скрипт обнаружения на любом хосте, который невозможно немедленно пропатчить или заблокировать. Он предупредит о любом процессе, выполняющем полный трёхшаговый примитив эксплуатации.
run-vm.sh автоматизирует создание QEMU-виртуальной машины Ubuntu 24.04 для тестирования
в контролируемой среде. exploit.py и detect.bt работают напрямую на любом уязвимом
хосте — QEMU не требуется.
| Зависимость | Примечания |
|---|---|
qemu-system-x86_64 + KVM | См. команды установки ниже |
wget или curl | Загрузка cloud-образа |
cloud-image-utils | Генерация seed-образа (Docker может заменить на не-Debian хостах) |
# Ubuntu/Debian
sudo apt install qemu-system-x86 cloud-image-utils wget
# Fedora/RHEL
sudo dnf install qemu-system-x86 wget
# Arch
sudo pacman -Sy qemu
# Alpine
sudo apk add qemu-system-x86 qemu-ui-gtk wget
sh run-vm.sh
1. Запустить/Создать ВМ
2. Подключиться по SSH
3. Загрузить файлы в ВМ (exploit.py, detect.bt)
4. Запустить эксплойт внутри ВМ
5. Запустить detect.bt внутри ВМ
6. Проверить статус ВМ
7. Остановить ВМ
8. Очистить файлы ВМ
0. Выход
| Поле | Значение |
|---|---|
| Пользователь | ubuntu |
| Пароль | cve123 |
| SSH-порт | 2222 |
crypto/af_alg.c — исходный код ядраmm/splice.c — исходный код ядраЭтот проект распространяется под лицензией GNU General Public License v3.0 или более поздней версии. Полный текст см. в LICENSE.
Отказ от ответственности: Этот репозиторий предоставлен только для авторизованных исследований безопасности, пентеста и образовательных целей. Авторы не несут ответственности за любое неправомерное использование или ущерб, причинённый этим программным обеспечением.
| Поле | Значение |
|---|
| CVE ID | CVE-2026-31431 |
| Тип | Локальное повышение привилегий (LPE) |
| Оценка CVSS v3.1 | 7.8 High — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (источник: kernel.org) |
| Подсистемы ядра | crypto/af_alg.c, mm/splice.c |
| Вектор атаки | Локальный — требуется учётная запись непривилегированного пользователя |
| Корневая причина | algif_aead принимает sendfile() через AEAD-сокет без обеспечения семантики copy-on-write для отображаемой страницы page-cache до завершения передачи через splice() |
| Дистрибутив | Версия ядра | Архитектура |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | x86_64 |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | x86_64 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | x86_64 |
| SUSE 16 | 6.12.0-160000.9-default | x86_64 |
| Raspberry Pi OS (Pi 5) | 6.12.75+rpt-rpi-2712 | aarch64 |
| Архитектура | Варианты |
|---|
| x86_64 | — |
| aarch64 | — |
| riscv64 | — |
| ppc64le | — |
| arm | armv5l, armv6l, armv7l |
| x86 32-bit | i386, i486, i586, i686 |
| MIPS 64-bit | mips64, mips64el |
| LoongArch | loong64, loongarch64 |
| s390x | — |
| Бит | Системный вызов | Индикатор |
|---|
0x1 | socket(AF_ALG, SOCK_SEQPACKET) | Создан сокет AF_ALG |
0x2 | setsockopt(SOL_ALG, ...) | Настроена криптооперация |
0x4 | sendmsg(MSG_MORE) + splice() | Попытка перезаписи page-cache |
| Затронуто? | Подсистема/сценарий использования |
|---|
| Нет | dm-crypt/LUKS, kTLS, IPsec/XFRM, TLS внутри ядра |
| Нет | Стандартные сборки OpenSSL, GnuTLS, NSS |
| Нет | SSH, криптография keyring ядра |
| Возможно | OpenSSL с явно включённым движком afalg |
| Возможно | Пути аппаратного ускорения криптографии или приложения, напрямую привязывающие сокеты aead/skcipher/hash |