
Linux локальный эксплойт для повышения привилегий для CVE-2026-31431, использующий AF_ALG crypto API с splice() для изменения page cache и запуска root-оболочки.
Этот репозиторий содержит небольшой PoC для локального повышения привилегий в Linux для CVE-2026-31431, также известной как "Copy Fail".
Эксплойт нацелен на путь algif_aead в пользовательском крипто-API AF_ALG ядра Linux.
Он использует AF_ALG вместе с splice() для принуждения ядра к записи
в page cache файла /usr/bin/su блоками по 4 байта, после чего выполняет su после
изменения page cache.
PoC в copy_fail_exp.py делает четыре вещи:
AF_ALG для aead с преобразованием
authencesn(hmac(sha256),cbc(aes)).setsockopt(), которые использовались в
оригинальной концепции.splice() для перемещения данных из целевого файла в путь
запроса AF_ALG, который и является уязвимым путём ядра./bin/sh.Блоб zlib — это не случайные данные. Это компактная полезная нагрузка, предназначенная для
замены начала /usr/bin/su в page cache, чтобы следующее выполнение su
запускало root-оболочку.
Уязвимый код был внедрён в изменениях algif_aead эпохи ядра Linux 4.14
и оставался до исправления в основной ветке, которое отменяет оптимизацию in-place.
algif_aead.AF_ALG, что является значением по умолчанию в
большинстве универсальных дистрибутивов Linux.| Дистрибутив | Ядро |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |
6.18.226.19.127.0Нисходящие ветки LTS безопасны только после того, как бэкпорт от вендора попадёт в пакет ядра, который вы фактически запускаете.
Используйте лабораторную ВМ или хост-контейнер, которым вы владеете. Не запускайте это на производственных системах.
/usr/bin/su существует и имеет setuid-root.python3 copy_fail_exp.py
/usr/bin/su, а затем вызовет
su. Вы должны оказаться в root-оболочке или увидеть root-приглашение, в зависимости от
окружения.Скрипт не имеет дополнительных зависимостей, кроме стандартной библиотеки Python 3.
python3 copy_fail_exp.py
Если вы хотите сначала проверить целевой файл, скрипт по умолчанию использует
/usr/bin/su.
Если вы сопровождаете нисходящее ядро, правильным исправлением является бэкпорт отмены из основной ветки, которая удаляет оптимизацию AEAD in-place:
a664bf3d603dc3bdcf9ae47cc21e0daec706d7a572548b093ee3.Рекомендуемый рабочий процесс для дерева нисходящего ядра:
git cherry-pick a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
make olddefconfig
make -j"$(nproc)"
make modules_install
make install
reboot
Если вы не пересобираете ядра самостоятельно, установите пакет ядра от вендора, содержащий бэкпорт, и перезагрузитесь в него.
Если патчинг задерживается, отключите путь модуля в качестве временной меры:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
Это смягчение, а не исправление.