
تنفيذ بلغة Bash لأداة copyfail (CVE-2026-31431)
لا سباق. لا إزاحات. لا ملف ثنائي مُجهّز تثق به بشكل أعمى.
تنفيذ بلغة bash لثغرة CVE-2026-31431 (Copy Fail). يترجم السكربت أداة مساعدة صغيرة بلغة C بشكل مضمّن في وقت التشغيل. تتولى طبقة bash تحديد بنية المعالج وفك ضغط الحمولة واختيار الهدف؛ بينما تقوم طبقة C بالتفاعل الفعلي مع النواة (مقابس AF_ALG وsplice وsendmsg) التي لا يمكن لـ bash الوصول إليها وحدها.
انظر copy.fail للتحليل التقني الكامل.
الخلل موجود في algif_aead، واجهة مقابس AF_ALG من نوع AEAD في النواة. تحسين موضعي (in-place) من عام 2017 يتيح لصفحات page cache أن تصل إلى scatterlist الوجهة القابل للكتابة في عملية فك تشفير authencesn. أطعمها المدخلات الصحيحة عبر splice() وستحصل على كتابة حتمية بمقدار 4 بايتات في page cache لأي ملف قابل للقراءة، بما في ذلك ثنائيات setuid التي لا تملكها.
استبدل محتوى /usr/bin/su بالشيل كود بمقدار 4 بايتات في كل مرة، ثم شغّله لتحصل على شل بصلاحيات الجذر. لا نافذة سباق، لا رموز خاصة بالنواة، لا إعادة محاولات.
chmod +x copyfail.sh
# Check if the system is vulnerable before doing anything
./copyfail.sh -c
# Run the exploit (must be non-root)
./copyfail.sh
# Specify a different setuid target
./copyfail.sh -t /usr/bin/passwd
# List all setuid-root candidates on the system
./copyfail.sh -s
تستبدل الأداة محتوى page cache في الذاكرة فقط، والملف على القرص لا يُمسّ. تكفي إعادة التشغيل لاستعادة كل شيء. إذا أردت التنظيف فورًا:
# Inside your root shell
/usr/bin/su --version # still works from disk if page cache is evicted
# Or just reboot
إذا استخدمت -t مع هدف آخر غير su، فالأمر نفسه. التأثير على page cache فقط، والقرص نظيف.
gcc لترجمة الأداة المساعدة الداخلية بلغة Cpython3 لفك ضغط حمولة الشيل كود (سطر واحد فقط، لا حاجة لأي حزم)algif_aead وauthencesn وhmac وcbcإذا لم تكن الخوارزمية متاحة:
sudo modprobe algif_aead authencesn hmac cbc
تتضمن بعض التوزيعات ملف حظر في /etc/modprobe.d/ كحل مؤقت. احذفه إذا كان موجودًا:
sudo rm /etc/modprobe.d/disable-algif{_,-}aead.conf 2>/dev/null
floor: torvalds/linux 72548b093ee3 August 2017, v4.14
(AF_ALG iov_iter rework that introduced
the file-page write primitive via splice
into the AEAD scatterlist)
ceiling: torvalds/linux a664bf3d603d April 2026, mainline
(reverts the 2017 in-place optimization;
source and destination scatterlists are
now separate, page-cache pages can no
longer end up as writable crypto output)
بين هذين الالتزامين: كل توزيعة رئيسية لم تطبّق backport للإصلاح. تم تأكيد أن Ubuntu وRHEL وSUSE وAmazon Linux وDebian جميعها قابلة للثغرة وقت الإفصاح. بدأت إصلاحات backport من التوزيعات بالوصول حوالي 2026-04-29. للتحقق من نواة معينة، ابحث عن a664bf3d603d (أو backport الخاص بتوزيعتك) في سجل التغييرات.
| البنية | الحالة |
|---|---|
| x86_64 | ✓ |
| aarch64 | ✓ |
| i386 / i686 | ✓ |
| armv7l | ✓ |
بشكل دائم: حدّث نواة نظامك.
حل مؤقت (يحظر مقبس AF_ALG؛ ولا يؤثر على IPsec/XFRM التي تستخدم واجهة kernel crypto API مباشرة):
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
sudo rmmod algif_aead 2>/dev/null
الحاويات: أضف ملف تعريف seccomp يمنع إنشاء مقابس AF_ALG، واضبط allowPrivilegeEscalation: false في سياق أمان Pod. يؤدي هذا إلى تفعيل no_new_privs، الذي يمنع النواة من احترام بتات setuid عند execve().
لن تفوز نسخة bash في عدد التبعيات، لكنها سكربت واحد يمكنك قراءته من أوله إلى آخره قبل تشغيله. تُنشأ الأداة المساعدة بلغة C وتُترجم في وقت التشغيل من heredoc، ولا توجد كتلة ثنائية منفصلة تحتاج تدقيقًا مستقلًا.
لأغراض الاختبارات الأمنية والأبحاث المصرّح بها فقط. لا تشغّل هذا على أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها.
| Python | Go | Bash |
|---|
| التبعيات | python3 | لا شيء (ثنائي ثابت) | gcc + python3 |
| ثنائي مُجهّز مسبقًا | لا | نعم | لا |
| ملف واحد | نعم | لا | نعم |
| خطوة ترجمة | لا | لا | نعم (داخلية، تلقائية) |