
CVE-2026-31431 (Copy Fail) استغلال جديد: إفساد الكود المباشر عبر ذاكرة التخزين المؤقت للصفحات. يستبدل كود libc exit() من خلال مشاركة صفحات MAP_PRIVATE — يؤثر على جميع العمليات الجارية.
تقنية استغلال جديدة لثغرة CVE-2026-31431 ("Copy Fail") تُفسد الكود القابل للتنفيذ للعمليات الجارية عبر ذاكرة التخزين المؤقت للصفحات في نواة لينكس، مما يحقق تصعيد الامتيازات إلى الجذر.
جميع الاستغلالات المنشورة لهذه الثغرة تُفسد ملفات البيانات — بتعديل /etc/passwd لتغيير UID الخاص بالجذر، أو بتصحيح ثنائيات setuid على القرص. هذا الاستغلال يفعل شيئًا مختلفًا جوهريًا: فهو يُفسد الكود القابل للتنفيذ الحي في الذاكرة عبر آلية ذاكرة التخزين المؤقت للصفحات في النواة.
| الاستغلالات المنشورة | هذا الاستغلال | |
|---|---|---|
| الهدف | ملفات البيانات (/etc/passwd, /usr/bin/su) | الكود القابل للتنفيذ (قسم .text في libc) |
| الآلية | محتوى الملف الذي تحلله البرامج | صفحات الكود التي تنفذها وحدة المعالجة المركزية مباشرة |
| النطاق | ملف واحد | جميع العمليات التي تعيّن libc |
| تغيير القرص | نعم (تم تعديل محتوى الملف) | لا (فقط ذاكرة التخزين المؤقت للصفحات في الذاكرة) |
| الاكتشاف | مراقبة سلامة الملفات | غير مرئي لفحوصات نظام الملفات |
عندما يعيّن لينكس مكتبة مشتركة باستخدام MAP_PRIVATE، فإنه لا ينسخ صفحات الملف فورًا. بدلاً من ذلك، تشير إدخالات جدول الصفحات الخاصة بالعملية مباشرة إلى الصفحات الفعلية في ذاكرة التخزين المؤقت للصفحات. يحدث النسخ فقط عند الكتابة (النسخ عند الكتابة). بالنسبة لصفحات الكود (.text)، لا تكتب العمليات إليها أبدًا — لذا تظل مشتركة مع ذاكرة التخزين المؤقت للصفحات إلى الأبد.
Process A (bash) Process B (su) Page Cache (libc)
┌──────┐ ┌──────┐ ┌──────────┐
│ PTE │───────────>│ │ │ exit(): │
│ │ │ PTE │───────────>│ endbr64 │
└──────┘ └──────┘ │ push rax │
MAP_PRIVATE MAP_PRIVATE │ ... │
(clean page) (clean page) └──────────┘
↑
Copy Fail writes here!
تمنحنا CVE-2026-31431 كتابة محكومة من 4 بايت إلى ذاكرة التخزين المؤقت للصفحات لأي ملف قابل للقراءة. من خلال إفساد صفحات كود libc، نقوم بتعديل التعليمات التي تنفذها كل عملية.
on_exit() في ذاكرة التخزين المؤقت للصفحات في libc — 10 عمليات كتابة من 4 بايت لكل منهاexit() للقفز إلى الشيلكود الخاص بنا — كتابة واحدة من 4 بايتexit() (عمليًا كل برنامج) ينفذ الشيلكود الخاص بناينفذ الشيلكود setuid(0) ← setgid(0) ← execve("/bin/sh")، مما يمنح قشرة جذر.
crypto/algif_aead.c — تحسين في المكان لعام 2017 (72548b093ee3) يسمح لـ splice() بتغذية صفحات ذاكرة التخزين المؤقت للصفحات في فك تشفير AEAD. إعادة ترتيب ESN في خوارزمية authencesn تكتب 4 بايتات مؤقتة مرة أخرى إلى قائمة التشتت المصدرية، مما يُفسد ذاكرة التخزين المؤقت للصفحات للملف المُوصَّل.# الترجمة
gcc -o exploit exploit.c
# التشغيل كمستخدم غير مميز
./exploit /lib/x86_64-linux-gnu/libc-2.31.so
# التحفيز — شغّل أي برنامج (يستدعي exit())
su -c id
# uid=0(root) gid=0(root) groups=0(root)
process 'id' launched '/bin/sh'exploit.c — الاستغلال الكامل مع حقن الشيلكودcopyfail_test.c — التحقق من الأولية (اختبار كتابة 4 بايت)72548b093ee3)تُقدَّم هذه الأداة لأغراض البحث الأمني المصرح به والتعليم فقط. لا تستخدمها ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.
كشف Dirty Frag عن متغيرين إضافيين للكتابة في ذاكرة التخزين المؤقت للصفحات في نفس فئة الخطأ:
esp4/esp6): نفس مصب authencesn كما في Copy Fail، ويُصل إليه عبر IPsec ESP-in-UDP. يتطلب مساحات أسماء المستخدمين. كتابة من 4 بايت.rxrpc/rxkad): فك تشفير pcbc(fcrypt) في المكان على صفحة مثبتة عبر splice. لا يتطلب مساحات أسماء. كتابة من 8 بايت.تعمل تقنية إفساد الكود الحي في هذا المستودع مع أي من أوليات الكتابة في ذاكرة التخزين المؤقت للصفحات هذه — فقط استبدل دالة write4() بمحفز ESP أو RxRPC. التقنية مستقلة عن الأولية.