
عرض توضيحي وشرح لـ CVE-2026-31431
عرض وشرح لـ CVE-2026-31431، ثغرة تصعيد الامتيازات المحلية Copy Fail في نواة لينكس. تتيح الثغرة إمكانية الكتابة فوق البيانات الموجودة في ذاكرة التخزين المؤقت للصفحات (page cache) للملفات المفتوحة بصلاحية القراءة فقط.
هذا المستودع لأغراض تعليمية فقط ويوضح الثغرة في بيئة محكومة. الملفات المتضمنة هي:
├── exploit
│ ├── copy_fail.py # Custom exploit that can target any file with read permissions
│ ├── original_payload.txt # A copy of the payload used in the original exploit
│ ├── copy_fail_original.py # Original exploit that overwrites /usr/bin/su
│ └── copy_fail_readable.py # Original exploit in a more readable format with an explanation of the payload
├── README.md
└── Vagrantfile # Setup for the Vagrant VM running Ubuntu 22.04
الثغرة، المسماة Copy Fail، موجودة في نواة لينكس من 2017 إلى 2026 بسبب خلل منطقي في algif_aead. وقد مُنحت المعرف CVE-2026-31431 بدرجة CVSS تبلغ 7.8، مما يؤدي إلى تصنيف عالي الخطورة. الاستغلال حتمي (deterministic) ويمكنه تجاوز أدوات مراقبة سلامة الملفات التقليدية.
نُشرت إثباتات المفهوم بلغات متعددة، بما في ذلك C وPython وGo، لكن في هذا العرض تم استخدام Python وهي تتطلب إصدار 3.10 أو أعلى. يتطلب هذا الاستغلال تنفيذ كود محلي كمستخدم غير مميز ويمكن استخدامه لتصعيد الامتيازات المحلية.
الأقسام التالية هي:
تأكد من تثبيت Vagrant وQEMU. ثم استنسخ هذا المستودع وانتقل إلى دليل المشروع.
vagrant up
vagrant ssh
داخل الجهاز الافتراضي، يمكننا اختبار حدود صلاحياتنا.
id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
su # We are prompted for the root password, which we do not have
stat /usr/bin/su # We have read and execute permissions
stat /etc/passwd # We have read permission
stat /etc/shadow # We have no permissions
من الواضح أن صلاحياتنا محدودة، لكن يمكننا استخدام الثغرة لتصعيد الامتيازات.
لفهم الثغرة، دعنا نكتب فوق ملف تجريبي ونرى ما يحدث.
echo -e "ABCDE\nF\nG" > dummy.txt
cat dummy.txt
لدينا ملف بثلاثة أسطر. السطر الأول طوله 6 بايت (بما في ذلك سطر الجديد)، والثاني 2 بايت، والثالث بايت واحد. هذا مهم لأن الاستغلال يكتب فوق البيانات في كتل من 4 بايت، ونحن نضيف حشوًا للحمولة لملء ذلك.
python3 exploit/copy_fail.py --target dummy.txt --payload "123456"
cat dummy.txt
يمكننا أن نرى أننا استبدلنا أول 8 بايتات من الملف بحمولتنا. هناك حرفان موجودان لكنهما غير قابلين للطباعة. افتح الملف في nano للتحقق.
ولكن هذا ليس مثيرًا للغاية، لذا دعنا ننتقل إلى الكتابة في ملفات لا نملك صلاحية الكتابة إليها.
يمكننا الكتابة فوق محتويات /etc/passwd لإضافة مستخدم بصلاحيات الجذر ولكن بدون كلمة مرور.
cat /etc/passwd
يحتوي السطر الأول على مستخدم الجذر ويتكون من 8 مجموعات من 4 أحرف (بما في ذلك سطر الجديد). وهو منسق على النحو التالي root:x:0:0:root:/root:/bin/bash، وتشير القيم إلى اسم المستخدم وكلمة المرور وUID وGID والدليل الرئيسي والصدفة (shell).
python3 exploit/copy_fail.py --target /etc/passwd --payload "hackd::0:0:root:/root:/bin/bash
"
cat /etc/passwd
لقد أضفنا مستخدمًا جديدًا hackd بمعرف UID 0 ومعرف GID 0، مما يعني أنه يمتلك صلاحيات الجذر. حقل كلمة المرور فارغ، لذا يمكننا تسجيل الدخول بدون كلمة مرور.
su hackd
id
cat /etc/shadow
في الاستغلال الأصلي، يتم الكتابة فوق الملف الثنائي /usr/bin/su بتعليمات لتنفيذ صدفة (shell)، مما يسمح للمهاجم بالحصول على صلاحيات الجذر عند تنفيذ su. يمكننا إعادة إنشاء هذا الاستغلال عن طريق استهداف /usr/bin/su بالحمولة الأصلية من ملف.
لاحظ أن هذا يدمر الملف الثنائي su في ذاكرة التخزين المؤقت للصفحات.
python3 exploit/copy_fail.py --target /usr/bin/su --payload-file exploit/original_payload.txt
مع وضع الحمولة في مكانها، يمكننا تنفيذ su والحصول على صلاحيات الجذر. هذا يفتح صدفة بمعرف المستخدم 0، وهو عادةً مستخدم الجذر، لكن إذا تم تنفيذ العرض التوضيحي أعلاه، فسيكون المستخدم hackd الذي أنشأناه. هذا الاستغلال سيفتح صدفة حتى إذا كان لدى مستخدم root كلمة مرور.
su
id
لا يقوم هذا الاستغلال بتعديل الملف على القرص، بل يعدل حالة ذاكرة التخزين المؤقت للصفحات (page cache). نتيجة لذلك، فإن أدوات مراقبة سلامة الملفات التقليدية التي تتحقق من التغييرات في الملفات على القرص لا تكتشف هذا الاستغلال.
لتوضيح ذلك، قم بتشغيل الاستغلال (أو الاستغلالات) أعلاه ثم بعد إعادة تشغيل الجهاز الافتراضي، تحقق من محتويات الملف المستهدف.
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # The file is unchanged on disk
المكونات التالية مستخدمة في الاستغلال:
AD||CT||TAGTAGseqno_hi||seqno_lo||CT||TAG -> seqno_lo||seqno_hi||CT||TAG||seqno_loالالتزام (commit) الذي مكّن التحسين في نفس المكان الذي أنشأ هذه الثغرة:
https://github.com/torvalds/linux/commit/72548b093ee38a6d4f2a19e6ef1948ae05c181f7
تم إصدار التصحيح دون أي إعلانات عامة ويعمل على إزالة وظيفة العملية في نفس المكان في algif_aead:
https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
اقرأ المزيد:
تنفيذات Python
تنفيذات C
تنفيذات Go