
PoC: هروب كامل للحاوية دون أي امتيازات إلى تنفيذ كود على مستوى العقدة في Kubernetes عبر CVE-2026-31431 الناتج عن فساد page-cache وطبقات الصور المشتركة. تم التحقق منها على Alibaba Cloud ACK وAmazon EKS وGoogle GKE.
إثبات مفهوم يوضح كيف يمكن لحاوية غير مميزة تمامًا تحقيق تنفيذ كود على مستوى العقدة على Kubernetes من خلال استغلال ثغرة تلف ذاكرة التخزين المؤقت للصفحات (page-cache) في نواة لينكس CVE-2026-31431 عبر طبقات صور الحاويات المشتركة.
بدائية الهجوم الأساسية هي: يمكن تسليح أي DaemonSet مميز يشارك طبقات الصور مع حاوية يتحكم بها المهاجم لتحقيق الهروب من الحاوية. يستخدم هذا الـ PoC وحدة kube-proxy كمثال ملموس واحد، لكن التقنية قابلة للتعميم على أي عمل مميز في المجموعة.
تم التحقق منه على Alibaba Cloud ACK وAmazon EKS وGoogle GKE — حاوية pod غير مميزة تكتب [*] success إلى نظام ملفات المضيف عبر DaemonSet المميز لـ kube-proxy:
| Alibaba Cloud ACK (kernel 6.6.88) | Amazon EKS (kernel 6.12.79) | Google GKE (kernel 6.12.68) |
|---|---|---|
![]() | ![]() | ![]() |
إخلاء مسؤولية: يُنشر هذا المستودع لأغراض تعليمية ودفاعية فقط. استخدمه حصريًا على الأنظمة التي تملكها أو لديك إذن صريح باختبارها.
CVE-2026-31431 ("Copy Fail") هي ثغرة في نواة لينكس في مسار النسخ عند الكتابة (Copy-on-Write — CoW) لذاكرة التخزين المؤقت للصفحات. تتيح حالة سباق (race) في splice عبر AF_ALG لعملية غير مميزة إتلاف صفحات ذاكرة التخزين المؤقت لملف للقراءة فقط. يستمر التلف في ذاكرة التخزين المؤقت للنواة ويكون مرئيًا لكل عملية تقرأ الملف أو تنفذه لاحقًا — بما في ذلك العمليات في حاويات أخرى أو على المضيف.
للحصول على التفاصيل الكاملة حول الثغرة الأصلية، راجع copy.fail.
يستغل الهجوم ثلاث خصائص تتعايش بشكل شائع في مجموعات Kubernetes:
privileged: true, hostNetwork: true, capabilities واسعة، إلخ) تنفّذ بشكل دوري ملفات ثنائية من صورتها.عندما تتوافق هذه الشروط، يمكن لحاوية pod غير مميزة إتلاف ملف ثنائي في طبقة صورة مشتركة، وسينفّذ DaemonSet مميز على نفس العقدة الملف الثنائي التالف دون علمه بصلاحياته المرتفعة — محققًا تنفيذ كود كامل على مستوى العقدة.
هدف الثغرة ليس مقصورًا على kube-proxy. أي DaemonSet مميز (وكلاء مراقبة، إضافات CNI، مجمعات سجلات، وكلاء أمان، إلخ) تشارك صورة الحاوية الخاصة به الطبقات مع صورة يتحكم بها المهاجم يُعد هدفًا قابلًا للاستغلال.
تتكون سلسلة الهجوم من ثلاث مراحل: تلف ذاكرة التخزين المؤقت للصفحات، الانتشار عبر الحاويات، والتنفيذ المميز.
يوفّر النظام الفرعي AF_ALG (التشفير) في النواة واجهة قائمة على المقابس (sockets) لعمليات التشفير في مساحة المستخدم. يستغل الاستغلال حالة سباق في كيفية تعامل النواة مع splice() من ملف إلى مقبس AF_ALG:
authensn(hmac(sha256),cbc(aes)).MSG_MORE، لإخبار النواة بانتظار المزيد من البيانات.splice() لمحتويات الملف الهدف من واصف ملف (fd) ← أنبوب (pipe) ← مقبس AF_ALG.يكرر الاستغلال هذه العملية لكل نافذة من 4 بايتات حتى تتم الكتابة فوق جميع الصفحات المخزنة للملف الثنائي الهدف بحمولة مخصصة.
لا حاجة لأذونات الكتابة على الملف. الملف على القرص يبقى دون تغيير — فقط ذاكرة التخزين المؤقت للصفحات في الذاكرة هي التي تتلف.
تستخدم بيئات تشغيل الحاويات أنظمة ملفات overlay. عندما تشترك حاويتان في نفس طبقة الصورة، تخدم النواة قراءات الملفات لكليهما من نفس صفحات ذاكرة التخزين المؤقت.
يبني المهاجم صورة الـ PoC الخاصة به FROM نفس الصورة الأساسية التي يستخدمها الـ DaemonSet المميز الهدف. ولأن الحاويتين تشتركان في نفس دليل overlay السفلي (lower-dir)، فإن الملفات الثنائية في الطبقة المشتركة تتطابق مع صفحات ذاكرة تخزين مؤقت متطابقة.
عندما تتلف حاوية الـ 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 المُدارة التالية:
| الخاصية | القيمة |
|---|---|
| المنصة | خدمة حاويات Alibaba Cloud لـ 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 (المنبع) |
| جهاز الجذر | /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) |
