
Локальный эксплойт для повышения привилегий для 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 на диске,
в обход механизмов целостности, которые полагаются исключительно на метаданные файла
или контрольные суммы на уровне блоков.
| Поле | Значение |
|---|---|
| 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 |
.
├── 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.Поддерживаемые архитектуры:
| Архитектура | Варианты |
|---|---|
| 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 | — |
Отслеживайте попытки эксплуатации в реальном времени с помощью detect.bt. Требуется root:
sudo bpftrace detect.bt
# или
doas bpftrace detect.bt
Скрипт отслеживает три индикатора для каждого PID с помощью битовой маски в @suspect[pid]:
| Бит | Системный вызов | Индикатор |
|---|---|---|
0x1 | socket(AF_ALG, SOCK_SEQPACKET) | Создан сокет AF_ALG |
0x2 | setsockopt(SOL_ALG, ...) | Настроена криптооперация |
0x4 | sendmsg(MSG_MORE) + splice() | Попытка перезаписи page-cache |
Срабатывание сигнала происходит, когда все три бита установлены (@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