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

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

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

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Copy-Fail-CVE-2026-31431-Kubernetes-PoC — PoC:通过 CVE-2026-31431 页缓存损坏 + 共享镜像层,实现完全非特权容器逃逸至 Kubernetes 节点级代码执行。已在阿里云 ACK、Amazon EKS 和 Google GKE 上验证。 | Kitploit
工具/GitHubGitHub/percivalll/copy-fail-cve-2026-31431-kubernetes-poc
权限提升漏洞分析漏洞利用云安全论文与研究学习与教育容器逃逸
GitHubpercivalll/copy-fail-cve-2026-31431-kubernetes-poc

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

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

PoC:通过 CVE-2026-31431 页缓存损坏 + 共享镜像层,实现完全非特权容器逃逸至 Kubernetes 节点级代码执行。已在阿里云 ACK、Amazon EKS 和 Google GKE 上验证。

查看仓库
18428244个月前Kitploit 审核通过

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

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

核心攻击原语是:任何与攻击者控制的容器共享镜像层的特权 DaemonSet 都可被武器化,用于容器逃逸。本 PoC 以 kube-proxy 作为具体示例,但该技术可推广到集群中的任何特权工作负载。

已在阿里云 ACK、Amazon EKS 和 Google GKE 上验证——一个无特权 Pod 通过特权 kube-proxy DaemonSet 向主机文件系统写入 [*] success:

阿里云 ACK (kernel 6.6.88)Amazon EKS (kernel 6.12.79)Google GKE (kernel 6.12.68)
ACKEKSGKE

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

背景

CVE-2026-31431(“Copy Fail”)是 Linux 内核中页缓存写时复制(Copy-on-Write, CoW)路径上的一个漏洞。通过 AF_ALG splice 竞态,无特权进程可以破坏只读文件的页缓存页。这种破坏会持续存在于内核页缓存中,并且对之后读取或执行该文件的每个进程都可见——包括其他容器或主机上的进程。

关于原始漏洞的完整细节,请参阅 copy.fail。

攻击原理

该攻击利用了 Kubernetes 集群中通常同时存在的三个特性:

  1. 内核页缓存损坏(CVE-2026-31431) —— 无特权进程可以覆盖其能够以只读方式打开的任何文件的内存缓存页。
  2. 镜像层共享 —— 容器运行时(containerd、CRI-O)使用 overlay 文件系统,不同容器中相同的镜像层映射到相同的页缓存页。
  3. 特权 DaemonSet —— 许多集群运行具有提升权限的 DaemonSet(privileged: true、hostNetwork: true、广泛的 capabilities 等),这些 DaemonSet 会定期执行其镜像中的二进制文件。

当这些条件同时具备时,无特权 Pod 可以破坏共享镜像层中的二进制文件,而同一节点上的特权 DaemonSet 会在不知情的情况下以其提升的权限执行被破坏的二进制文件——从而实现完整的节点级代码执行。

漏洞目标不仅限于 kube-proxy。 任何容器镜像与攻击者控制的镜像共享层的特权 DaemonSet(监控代理、CNI 插件、日志采集器、安全代理等)都是可行的攻击目标。

工作原理

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

1. 通过 AF_ALG splice 竞态破坏页缓存

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

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

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

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

2. 通过镜像层共享进行跨容器传播

容器运行时使用 overlay 文件系统。当两个容器共享同一镜像层时,内核会从相同的页缓存页为它们的文件读取提供服务。

攻击者构建其 PoC 镜像时,FROM 与目标特权 DaemonSet 相同的基础镜像。由于两个容器共享相同的 overlay lower-dir,共享层中的二进制文件将映射到相同的页缓存页。

当无特权 PoC 容器破坏二进制文件的页缓存时,同一节点上的特权容器立即可见该破坏——并且无需任何跨容器通信。

3. 目标 DaemonSet 的特权执行

当特权 DaemonSet 下次执行任何被破坏的二进制文件时(在其正常运行周期内),内核会加载被破坏的页缓存页。攻击者的载荷将以 DaemonSet 的完整权限运行——可能包括:

  • 节点上的完整 root 权限
  • 所有 capabilities
  • 对主机命名空间(网络、PID、挂载)的访问权限

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

攻击流程图

┌──────────────────────────┐     ┌──────────────────────────┐
│   PoC Container          │     │   Privileged DaemonSet   │
│   (unprivileged)         │     │   (e.g. kube-proxy,      │
│                          │     │    monitoring agent, etc.)│
│  1. Open target binary   │     │                          │
│     (read-only)          │     │                          │
│                          │     │                          │
│  2. AF_ALG splice race   │     │                          │
│     corrupts page cache  │     │                          │
│          │               │     │                          │
└──────────┼───────────────┘     └──────────────────────────┘
           │                                  │
           ▼                                  │
  ┌─────────────────────┐                     │
  │  Kernel Page Cache   │                     │
  │                      │◄────────────────────┘
  │  Shared-layer binary │     3. DaemonSet executes the
  │  (CORRUPTED)         │        corrupted binary
  │  contains attacker's │        → loads corrupted pages
  │  payload bytes       │        → payload runs with
  └─────────────────────┘           DaemonSet's privileges

已验证的云环境

该 PoC 已在以下托管 Kubernetes 平台上成功验证:

阿里云 ACK

属性值
平台阿里云容器服务 Kubernetes 版(ACK)
Kubernetesv1.35.2
节点内核6.6.88-4.2.alnx4.x86_64
kube-proxyregistry-cn-*.ack.aliyuncs.com/acs/kube-proxy:v1.35.2-aliyun.1
基础镜像registry.k8s.io/kube-proxy:v1.35.2(上游)
根设备/dev/vda3 (ext4)

ACK PoC 结果

Amazon EKS

属性值
平台Amazon Elastic Kubernetes Service(EKS)
Kubernetesv1.35.4
节点内核6.12.79-101.147.amzn2023.x86_64
kube-proxy***.dkr.ecr.***.amazonaws.com.cn/eks/kube-proxy:v1.35.3-eksbuild.2
基础镜像public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base-iptables:2026-03-11-1773190710.2023
根设备/dev/nvme0n1p1 (xfs)

EKS PoC 结果

Google GKE

属性值
平台Google Kubernetes Engine(GKE)
Kubernetesv1.35.3-gke.1234000
节点操作系统Container-Optimized OS (COS) 125,BUILD_ID 19216.220.72
节点内核6.12.68+ x86_64
kube-proxyus-central1-artifactregistry.gcr.io/gke-release/gke-release/kube-proxy:v1.35.3-gke.1234000
基础镜像与 kube-proxy 相同(GKE 供应商管理的 Artifact Registry 镜像)
根设备/dev/dm-0(ext2,只读);/dev/sda1(ext4,可写的有状态分区)
标记路径/mnt/stateful_partition/copyfail-res

GKE PoC 结果

在以上三种情况中,无特权 PoC Pod 均成功地将 [*] success 标记文件写入主机文件系统——证明通过特权 kube-proxy DaemonSet 实现了节点级代码执行。

有关完整演练(镜像层分析、构建步骤、部署):

  • EKS:docs/eks-poc.md
  • GKE:docs/gke-poc.md

以 kube-proxy 为例

本 PoC 以 kube-proxy 为目标,因为它是 Kubernetes 集群中最常见的特权 DaemonSet 之一。提供了三种变体:

  • 默认(ACK / 上游):构建自 FROM registry.k8s.io/kube-proxy:v1.35.2(参见 Dockerfile)
  • EKS:构建自 FROM public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base-iptables:2026-03-11-1773190710.2023(参见 Dockerfile.eks)
  • GKE:构建自 FROM us-central1-artifactregistry.gcr.io/gke-release/gke-release/kube-proxy:v1.35.3-gke.1234000(参见 Dockerfile.gke)

所有变体都会破坏诸如 /usr/sbin/ipset、/usr/sbin/nft、/usr/sbin/xtables-legacy-multi 和 /usr/sbin/xtables-nft-multi 之类的二进制文件。

重要注意事项:

  • 只有当 kube-proxy 以 ipvs 模式配置时,它才会调用 ipset。默认模式(iptables)不使用 ipset。有关 ipvs 弃用计划,请参阅 kubernetes/enhancements#5495。
  • 某些托管 Kubernetes 发行版(例如某些云提供商)会将 kube-proxy 作为非特权容器运行,这会限制逃逸的影响。
  • 本 PoC 针对多个二进制文件(ipset、nft、xtables-legacy-multi、xtables-nft-multi)以覆盖不同的代理模式,但这些二进制文件是否被调用取决于集群配置。

如果你的集群中 kube-proxy 不是特权容器,攻击原理仍然成立 —— 你只需要识别一个不同的特权 DaemonSet,它共享镜像层且基础镜像可供你基于其构建。

推广到其他目标

要将此 PoC 适配到另一个特权 DaemonSet:

  1. 识别集群上运行的特权 DaemonSet(监控代理、CNI 插件、日志采集器等)。
  2. 使用该 DaemonSet 使用的基础镜像来构建你的 PoC 镜像(FROM)。
  3. 识别共享层中该 DaemonSet 在正常运行期间会执行的二进制文件。
  4. 利用该漏洞破坏这些二进制文件的页缓存。

仓库结构

下载工具