## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-ASTOUNDS-COPY-FAIL-CVE-2026-31431
# CVE-2026-31431 — Copy Fail
**Локальное повышение привилегий в ядре Linux через AF_ALG + перезапись page-cache через splice**
  
> **Только для авторизованных исследований безопасности, пентеста и образовательных целей.** Не используйте против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения.
Технический разбор
* * *
## Содержание
* Описание
* Детали уязвимости
* Структура репозитория
* Быстрый старт
* Обнаружение
* Требования
* Меры по смягчению
* Тестовая среда (необязательно)
* Ссылки
* Лицензия
* * *
## Описание
CVE-2026-31431 — это уязвимость локального повышения привилегий (LPE) в ядре Linux. Непривилегированный локальный пользователь может получить root-доступ, комбинируя интерфейс сокетов `AF_ALG` с `splice()` для выполнения аутентифицированной записи напрямую в страницу page-cache, принадлежащую setuid-бинарнику.
Эксплойт перезаписывает бинарник `su` в page-cache без изменения inode на диске, в обход механизмов целостности, которые полагаются исключительно на метаданные файла или контрольные суммы на уровне блоков.
* * *
## Детали уязвимости
### Затронутые окружения
* * *
## Структура репозитория
root@kitploit:~
.
├── exploit.py # PoC — перезапись page-cache и повышение привилегий
├── detect.bt # BPFtrace-скрипт для обнаружения в реальном времени
├── run-vm.sh # Автоматизация тестовой среды QEMU (необязательно)
├── PAYLOAD.md # Анализ кодирования полезной нагрузки (hex → zlib → ELF → shellcode)
└── LICENSE
* * *
## Быстрый старт
Запустите `exploit.py` от имени **непривилегированного** локального пользователя на любой уязвимой системе — `sudo` не требуется:
root@kitploit:~
python3 exploit.py
Скрипт выполняет следующие шаги:
1. Проверяет поддержку ядром `AF_ALG` (`algif_aead`) и находит бинарник `su`.
2. Выбирает и распаковывает полезную нагрузку, соответствующую архитектуре.
3. Открывает бинарник `su` как сырой файловый дескриптор и перезаписывает его страницы page-cache через `AF_ALG` \+ `sendfile`.
4. Проверяет повышение привилегий. В случае успеха открывает root-шелл.
**Поддерживаемые архитектуры:**
* * *
## Обнаружение
Отслеживайте попытки эксплуатации в реальном времени с помощью `detect.bt`. Требуется root:
root@kitploit:~
sudo bpftrace detect.bt
# или
doas bpftrace detect.bt
Скрипт отслеживает три индикатора для каждого PID с помощью битовой маски в `@suspect[pid]`:
Срабатывание сигнала происходит, когда все три бита установлены (`@suspect[pid] == 0x7`) для одного и того же PID.
* * *
## Требования
### `exploit.py`
* Python 3.6+
* Ядро Linux с загруженным модулем `AF_ALG`/`algif_aead`
* Локальная учётная запись непривилегированного пользователя (root **не** требуется)
### `detect.bt`
* `bpftrace` ≥ 0.12
* Права root (требуются для BPF-трассировки)
root@kitploit:~
# Ubuntu/Debian
sudo apt install bpftrace
# RHEL/CentOS/Fedora
sudo dnf install bpftrace
# Amazon Linux
sudo yum install bpftrace
# SUSE
sudo zypper install bpftrace
# Alpine
sudo apk add bpftrace
* * *
## Меры по смягчению
### 1\. Патч (предпочтительно)
Обновите пакет ядра вашего дистрибутива до версии, включающей коммит из основной ветки `a664bf3d603d`, который отменяет оптимизацию `algif_aead` на месте 2017 года, чтобы страницы page-cache больше не могли попадать в записываемый scatterlist назначения. Большинство крупных дистрибутивов уже распространяют это исправление.
### 2\. Отключение `algif_aead` (в ожидании патча)
`blacklist` можно обойти явным `modprobe algif_aead`. Директива `install .../bin/false` полностью переопределяет команду установки, заставляя каждую попытку загрузки завершаться неудачей:
root@kitploit:~
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead 2>/dev/null || true
#### Что это ломает — почти ничего
Подсистемы в строке «Нет» используют криптографический API ядра напрямую — они никогда не проходят через `AF_ALG`. Производительность откатывается к обычным пользовательским криптобиблиотекам, которые и так использует почти всё остальное.
Чтобы проверить, использует ли что-либо на вашей системе `AF_ALG` активно перед его отключением:
root@kitploit:~
lsof | grep AF_ALG
ss -xa | grep alg
### 3\. Блокировка через seccomp (контейнеры, песочницы, CI)
Запретите создание `socket(AF_ALG, ...)` для недоверенных рабочих нагрузок независимо от состояния патча. Добавьте `AF_ALG` (семейство 38) в ваш seccomp deny-list или используйте политику AppArmor/SELinux, ограничивающую вызовы `socket` для непривилегированных процессов.
### 4\. Мониторинг с помощью `detect.bt`
Разверните прилагаемый скрипт обнаружения на любом хосте, который невозможно немедленно пропатчить или заблокировать. Он предупредит о любом процессе, выполняющем полный трёхшаговый примитив эксплуатации.
* * *
## Тестовая среда (необязательно)
`run-vm.sh` автоматизирует создание QEMU-виртуальной машины Ubuntu 24.04 для тестирования в контролируемой среде. `exploit.py` и `detect.bt` работают напрямую на любом уязвимом хосте — QEMU не требуется.
### Требования к хосту
Зависимость| Примечания
---|---
`qemu-system-x86_64` \+ KVM| См. команды установки ниже
`wget` или `curl`| Загрузка cloud-образа
`cloud-image-utils`| Генерация seed-образа (Docker может заменить на не-Debian хостах)
### Установка QEMU
root@kitploit:~
# Ubuntu/Debian
sudo apt install qemu-system-x86 cloud-image-utils wget
# Fedora/RHEL
sudo dnf install qemu-system-x86 wget
# Arch
sudo pacman -Sy qemu
# Alpine
sudo apk add qemu-system-x86 qemu-ui-gtk wget
### Запуск
root@kitploit:~
sh run-vm.sh
### Интерактивное меню
root@kitploit:~
1. Запустить/Создать ВМ
2. Подключиться по SSH
3. Загрузить файлы в ВМ (exploit.py, detect.bt)
4. Запустить эксплойт внутри ВМ
5. Запустить detect.bt внутри ВМ
6. Проверить статус ВМ
7. Остановить ВМ
8. Очистить файлы ВМ
0. Выход
### Учётные данные ВМ
Поле| Значение
---|---
Пользователь| `ubuntu`
Пароль| `cve123`
SSH-порт| `2222`
* * *
## Ссылки
* Технический разбор — xint.io
* Анализ кодирования полезной нагрузки — разбор hex → zlib → ELF → shellcode
* `crypto/af_alg.c` — исходный код ядра
* `mm/splice.c` — исходный код ядра
* * *
## Лицензия
Этот проект распространяется под лицензией **GNU General Public License v3.0 или более поздней версии**. Полный текст см. в LICENSE.
> **Отказ от ответственности:** Этот репозиторий предоставлен только для авторизованных исследований безопасности, пентеста и образовательных целей. Авторы не несут ответственности за любое неправомерное использование или ущерб, причинённый этим программным обеспечением.