
Эксплойт и детектор для локального повышения привилегий в ядре 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 мая | Обнаружены первые попытки активной эксплуатации |
# Получить версию ядра
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), завершится ошибкой или покажет числовые идентификаторы. Для очистки:
# Без привилегий: запросить удаление кэша страниц /etc/passwd:
python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); \
os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)"
# Из root-консоли:
echo 3 > /proc/sys/vm/drop_caches
Перезагрузка также очищает его.
write4sendmsg([AAD из 8 байт], cmsg=[ALG_SET_OP=DECRYPT, ALG_SET_IV, ALG_SET_AEAD_ASSOCLEN=8],
flags=MSG_MORE)
splice(target_fd, pipe_w, 32, offset_src=file_offset)
splice(pipe_r, op_fd, 32)
recv(op_fd) # EBADMSG; временная запись уже выполнена
4 байта с позиций 4–7 AAD (seqno_lo) записываются
authencesn в целевой scatter-list, который в этом пути кода
является страницей кэша страниц, извлечённой из target_fd. Смещение приземления
внутри страницы соответствует offset_src, переданному в splice().
Пока исправленное ядро не поступит в ваш дистрибутив:
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
После применения патча test_cve_2026_31431.py должен показать сообщение «Предусловие
не выполнено» и выйти с кодом 0.
Исходное исправление возвращает операции AEAD in-place к операциям out-of-place, не допуская страницы кэша страниц в изменяемые scatter-списки.
algif_aeadalgif_aead в журналах аудитаПоследнее обновление: 3 мая 2026 года
Статус: 🔴 КРИТИЧЕСКИЙ - Требуется немедленное действие
| 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 |