## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-KALETH4-CVE-2026-31431
# 🚨 CVE-2026-31431: Copy Fail
> **Критическая 9-летняя уязвимость в ядре Linux, позволяющая получить root-доступ за секунды**
* * *
## 📋 Краткое резюме
Атрибут| Детали
---|---
**CVE**| CVE-2026-31431
**Псевдоним**| Copy Fail
**Тип**| Локальное повышение привилегий (LPE)
**CVSS**| 7.8 (High)
**Обнаружена**| Theori (Xint Code)
**Раскрытие**| 29 апреля 2026 года
**Компонент**| Подсистема `algif_aead` ядра Linux
* * *
## ⚡ Почему это так опасно?
### 🎯 Скорость
* Мгновенный эксплойт: **< 1 секунды** для получения root
* Python-скрипт всего **732 байта**
### 👻 Полная скрытность
* Изменяет **только оперативную память** (page cache), не диск
* Инструменты целостности файлов **не обнаруживают** это
* После перезагрузки следы исчезают (криминалистический анализ затруднён)
### 🌍 Масштабное воздействие
* Затрагивает **практически все современные дистрибутивы**
* Ядра от **v4.14 (2017) до v7.0-rc**
* Уязвимость существовала **9 лет без обнаружения**
### ☁️ Риск в Cloud/Kubernetes
* Позволяет **выйти из контейнеров** на главный узел
* Кэш страниц общий между хостом и контейнерами
* Критическое воздействие на мультитенантные среды
* * *
## 🔍 Технические детали
### Корневая причина
Ошибка в оптимизации «операции на месте» (in-place), добавленной в 2017 году (коммит `72548b093ee3`). Позволяет локальному пользователю выполнить **контролируемую запись 4 байт** непосредственно в кэш страниц ядра.
### Механизм эксплуатации
1. Атакующий использует интерфейс `AF_ALG` для доступа к криптографическим алгоритмам ядра
2. Повреждает версию в памяти setuid-бинарников (`/usr/bin/su`) или чувствительных файлов (`/etc/passwd`)
3. При запуске повреждённого бинарника получает root-шелл
### Почему это осталось незамеченным
Это **логическая ошибка проектирования** , а не переполнение памяти. Для обнаружения требовался глубокий анализ криптографической подсистемы.
* * *
## 📊 Затронутые системы
### ✅ Подтверждено
* **Ubuntu** : 20.04, 22.04, 24.04 LTS
* **RHEL/AlmaLinux/Rocky Linux** : Все современные версии
* **Debian** : Все версии с ядром v4.14+
* **Amazon Linux 2023**
* **SUSE** : Последние версии
* * *
## 🛡️ План устранения
### 1️⃣ Окончательное решение: Обновление ядра
root@kitploit:~
# Ubuntu/Debian
sudo apt update
sudo apt upgrade
sudo reboot
# RHEL/AlmaLinux/Rocky
sudo dnf update kernel
sudo reboot
# Проверка версии ядра
uname -r
⚠️ **Перезагрузка обязательна** для активации нового ядра.
* * *
### 2️⃣ Экстренное смягчение (без немедленной перезагрузки)
#### Для Ubuntu/Debian:
root@kitploit:~
# Отключить загрузку уязвимого модуля
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/copyfail_mitigation.conf
# Выгрузить модуль, если он уже используется
sudo rmmod algif_aead
#### Для RHEL/AlmaLinux:
root@kitploit:~
# Модуль обычно встроен в ядро
# Добавить параметр загрузки для его отключения
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
# Перезагрузиться для применения изменений
sudo reboot
* * *
### 3️⃣ Очистка кэшей (если подозреваете предыдущую эксплуатацию)
root@kitploit:~
# Очистить кэш страниц на лету
sudo sysctl -w vm.drop_caches=3
⚠️ **Примечание** : Это не заменяет патч. Только дополнительная мера.
* * *
## 📅 Хронология событий
Дата| Событие
---|---
**29 апреля**| Публичное раскрытие компанией Theori
**1 мая**| Обнаружены первые попытки активной эксплуатации
* * *
## 📦 Статус патчей
* * *
## 🔐 Проверка вашей системы
### Уязвимо ли ваше ядро?
root@kitploit:~
# Получить версию ядра
uname -r
# Уязвимо, если:
# - v4.14 до v7.0-rc (выпущено между 2017 и апрелем 2026)
# - Содержит коммит 72548b093ee3
# Проверить, загружен ли модуль algif_aead
lsmod | grep algif_aead
# Если он есть в списке, ваша система уязвима
* * *
## 🧬 Анализ безопасности: Фактор ИИ
### Самое разрушительное: Обнаружено ИИ за 1 час
ИИ выявил эту ошибку, которая оставалась незамеченной разработчиками в течение **9 лет**. Это знаменует собой поворотный момент:
* 🤖 Машины могут аудировать код ядра **быстрее, чем люди**
* 🔍 Автоматически находя сложные логические ошибки
* ⚠️ Последствия для будущего исследований 0-day
* * *
## Быстрый старт
root@kitploit:~
# 1. Детектирование
python3 prueba.py
# exit 0 = не уязвимо, 2 = уязвимо, 1 = ошибка теста
# 2. Эксплойт (интерактивный — su запросит ваш собственный пароль)
python3 exploit.py --shell
## Использование детектора
root@kitploit:~
python3 prueba.py
Что он делает:
1. Подтверждает, что `AF_ALG` и алгоритм `authencesn(hmac(sha256),cbc(aes))` доступны из непривилегированного процесса.
2. Создаёт файл-сторож 4 КиБ во временном каталоге и заполняет кэш страниц.
3. Отправляет 8 байт AAD инлайн через `sendmsg`+cmsg с seqno_lo, установленным в маркер `PWND`, а затем копирует 32 байта из страницы кэша страниц сторожа в сокет операции AF_ALG через `os.splice()`.
4. Вызывает `recv()` для запуска расшифровки. Проверка аутентификации завершается с `EBADMSG`; временная запись всё равно выполняется.
5. Повторно читает файл (кэш страниц, не диск) и ищет маркер.
Классы вывода:
* `Предусловие не выполнено`: `AF_ALG` или `authencesn` недоступны. Выход 0.
* `УЯЗВИМО к CVE-2026-31431`: маркер `PWND` вставлен в изменённую страницу.
Выход 2.
* `Кэш страниц ИЗМЕНЁН через путь инлайн-вставки AEAD`: запись в страницу произошла, но маркер не вставлен в ожидаемую позицию. Считать уязвимым. Выход 2.
* `Кэш страниц не тронут`: исправлено. Выход 0.
Детектор никогда не изменяет `/usr/bin/su`, `/etc/passwd` или любые другие файлы за пределами временного каталога, который он создаёт, и этот файл удаляется по завершении.
Выход. ## Использование LPE
root@kitploit:~
python3 exploit_cve_2026_31431.py # Только патч, выводит следующие шаги
python3 exploit_cve_2026_31431.py --shell # Патч и запуск `su <пользователь>`
Функция:
1. Находит строку UID текущего пользователя в `/etc/passwd` и определяет
смещение в байтах поля UID из 4 символов.
2. Выполняет `write4` по этому смещению, заменяя UID на
`0000`.
3. Вызывает `pwd.getpwnam(пользователь)` для подтверждения, что libc теперь сообщает UID 0.
4. С `--shell` выполняет `execvp("su", ["su", пользователь])`. Введите свой собственный пароль. PAM проверяет `/etc/shadow` (без изменений), затем
`setuid(getpwnam(user).pw_uid)` устанавливается в 0.
### Требования
* Текущий пользователь имеет UID из 4 цифр (1000–9999). UID из 1–3 цифр
требуют многоразовых записей; расширьте `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), завершится ошибкой или покажет числовые идентификаторы. Для очистки:
root@kitploit:~
# Без привилегий: запросить удаление кэша страниц /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
Перезагрузка также очищает его.
## Как работает `write4`
root@kitploit:~
sendmsg([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()`.
## Смягчение
Пока исправленное ядро не поступит в ваш дистрибутив:
root@kitploit:~
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-списки.
## 📚 Официальные ссылки
* CVE-2026-31431 - NVD
* Copy Fail Patches - AlmaLinux
* Sysdig Security Research
* CISA Alert
* * *
## ⚠️ Финальные рекомендации
1. **Критический приоритет** : Обновите ядро **до 15 мая 2026 года** (предписание CISA)
2. **Если перезагрузка невозможна** : Примените временное смягчение, отключив `algif_aead`
3. **В Cloud/Kubernetes** : Немедленно проверьте, что ваши узлы исправлены
4. **Мониторинг** : Ищите попытки загрузки модуля `algif_aead` в журналах аудита
* * *
**Последнее обновление** : 3 мая 2026 года
**Статус** : 🔴 КРИТИЧЕСКИЙ - Требуется немедленное действие