Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Copy-Fail-CVE-2026-31431-Kubernetes-PoC — 概念验证,演示通过 CVE-2026-31431 内核页缓存损坏在 Kubernetes 上实现容器逃逸,从而从未特权容器达成节点级代码执行。 | Kitploit
工具/GitHubGitHub/starscow/copy-fail-cve-2026-31431-kubernetes-poc
权限提升漏洞分析漏洞利用学习与教育容器逃逸
GitHubstarscow/copy-fail-cve-2026-31431-kubernetes-poc

Copy-Fail-CVE-2026-31431-Kubernetes-PoC

概念验证,演示通过 CVE-2026-31431 内核页缓存损坏在 Kubernetes 上实现容器逃逸,从而从未特权容器达成节点级代码执行。

查看仓库

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
4个月前尚未审核

Copy Fail (CVE-2026-31431) — Kubernetes 容器逃逸 PoC

一个概念验证,演示完全无特权容器如何通过共享容器镜像层利用 CVE-2026-31431 Linux 内核页缓存损坏漏洞,在 Kubernetes 上实现节点级代码执行。

免责声明: 本仓库仅用于教育和防御目的。请仅在您拥有或已获得明确授权测试的系统上使用。

背景

CVE-2026-31431("Copy Fail")是 Linux 内核页缓存写时复制(CoW)路径中的一个漏洞。AF_ALG splice 竞态条件允许无特权进程损坏只读文件的页缓存页面。该损坏会持续存在于内核页缓存中,并对随后读取或执行该文件的每个进程可见——包括其他容器或宿主机上的进程。

有关原始漏洞的完整详情,请参阅 copy.fail。

工作原理

攻击链分为三个阶段:页缓存损坏、跨容器传播和特权执行。

1. 通过 AF_ALG Splice 竞态条件实现页缓存损坏

内核的 AF_ALG(加密)子系统为用户空间加密操作提供了基于套接字的接口。该漏洞利用内核处理从文件到 AF_ALG 套接字的 splice() 时的竞态条件:

  1. 只读打开目标二进制文件(例如 /usr/sbin/ipset)。
  2. 创建绑定到 authencesn(hmac(sha256),cbc(aes)) 的 AF_ALG AEAD 套接字。
  3. 使用 MSG_MORE 通过 AF_ALG 套接字发送一小块载荷,告知内核预期更多数据。
  4. 通过 fd → pipe → AF_ALG 套接字 splice() 目标文件的内容。
  5. 由于 CoW 漏洞,内核将攻击者的载荷字节写入目标文件的页缓存页面,而不是正确隔离它们。

该漏洞对每个 4 字节窗口重复此过程,直到目标二进制文件的整个缓存页面被自定义载荷覆盖。

无需对文件具有写权限。磁盘上的文件保持不变——只有内存中的页缓存被损坏。

2. 通过镜像层共享实现跨容器传播

容器运行时(containerd、CRI-O)使用 overlay 文件系统。当两个容器共享同一镜像层时,内核从相同的页缓存页面提供它们的文件读取。

此 PoC 镜像基于 FROM registry.k8s.io/kube-proxy:v1.35.2 构建。每个 Kubernetes 节点上的 kube-proxy DaemonSet 使用完全相同的基础层。因此,两个容器中的 /usr/sbin/ipset 映射到相同的页缓存页面集合。

当无特权的 PoC 容器损坏 ipset 的页缓存时,该损坏会立即对同一节点上特权的 kube-proxy 容器可见——无需任何跨容器通信。

3. kube-proxy 的特权执行

kube-proxy 以特权 DaemonSet 运行,并带有 hostNetwork: true。它定期调用 /usr/sbin/ipset 来管理 iptables/ipset 规则。当它下次执行 ipset 时,内核会加载损坏的页缓存页面,以 kube-proxy 的完整权限执行攻击者的载荷:

  • 节点上的完整 root 权限
  • 所有 capabilities
  • 访问主机命名空间

此 PoC 中的载荷(payload/payload.c)仅挂载主机根文件系统并写入标记文件到 /root/res,作为节点级代码执行的证明。

攻击流程示意图

root@kitploit:~
┌──────────────────────────┐     ┌──────────────────────────┐
│   PoC 容器               │     │   kube-proxy 容器        │
│   (无特权)             │     │   (特权)               │
│                          │     │                          │
│  1. 打开 /usr/sbin/ipset │     │                          │
│     (只读)             │     │                          │
│                          │     │                          │
│  2. AF_ALG splice 竞态   │     │                          │
│     损坏页缓存           │     │                          │
│          │               │     │                          │
└──────────┼───────────────┘     └──────────────────────────┘
           │                                  │
           ▼                                  │
  ┌─────────────────────┐                     │
  │  内核页缓存          │                     │
  │  /usr/sbin/ipset     │◄────────────────────┘
  │  (已损坏)          │     3. kube-proxy 执行 ipset
  │  包含攻击者的        │        → 加载损坏的页面
  │  载荷字节            │        → 载荷以 root 权限
  └─────────────────────┘           在宿主机上运行

仓库结构

root@kitploit:~
.
├── cmd/copyfail/main.go          # 入口点;嵌入编译后的载荷
├── internal/
│   ├── exploit/
│   │   ├── exploit.go            # 核心漏洞利用:AF_ALG splice 竞态循环
│   │   └── patch.go              # 将载荷拆分为 4 字节补丁窗口
│   └── alg/
│       └── alg.go                # AF_ALG AEAD 套接字抽象
├── payload/
│   ├── payload.c                 # 验证载荷(挂载主机文件系统,写入标记)
│   └── nolibc/                   # 内核的微型 libc,用于静态、无依赖的载荷
├── deploy/
│   └── poc.yaml                  # Kubernetes Deployment 清单
├── Dockerfile                    # 基于 kube-proxy 构建以共享镜像层
├── Makefile                      # 构建编排
└── docs/                         # 来自 ACK(阿里云)的验证证据

先决条件

  • Go 1.25+
  • 用于 nolibc 载荷的交叉编译器(默认:x86_64-linux-gnu-gcc)
  • Docker / Buildx
  • 运行 kube-proxy 作为 DaemonSet 且 imagePullPolicy: IfNotPresent(默认值)的 Kubernetes 集群
  • CVE-2026-31431 修复之前的 Linux 内核

构建

root@kitploit:~
# 构建载荷 + Go 二进制文件
make build

# 构建 Docker 镜像
make docker-build

# 构建并推送到 GHCR
make docker-push IMAGE=ghcr.io/<you>/copy-fail-poc TAG=latest

对于 arm64 目标:

root@kitploit:~
make build CC=aarch64-linux-gnu-gcc GOARCH=arm64

使用方法

部署 PoC

root@kitploit:~
kubectl apply -f deploy/poc.yaml

该 Deployment 创建一个无特权的 pod。它会:

  1. 运行 /bin/copyfail -target /usr/sbin/ipset 来损坏页缓存。
  2. 无限期休眠,以便 pod 保持运行以供观察。

验证逃逸

在 kube-proxy 下次执行 ipset 后(由于其协调循环,这通常会在几秒内发生,或在其下次重启时),检查节点:

root@kitploit:~
# SSH 进入节点,或使用特权调试 pod
cat /root/res
# 预期输出:[*] success

宿主机文件系统上存在 /root/res 证明攻击者提供的代码以节点级权限执行——从 kube-proxy 特权容器上下文内部写入。

清理

root@kitploit:~
kubectl delete -f deploy/poc.yaml

# 在受影响的节点上,移除标记并重启 kube-proxy:
rm -f /root/res
systemctl restart kubelet   # 或删除 kube-proxy pod 以强制重新拉取

为什么选择 kube-proxy + ipset?

kube-proxy 是理想的目标,因为它:

  1. 存在于每个节点上 — 作为 DaemonSet 运行。
  2. 高度特权 — privileged: true,hostNetwork: true。
  3. 其镜像中包含 ipset — ipset 是用于 iptables 管理的 setuid 二进制文件。
  4. 使用 imagePullPolicy: IfNotPresent — 一旦攻击者的镜像被拉取并共享相同的基础层,overlay lower-dir 页面就会被共享。

任何镜像中包含可预测二进制文件的特权 DaemonSet 都可能以相同方式被攻击。

自定义载荷

默认载荷(payload/payload.c)是一个仅用于验证的程序,用于写入标记文件。要构建自定义载荷:

  1. 编辑 payload/payload.c。该程序基于 nolibc(内核的最小 C 库)构建,生成静态、无依赖的二进制文件。
  2. 运行 make payload 进行交叉编译。
  3. 编译后的载荷通过 //go:embed 嵌入到 Go 二进制文件中。

受影响版本

  • Linux 内核:CVE-2026-31431 补丁之前的所有版本。
  • Kubernetes:任何使用未修补节点内核的版本。该漏洞存在于内核中,而非 Kubernetes 本身。Kubernetes 仅提供了执行上下文(共享镜像层 + 特权 DaemonSet),将影响从本地页缓存损坏提升为完整的容器逃逸。

缓解措施

  • 修补内核。 这是最终的修复方案。
  • 启用镜像层隔离。 某些运行时支持每容器文件系统快照,可防止页缓存共享。
  • 为 kube-proxy 使用只读根文件系统(不能完全缓解,但会限制载荷能力)。
  • 限制 pod 调度,防止不受信任的工作负载落在运行具有共享基础镜像的特权 DaemonSet 的节点上。

致谢

  • CVE-2026-31431 发现与披露:Theori / Xint
  • 跨平台 C 载荷:Tony Gies(LGPL-2.1-or-later OR MIT)
  • nolibc:Linux 内核自测(tools/include/nolibc/)

许可证

本仓库中的 Go 漏洞利用代码按原样提供,仅供研究目的使用。

载荷(payload/payload.c)衍生自 copy-fail-c,采用 LGPL-2.1-or-later OR MIT 双重许可。请参阅 LICENSE-LGPL 和 LICENSE-MIT。

下载工具