返回首页

CVE-2026-31431 Copy Fail:732字节Python脚本攻破Linux内核,容器逃逸零门槛

-2026-31431 Copy Fail:732字节脚本攻破内核,容器逃逸零门槛

hero

2026年5月1日,安全研究团队Xint披露了Linux内核加密子系统中的一个提权漏洞(CVE-2026-31431,代号Copy Fail)。这个漏洞仅需732字节的Python脚本即可实现从普通用户到root的提权,且同一份代码无需修改即可在Ubuntu、RHEL、 Linux、SUSE等所有主流发行版上运行。更严重的是,该漏洞可穿越容器边界,实现容器到宿主机的逃逸。

漏洞概述:Copy Fail是什么

section

CVE-2026-31431是Linux内核crypto 中AF_ALG子系统的一个逻辑漏洞,存在于authencesn加密模板的in-place优化路径中。该漏洞允许任何无特权的本地用户对任意可读文件的页面缓存(page cache)写入4字节数据。这4字节足以劫持一个setuid二进制文件或被特权进程执行的程序,从而获得root权限。

该漏洞自2017年引入(当时内核添加了AEAD加密路径的in-place优化),直到2026年5月才被发现,潜伏了将近9年。这意味着从2017年到补丁发布期间的所有Linux发行版——包括Ubuntu、Debian、RHEL、Fedora、SUSE、Amazon Linux、Arch、Rocky、Alma等——全部受到影响。

属性
CVE编号 CVE-2026-31431
代号 Copy Fail
漏洞类型 本地提权(LPE)+ 容器逃逸
影响子系统 Linux kernel crypto API, AF_ALG
发现者 Xint
披露日期 2026-05-01
修复提交 mainline commit a664bf3d603d
影响范围 2017年至补丁发布期间的所有主流Linux发行版
PoC大小 732字节 Python脚本

技术原理:4字节写入如何变成root

Copy Fail的核心是AF_ALG(用户态加密API)中的一个逻辑缺陷。整个利用链由三个关键技术组成:

AF_ALG socket: Linux内核提供的用户态加密接口,任何进程无需root权限或特殊capability即可使用。通过socket(AF_ALG, SOCK_SEQPACKET, 0)创建。

splice()系统调用: 允许在文件描述符和管道之间移动数据,无需经过用户态拷贝。利用splice可以将目标文件(如setuid二进制)的页面直接送入内核的加密操作中。

Page Cache共享: 这是利用链的关键。内核的页面缓存是全局共享的——同一宿主机上的所有容器、宿主机本身、kube-proxy等特权组件,只要读取同一个文件(比如基础镜像层中的二进制),都会从同一组物理页面中读取。

# 漏洞利用核心流程(简化)
import os, socket, zlib

# Step 1: 创建AF_ALG socket
s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
s.bind(('aead', 'authencesn(hmac(sha256),cbc(aes))'))

# Step 2: splice目标文件页面到加密操作
target = os.open('/usr/bin/su', os.O_RDONLY)
os.splice(target, pipe_write, 4096)
os.splice(pipe_read, alg_fd, 4096)

# Step 3: 内核in-place优化将加密结果写回同一页面
# 4字节被覆盖到目标文件的页面缓存中
# 执行被篡改的setuid二进制 → 获得root

为什么4字节就够了? 在ELF二进制文件中,4字节足以插入一个近跳转指令或重定向函数指针。exploit选择一个偏移量,将目标二进制改写为攻击者payload的小型加载器。

容器逃逸:从Pod到Node的完整路径

section

Copy Fail对容器化环境的威胁尤为严重。因为页面缓存跨容器共享,攻击路径如下:

Kubernetes PoC路径: 攻击者在一个无特权的Pod中运行exploit,目标是/usr/sbin/ipset(kube-proxy以root身份调用的二进制)。当DaemonSet中的kube-proxy执行被篡改的ipset时,攻击者获得节点上的root执行权限。

[无特权Pod] → splice /usr/sbin/ipset → 4字节覆盖 → 
  等待kube-proxy执行 → 获得Node root权限 → 
  横向移动到其他节点/命名空间

关键点:标准的Kubernetes seccomp profile对AF_ALG socket没有限制。runtime/default seccomp配置允许socket()系统调用创建AF_ALG类型的socket,因此默认安全配置无法阻止该利用。

场景 风险等级 说明
多租户Linux主机 🔴 高 共享开发机、shell服务、跳板机——任何用户可提权
Kubernetes/容器集群 🔴 高 页面缓存跨容器共享,Pod可逃逸到Node
CI运行器/构建农场 🔴 高 Actions runner执行不受信PR代码
运行用户代码的云 🟡 中 Notebook宿主机、沙箱、Serverless函数
单租户服务器 🟢 低 仅内部提权,需结合Web 或窃取的凭证

受影响系统全面盘点

section

Xint团队直接验证了以下发行版,其他未列出的发行版(Debian、Fedora、Arch、Rocky、Alma、、嵌入式系统)在未打补丁的内核上同样受影响:

发行版 验证内核版本 状态
Ubuntu 24.04 LTS 6.17.0-1007-aws ✅ 已验证
Amazon Linux 2023 6.18.8-9.213.amzn2023 ✅ 已验证
RHEL 10.1 6.12.0-124.45.1.el10_1 ✅ 已验证
SUSE 16 6.12.0-160000.9-default ✅ 已验证

不受影响的组件: dm-crypt/LUKS、kTLS、IPsec/XFRM、内核TLS、OpenSSL/GnuTLS/NSS默认构建、、内核密钥环加密——这些组件直接使用内核加密API,不经过AF_ALG。

检测与验证

检查系统是否受影响

# 方法1:检查algif_aead模块是否可加载
lsmod | grep algif_aead
# 如果有输出,说明模块已加载,系统受影响

# 方法2:使用官方验证脚本
curl -sO https://copy.fail/verify.sh && bash verify.sh
# 该脚本不会提权,仅检测内核是否存在漏洞路径

# 方法3:检查内核版本
uname -r
# 2017年以后的内核版本默认受影响

检查是否已被利用

# 检查setuid二进制的完整性
dpkg --verify 2>/dev/null | grep "^.5"
rpm -Va 2>/dev/null | grep "^.5"

# 检查页面缓存中是否有异常修改
# (需要重启后对比,因为页面缓存修改不持久化到磁盘)

修复方案

方案一:更新内核(推荐)

# Ubuntu/Debian
sudo   && sudo apt  -y linux--$(uname -r)
sudo reboot

# RHEL/CentOS
sudo yum update kernel -y
sudo reboot

# Amazon Linux
sudo yum update kernel -y
sudo reboot

# SUSE
sudo zypper update kernel-default
sudo reboot

方案二:临时缓解——禁用AF_ALG模块

如果无法立即重启,可以禁用受影响的内核模块:

# 写入模块黑名单
echo "install algif_aead /bin/false" | \
  sudo tee /etc/modprobe.d/disable-algif.conf

# 卸载已加载的模块
sudo rmmod algif_aead 2>/dev/null

# 验证
lsmod | grep algif_aead
# 无输出 = 已禁用

禁用AF_ALG的影响: 对绝大多数系统没有可感知的影响。dm-crypt/LUKS、kTLS、IPsec、OpenSSL默认构建、SSH等都不依赖AF_ALG。仅当用户态程序显式使用AF_ALG引擎(如OpenSSL的afalg engine)时才会受影响。

方案三:容器环境额外措施

# Kubernetes Pod  Policy / SecurityContext
securityContext:
  seccompProfile:
    type: RuntimeDefault
  # 注意:RuntimeDefault可能不足以阻止AF_ALG
  # 需要自定义seccomp profile阻止socket(AF_ALG)
# 自定义seccomp profile阻止AF_ALG
# 在seccomp profile中添加:
{
  "syscalls": [
    {
      "names": ["socket"],
      "action": "SCMP_ACT_ERRNO",
      "args": [
        {"index": 0, "value": 38, "op": "SCMP_CMP_EQ"}
      ]
    }
  ]
}

历史对比:近年Linux内核提权漏洞

CVE 代号 类型 利用难度 容器逃逸
CVE-2026-31431 Copy Fail 逻辑漏洞 极低(直行代码)
CVE-2024-1086 nf_tables 中(需竞态)
CVE-2023-32233 nf_tables UAF
CVE-2022-0847 Dirty Pipe 逻辑漏洞 部分
CVE-2021-4034 PwnKit pkexec逻辑

Copy Fail的利用难度与Dirty Pipe类似,但影响范围更广——它不需要目标文件具有特定权限(Dirty Pipe需要可写文件描述符),且同一份exploit在所有发行版上通用。

数据来源与参考文献

  1. Copy Fail 官方网站. "CVE-2026-31431." copy.fail, 2026.
  2. Xint. "Copy Fail Write-up." GitHub: theori-io/copy-fail-CVE-2026-31431, 2026.
  3. Ubuntu Blog. "Fixes available for CVE-2026-31431 (Copy Fail)." ubuntu.com, 2026.
  4. Laravel Forge. "Copy Fail security advisory (CVE-2026-31431)." forge.laravel.com, 2026.
  5. Daily. "CVE-2026-31431 Copy Fail: A 4-Byte Kernel Write That Escapes ." devops-daily.com, 2026.

更新时间: 2026-06-28

评论