
Эксплойт и детектор для локального повышения привилегий в ядре Linux (CVE-2026-31431), который повреждает page cache для получения прав root, с рекомендациями по смягчению последствий.
Критическая 9-летняя уязвимость в ядре Linux, позволяющая получить root-доступ за секунды
| Атрибут | Детали |
|---|---|
| CVE | CVE-2026-31431 |
| Псевдоним | Copy Fail |
| Тип | Локальное повышение привилегий (LPE) |
| CVSS | 7.8 (High) |
| Обнаружена | Theori (Xint Code) |
| Раскрытие | 29 апреля 2026 года |
| Компонент | Подсистема algif_aead ядра Linux |
Ошибка в оптимизации «операции на месте» (in-place), добавленной в 2017 году (коммит 72548b093ee3). Позволяет локальному пользователю выполнить контролируемую запись 4 байт непосредственно в кэш страниц ядра.
AF_ALG для доступа к криптографическим алгоритмам ядра/usr/bin/su) или чувствительных файлов (/etc/passwd)Это логическая ошибка проектирования, а не переполнение памяти. Для обнаружения требовался глубокий анализ криптографической подсистемы.
# Ubuntu/Debian
sudo apt update
sudo apt upgrade
sudo reboot
# RHEL/AlmaLinux/Rocky
sudo dnf update kernel
sudo reboot
# Проверка версии ядра
uname -r
⚠️ Перезагрузка обязательна для активации нового ядра.
# Отключить загрузку уязвимого модуля
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/copyfail_mitigation.conf
# Выгрузить модуль, если он уже используется
sudo rmmod algif_aead
# Модуль обычно встроен в ядро
# Добавить параметр загрузки для его отключения
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
# Перезагрузиться для применения изменений
sudo reboot
# Очистить кэш страниц на лету
sudo sysctl -w vm.drop_caches=3
⚠️ Примечание: Это не заменяет патч. Только дополнительная мера.
| Дата | Событие |
|---|---|
| 29 апреля | Публичное раскрытие компанией Theori |
| 1 мая | Обнаружены первые попытки активной эксплуатации |
| 2 мая | CISA обязывает федеральные агентства США установить патч до 15 мая |
| 3 мая | Патчи доступны в Ubuntu, RHEL, AlmaLinux, Debian |
| Дистрибутив | Статус | Ссылка |
|---|---|---|
| Ubuntu | ✅ Исправлено | USN-8226-1 (20.04, 22.04, 24.04) |
| RHEL/AlmaLinux/Rocky | ✅ Доступно | С 1 мая |
| Debian | ✅ В репозиториях безопасности | Обновление доступно |
| Android | ⏳ Скоро | Бюллетень безопасности за июнь 2026 |
# Получить версию ядра
uname -r
# Уязвимо, если:
# - v4.14 до v7.0-rc (выпущено между 2017 и апрелем 2026)
# - Содержит коммит 72548b093ee3
# Проверить, загружен ли модуль algif_aead
lsmod | grep algif_aead
# Если он есть в списке, ваша система уязвима
ИИ выявил эту ошибку, которая оставалась незамеченной разработчиками в течение 9 лет. Это знаменует собой поворотный момент:
# 1. Детектирование
python3 prueba.py
# exit 0 = не уязвимо, 2 = уязвимо, 1 = ошибка теста
# 2. Эксплойт (интерактивный — su запросит ваш собственный пароль)
python3 exploit.py --shell
python3 prueba.py
Что он делает:
Подтверждает, что AF_ALG и алгоритм authencesn(hmac(sha256),cbc(aes))
доступны из непривилегированного процесса.
Создаёт файл-сторож 4 КиБ во временном каталоге и заполняет кэш страниц.
Отправляет 8 байт AAD инлайн через sendmsg+cmsg с seqno_lo, установленным в
маркер PWND, а затем копирует 32 байта из страницы кэша страниц сторожа в сокет операции AF_ALG через os.splice().
Вызывает recv() для запуска расшифровки. Проверка аутентификации завершается с
EBADMSG; временная запись всё равно выполняется.
Повторно читает файл (кэш страниц, не диск) и ищет маркер.
Классы вывода:
Предусловие не выполнено: AF_ALG или authencesn недоступны. Выход 0.УЯЗВИМО к CVE-2026-31431: маркер PWND вставлен в изменённую страницу.Выход 2.
Кэш страниц ИЗМЕНЁН через путь инлайн-вставки AEAD: запись в страницу
произошла, но маркер не вставлен в ожидаемую позицию.
Считать уязвимым. Выход 2.Кэш страниц не тронут: исправлено. Выход 0.Детектор никогда не изменяет /usr/bin/su, /etc/passwd или любые другие файлы за пределами временного каталога, который он создаёт, и этот файл удаляется по завершении.
Выход. ## Использование LPE
python3 exploit_cve_2026_31431.py # Только патч, выводит следующие шаги
python3 exploit_cve_2026_31431.py --shell # Патч и запуск `su <пользователь>`
Функция:
/etc/passwd и определяетсмещение в байтах поля UID из 4 символов.
write4 по этому смещению, заменяя UID на0000.
pwd.getpwnam(пользователь) для подтверждения, что libc теперь сообщает UID 0.--shell выполняет execvp("su", ["su", пользователь]). Введите свой собственный
пароль. PAM проверяет /etc/shadow (без изменений), затемsetuid(getpwnam(user).pw_uid) устанавливается в 0.
требуют многоразовых записей; расширьте write4 соответствующим образом.
Ни один демон кэша NSS (nscd, sssd, systemd-userdbd) не маскирует
чтения /etc/passwd. Если getpwnam всё ещё возвращает реальный UID после
применения патча, перезапустите или проигнорируйте кэш, или выберите другого пользователя.
Страница /etc/passwd должна оставаться в кэше между применением патча и
запуском su. На практике это надёжно на любой системе с нормальным давлением на память.
Файл /etc/passwd на диске остаётся без изменений.
Пробный запуск (exploit_cve_2026_31431.py без --shell) автоматически удаляет
повреждённую страницу при выходе через POSIX_FADV_DONTNEED, поэтому поиски UID → имя
немедленно возвращаются к норме.
После использования --shell** страница остаётся повреждённой до очистки.
Пока она повреждена, любая операция, разрешающая UID 1000 → имя (например, ls,
файловые менеджеры, проверки владения scp/sftp), завершится ошибкой или покажет числовые идентификаторы. Для очистки: