Sploitus

Exploit for Copyfail-sh

kitploit · 2026-08-24

Exploit Code

MARKDOWN144 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-NONAMEUSEROSINT-HUE-COPYFAIL-SH
# copyfail-sh

> Никаких гонок. Никаких смещений. Никакого предварительно собранного бинарника, которому нужно слепо доверять.

Реализация CVE-2026-31431 (Copy Fail) на bash. Скрипт компилирует минимальный вспомогательный код на C в рантайме. Слой bash отвечает за определение архитектуры, декомпрессию полезной нагрузки и выбор цели; слой C выполняет непосредственное взаимодействие с ядром (сокеты AF_ALG, `splice`, `sendmsg`), которое bash самостоятельно не может осуществить.

Подробный технический разбор см. на copy.fail.

## Как это работает (кратко)

Ошибка находится в `algif_aead` — интерфейсе сокетов AF_ALG AEAD ядра. Оптимизация in-place 2017 года позволяет страницам кэша страниц оказаться в записываемом списке рассеяния (scatterlist) операции расшифровки `authencesn`. Если передать правильные входные данные через `splice()`, получается детерминированная запись 4 байт в кэш страниц любого читаемого файла, включая setuid-бинарники, которые вам не принадлежат.

Перезаписывая `/usr/bin/su` шеллкодом по 4 байта за раз и запуская его, можно получить рутовую оболочку. Ни окна гонки, ни специфичных для ядра символов, ни повторных попыток.

## Использование

root@kitploit:~
    
    
    chmod +x copyfail.sh
    
    # Проверка уязвимости системы перед выполнением
    ./copyfail.sh -c
    
    # Запуск эксплойта (не от root)
    ./copyfail.sh
    
    # Указание другой setuid-цели
    ./copyfail.sh -t /usr/bin/passwd
    
    # Вывод всех setuid-root кандидатов в системе
    ./copyfail.sh -s
    

### Восстановление su после получения оболочки

Эксплойт перезаписывает только кэш страниц в памяти, файл на диске не трогается. Перезагрузка всё восстанавливает. Если нужно немедленно привести всё в порядок:

root@kitploit:~
    
    
    # Внутри рутовой оболочки
    /usr/bin/su --version   # всё ещё работает с диска, если кэш страниц вытеснен
    # Или просто перезагрузиться
    

Если вы использовали `-t` с чем-то отличным от `su`, ситуация та же. Только кэш страниц, диск чист.

## Требования

  * Linux (ядро 4.11–7.0, см. ниже)
  * `gcc` для компиляции встроенного вспомогательного кода на C
  * `python3` для декомпрессии шеллкода (одна строка, пакеты не нужны)
  * Модули ядра: `algif_aead`, `authencesn`, `hmac`, `cbc`



Если алгоритм недоступен:

root@kitploit:~
    
    
    sudo modprobe algif_aead authencesn hmac cbc
    

Некоторые дистрибутивы содержат блокировку в `/etc/modprobe.d/` в качестве временного обходного решения. Если она есть, удалите её:

root@kitploit:~
    
    
    sudo rm /etc/modprobe.d/disable-algif{_,-}aead.conf 2>/dev/null
    

## Затронутые ядра

root@kitploit:~
    
    
    нижняя граница: torvalds/linux 72548b093ee3   август 2017, v4.14
                                                  (переработка iov_iter в AF_ALG,
                                                   которая ввела примитив записи
                                                   файловой страницы через splice
                                                   в scatterlist AEAD)
    
    верхняя граница: torvalds/linux a664bf3d603d   апрель 2026, mainline
                                                  (откат оптимизации in-place 2017;
                                                   исходный и целевой scatterlists
                                                   теперь разделены, страницы кэша
                                                   страниц больше не могут оказаться
                                                   записываемым криптовыходом)
    

Между этими двух коммитами: все основные дистрибутивы, которые не применили исправление. Ubuntu, RHEL, SUSE, Amazon Linux, Debian — все были подтверждены уязвимыми на момент раскрытия. Бэкпорты для дистрибутивов начали появляться около 2026-04-29. Чтобы проверить конкретное ядро, найдите `a664bf3d603d` (или его бэкпорт для дистрибутива) в changelog.

## Поддерживаемые архитектуры

Архитектура| Статус  
---|---  
x86_64| ✓  
aarch64| ✓  
i386 / i686| ✓  
armv7l| ✓  
  
## Смягчение

**Навсегда:** обновите ядро.

**Обходное решение** (блокирует сокет AF_ALG; не затрагивает IPsec/XFRM, который использует крипто API ядра напрямую):

root@kitploit:~
    
    
    echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
    sudo rmmod algif_aead 2>/dev/null
    

**Контейнеры:** добавьте seccomp-профиль, блокирующий создание сокетов `AF_ALG`, и установите `allowPrivilegeEscalation: false` в контексте безопасности пода. Это включает `no_new_privs`, что не позволяет ядру учитывать setuid-биты при `execve()`.

## Сравнение с другими реализациями

Версия на bash не выигрывает по зависимостям, но это единый скрипт, который можно прочитать целиком перед запуском. Вспомогательный код на C генерируется и компилируется в рантайме из heredoc — нет бинарного блоба для отдельного аудита.

## Ссылки

  * copy.fail — официальный сайт и статья
  * Блог Xint.io — технический разбор
  * Исправление ядра — a664bf3d603d
  * CVE-2026-31431 — NVD
  * Раскрытие oss-security
  * badsectorlabs/copyfail-go — реализация на Go (шеллкоды взяты отсюда)
  * xeloxa/copyfail-exploit — реализация на Python



## Благодарности

  * **Taeyang Lee и Theori / Xint Code** — обнаружение уязвимости и оригинальный PoC



## Отказ от ответственности

Только для авторизованного тестирования безопасности и исследований. Не запускайте на системах, которыми не владеете или на которые не имеете явного письменного разрешения для тестирования.