Sploitus

Exploit for CVE-2026-31431

kitploit · 2026-08-27

Exploit Code

MARKDOWN377 lines
## 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 года  
**Статус** : 🔴 КРИТИЧЕСКИЙ - Требуется немедленное действие