
# استغلال بلغة Rust لثغرة CVE-2026-31431 استغلال بلغة Rust لثغرة CVE-2026-31431، وهي بدائية كتابة في ذاكرة التخزين المؤقت للصفحات في نواة لينكس عبر AF_ALG splice، مما يتيح تصعيد الامتيازات إلى صلاحيات الجذر من خلال تعديل /etc/passwd أو تنفيذ شيلكود.
تنفيذ بلغة Rust لثغرة CVE-2026-31431 (Copy Fail) — بدائية كتابة في ذاكرة التخزين المؤقت للصفحات في نواة لينكس عبر AF_ALG splice.
يتيح تنفيذ algif_aead في نواة لينكس لمستخدم غير مميز كتابة بيانات عشوائية في ذاكرة التخزين المؤقت للصفحات لأي ملف قابل للقراءة عبر استدعاء النظام splice(). تقوم خوارزمية AEAD authencesn بكتابة seqno_lo (بايتات AAD 4-7 التي يتحكم بها المستخدم) في قائمة التشتت الوجهة عند الإزاحة assoclen + cryptlen، والتي — عند ربطها بصفحات ذاكرة التخزين المؤقت عبر splice() — تؤدي إلى كتابة عشوائية من 4 بايتات. يبقى المحتوى على القرص دون تغيير، لكن جميع القراء اللاحقين يرون بيانات تالفة في ذاكرة التخزين المؤقت للصفحات.
النواة المتأثرة: لينكس < 6.12.23، < 6.13.11، < 6.14.2
1. --uid — يقلب حقل UID للمستخدم الحالي إلى 0000 في /etc/passwd عبر الكتابة في ذاكرة التخزين المؤقت للصفحات. بعد التعديل، su <username> مع كلمة مرورك الخاصة يمنحك قشرة جذر. تحاول الأداة مسح ذاكرة التخزين المؤقت للصفحات بعد المصادقة وقبل بدء القشرة، مما يقلل من احتمالية استمرار SSH في رؤية الحساب على أنه UID 0. لا حاجة لتعديل كلمة مرور الجذر. يعمل مع أي UID من 4 أرقام (1000-9999).
2. --escalate — يعدل سطر الجذر في /etc/passwd عبر الكتابة في ذاكرة التخزين المؤقت للصفحات: root:x:0:0:root:... ← root::0:0:root :.... يتم حشو حقل التعليق بمسافات للحفاظ على طول السطر نفسه. بعد التعديل، يعمل su root بدون كلمة مرور.
3. --set-password — يقوم أولاً بالتصعيد (إزالة كلمة مرور الجذر)، ثم يقرأ كلمة المرور الجديدة من الإدخال القياسي ويطبقها باستخدام chpasswd.
4. الوضع الافتراضي (بدون أعلام) — يكتب فوق ذاكرة التخزين المؤقت للصفحات لثنائي su بحمولات شيفرة خاصة بالبنية (x86_64، x86، aarch64)، ثم ينفذ su للحصول على قشرة جذر.
cargo build
cargo build --release
cargo test
cargo clippy
./copyfail-rs --check
./copyfail-rs --uid
./copyfail-rs --escalate
printf '%s\n' 'mypassword' | ./copyfail-rs --set-password
./copyfail-rs --backup /tmp/su.bak
./copyfail-rs --exec /bin/bash
تعديلات ذاكرة التخزين المؤقت للصفحات مؤقتة — مسح ذاكرة التخزين المؤقت يستعيد المحتوى الأصلي على القرص:
echo 3 > /proc/sys/vm/drop_caches
هذا المشروع مقدم لأغراض الاختبار الأمني المصرح به والتعليم فقط.
| العلم | الوصف |
|---|
--check | فحص أولي آمن: فحص هدف su المُحلَّل والخروج |
--escalate | تعديل /etc/passwd في ذاكرة التخزين المؤقت للصفحات لإزالة كلمة مرور الجذر، ثم su root |
--set-password | تصعيد الصلاحيات أولاً، ثم قراءة كلمة مرور جذر جديدة من الإدخال القياسي وتطبيقها عبر chpasswd |
--uid | قلب UID للمستخدم الحالي إلى 0 في /etc/passwd، ثم su <username> |
--backup <path> | نسخ احتياطي لثنائي su قبل الكتابة فوقه |
--exec <path> | تشغيل أمر محدد كجذر بعد الكتابة فوقه |
| نظام التشغيل | النواة | النتيجة |
|---|
| Ubuntu 22.04.2 LTS | 6.8.0-87-generic | --escalate نجح، --set-password نجح، --uid نجح |
| Ubuntu 22.04.2 LTS | 6.8.0-107-generic | --escalate نجح، --uid نجح |
| Ubuntu 25.10 | 6.17.0-5-generic | splice EINVAL، النواة مُصححة |
| Ubuntu 25.10 | 6.17.0-8-generic | --uid نجح |
| Alpine Linux edge | 6.19.12 | الاستغلال يعمل، الكتابة في ذاكرة التخزين المؤقت للصفحات محجوبة بواسطة إصلاح النواة |