
# إعادة كتابة تعليمية لـ Copy Fail PoC (CVE-2026-31431) — تصعيد امتيازات محلي في نواة لينكس عبر algif_aead في مكان التشفير + كتابة splice() في ذاكرة التخزين المؤقت للصفحات
إعادة كتابة تعليمية لإثبات المفهوم من Theori/Xint لثغرة CVE-2026-31431،
وهي ثغرة تصعيد صلاحيات محلي في واجهة مقبس التشفير algif_aead في نواة لينكس.
تؤثر على جميع نوى الإصدار الرئيسي من 4.14 (يوليو 2017)
حتى 6.18.21، وفرع 6.19 المستقر حتى 6.19.11.
لأغراض تعليمية وبحوث أمنية مصرح بها فقط. لا تقم بتشغيلها على أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها. تشغيلها على مضيف ضعيف يمنح أي مستخدم محلي غير مميز وصولاً فورياً إلى صلاحيات الجذر. لا يتحمل المؤلفون أي مسؤولية عن سوء الاستخدام.
تعرض نواة لينكس واجهة برمجة تشفير داخل النواة لمستخدمي مساحة المستخدم منذ
النواة 3.2 عبر عائلة مقابس AF_ALG (<linux/if_alg.h>). يفتح مستخدم مساحة المستخدم
مقبس SOCK_SEQPACKET، ويربطه بقالب خوارزمية (مثل
"aead" / "authencesn(hmac(sha256),cbc(aes))")، ويرسل البيانات للتشفير
أو فك التشفير.
في عام 2017، تم دمج تحسين أداء يسمح لخوارزميات AEAD بتشفير أو فك تشفير البيانات في مكانها عندما تكتشف النواة أن المصدر والوجهة يتشاركان نفس الصفحات الأساسية. هذا يتجنب نسخ ذاكرة زائد في كل عملية.
قالب authencesn (الذي يضيف دعم رقم التسلسل الموسع إلى
التشفير المصادق عليه) يحتوي على كتابة مؤقتة أثناء فك التشفير: فهو
يكتب بايتات ESN في إزاحة محددة داخل مخزن بيانات العملية
قبل تشغيل فحص المصادقة. عندما يتم الحصول على صفحات مصدر العملية من ذاكرة التخزين المؤقت للصفحات لملف عادي عبر splice()، وتكون
تحسينات المعالجة في المكان نشطة، تذهب هذه الكتابة المؤقتة مباشرة إلى
تلك الصفحات المخزنة مؤقتاً.
لأن ذاكرة التخزين المؤقت للصفحات في النواة هي تعيين مشترك — أي عملية تفتح نفس الملف ترى نفس الصفحات الفعلية — يمكن لمستخدم غير مميز أن:
/usr/bin/su) مع O_RDONLY.AF_ALG عبر splice().authencesn؛ الكتابة المؤقتة لـ ESN تفسد
الصفحة عند إزاحة محكومة ببايتات يتحكم فيها المهاجم.أدوات فحص السلامة خارج المضيف (AIDE, Tripwire, IMA/EVM) التي تقارن مجاميع التحقق من الملفات على القرص عمياء تماماً عن هذا الهجوم. تختفي الكتابة بعد إخلاء ذاكرة التخزين المؤقت للصفحات أو إعادة التشغيل، دون ترك أي أثر جنائي على القرص.
من خلال استهداف /usr/bin/su (ملف ثنائي setuid root) والكتابة فوق فرع
يحمي فحص مصادقة PAM، يحصل المهاجم على قشرة جذر بدون كلمة مرور.
التزام التحسين الذي أدخل الثغرة وصل في دورة تطوير 4.14
(يوليو 2017). أي نواة مبنية مع CONFIG_CRYPTO_USER_API_AEAD=y
وCONFIG_CRYPTO_AUTHENC=y (كلاهما افتراضي شائع) في النطاقات أعلاه
معرضة للخطر.
تحقق من متتبع الأمان الخاص بتوزيعتك للحصول على حالة الاستشارة الدقيقة.
os.splice في Python 3.10)/usr/bin/su، قابل للقراءة عالمياً
لأنه setuid)# عرض ما سيتم كتابته دون لمس النواة (آمن):
python3 copy_fail_exploit.py --dry-run
# تصحيح ذاكرة التخزين المؤقت لصفحات /usr/bin/su (يتطلب نواة ضعيفة):
# تحذير: يتطلب نواة ضعيفة — استخدم فقط على أنظمة تملكها
python3 copy_fail_exploit.py
# التصحيح والتصعيد الفوري إلى الجذر:
python3 copy_fail_exploit.py --spawn-shell
# استخدام ملف ثنائي مستهدف وحمولة مخصصة:
python3 copy_fail_exploit.py --target /usr/bin/sudo --payload-file ./custom_patch.bin
# إخراج مفصّل (طباعة كل كتابة 4 بايت):
python3 copy_fail_exploit.py --verbose --dry-run
بشكل افتراضي، --spawn-shell مغلق. بعد التصحيح، يطبع السكربت:
[+] تم تطبيق التصحيح على ذاكرة التخزين المؤقت لصفحات '/usr/bin/su' (القرص دون تغيير).
قم بتشغيل `su` للتصعيد، أو أعد التشغيل مع --spawn-shell.
للاستعادة: echo 3 | sudo tee /proc/sys/vm/drop_caches
يجب عليك الاشتراك في إطلاق القشرة مع --spawn-shell. هذا مقصود:
يجبرك على فهم ما فعله الاستغلال قبل تنفيذ النتيجة.
إعداد البدائية.
يفتح الاستغلال مقبس AF_ALG ويربطه بقالب
authencesn(hmac(sha256),cbc(aes)) بمفتاح وهمي من الأصفار. ثم
يضبط حجم علامة المصادقة إلى 4 بايت عبر ALG_SET_AEAD_AUTHSIZE.
accept() على مقبس التحكم ينتج مقبس عملية يمكنه إرسال
طلبات فك تشفير فردية.
إطلاق كتابة ذاكرة التخزين المؤقت للصفحات.
لكل جزء 4 بايت من حمولة التصحيح، يستدعي الاستغلال sendmsg() على
مقبس العملية مع تعيين MSG_MORE، مرراً 8 بايت من البيانات المرتبطة
(AAD): 4 بايت حشو تليها 4 بايت الحمولة. MSG_MORE يخبر
النواة بالاحتفاظ بالعملية حتى وصول المزيد من البيانات. ثم ينشئ أنبوباً
ويصدر استدعاءين splice() — file_fd → pipe → op_sock — متبرعاً
بصفحات ذاكرة التخزين المؤقت الخاصة بالملف كمدخل لعملية فك التشفير. عندما
يتم استدعاء recv() أخيراً، تشغل النواة فك تشفير authencesn. يحدث
تحسين المعالجة في المكان (المصدر والوجهة هما نفس الصفحات)، و
الكتابة المؤقتة لـ ESN تنسخ بايتات الحمولة إلى صفحة التخزين المؤقت عند
الإزاحة المستهدفة. يعيد recv() EBADMSG لأن علامة المصادقة
لا يمكن التحقق منها — وهذا متوقع وغير ضار. لقد حدثت الكتابة بالفعل.
تصحيح الملف الثنائي.
الحمولة المدمجة (مأخوذة حرفياً من Theori PoC) تكتب فوق تعليمة فرع
في /usr/bin/su من بناء util-linux قياسي، محولة
قفزة شرطية تفرض مصادقة PAM إلى مرور غير مشروط.
بعد التصحيح، ينجح تشغيل su بدون كلمة مرور و
يسقط قشرة جذر. الملف الثنائي على القرص دون تغيير؛ إسقاط إدخالات
ذاكرة التخزين المؤقت للصفحات (echo 3 > /proc/sys/vm/drop_caches) يعيد التغيير فوراً.
للتحليل الفني الأعمق راجع المراجع أدناه، خاصة مدونة Xint ومستودع Theori PoC.
- rule: AF_ALG socket opened by unprivileged process
desc: >
CVE-2026-31431 — an unprivileged process opened an AF_ALG (family 38)
socket, which is the first step of the Copy Fail exploit.
condition: >
evt.type = socket and
evt.arg.domain = 38 and
not user.uid = 0
output: >
AF_ALG socket opened (user=%user.name uid=%user.uid
pid=%proc.pid comm=%proc.name)
priority: WARNING
tags: [host, network, privilege_escalation, CVE-2026-31431]
rule CopyFail_CVE_2026_31431 {
meta:
description = "Detects Copy Fail exploit script in memory or on disk"
cve = "CVE-2026-31431"
strings:
$template = "authencesn(hmac(sha256),cbc(aes))" ascii
$splice = "os.splice" ascii
$aflag = "AF_ALG" ascii
condition:
all of them
}
أضف إلى /etc/audit/rules.d/cve-2026-31431.rules:
-a always,exit -F arch=b64 -S socket -F a0=38 -k cve_2026_31431_afalg
ثم راقب السجلات مع:
ausearch -k cve_2026_31431_afalg --interpret
1. تطبيق تصحيح النواة (موصى به) قم بالترقية إلى النواة 6.18.22 أو 6.19.12 أو 7.0-rc7 أو أحدث، أو طبق تحديث الأمان الخاص بتوزيعتك.
2. تعطيل CONFIG_CRYPTO_USER_API_AEAD عند البناء إذا كنت تبني نواتك الخاصة، اضبط:
# CONFIG_CRYPTO_USER_API_AEAD is not set
هذا يزيل واجهة AF_ALG AEAD بالكامل ويزيل سطح الهجوم.
معظم النشرات المدمجة/المحصنة لا تحتاجها.
3. seccomp — منع عائلة مقابس AF_ALG
أضف مرشح seccomp للعمليات الحساسة (أو على مستوى النظام عبر سياسة LSM)
يرفض socket(AF_ALG, ...):
// Deny socket() when domain == AF_ALG (38)
BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 38, 0, 1),
BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ERRNO | EACCES),
4. إسقاط صلاحيات ذاكرة التخزين المؤقت للصفحات عبر تحصين النواة
vm.unprivileged_userfaultfd=0 والإعدادات المماثلة تقلل سطح الهجوم
لواجهات ذاكرة النواة المتاحة للمستخدم، رغم أنها لا تمنع هذا CVE مباشرة.
يعدل الاستغلال فقط ذاكرة التخزين المؤقت للصفحات في الذاكرة؛ الملف الثنائي على القرص لا يُلمس أبداً. لاستعادة محتوى الملف الأصلي في الذاكرة، أسقط ذاكرة التخزين المؤقت للصفحات في النواة:
echo 3 | sudo tee /proc/sys/vm/drop_caches
هذا يطرد جميع الصفحات النظيفة من التخزين المؤقت. القراءة التالية لـ /usr/bin/su
(أو أي ملف ثنائي تم تصحيحه) ستعيد تحميل البايتات الأصلية من القرص.
إعادة التشغيل تمسح أيضاً ذاكرة التخزين المؤقت للصفحات بالكامل.
MIT — انظر LICENSE.
تم اختيار MIT بدلاً من ترخيص مخصص "للاستخدام التعليمي فقط" لأنه لا يوجد مثل هذا
الترخيص كمعرف معترف به من OSI/SPDX. MIT متساهل، مفهوم قانونياً
جيداً، ومتوافق مع مستودعات الإفصاح المسؤول. الهدف
التعليمي معبر عنه في docstring الوحدة، قسم إخلاء المسؤولية في هذا README،
ومخرجات --help — وليس في بند ترخيص مخصص مشكوك فيه قانونياً.
| الفرع | أول إصدار ضعيف | آخر إصدار ضعيف | تم الإصلاح في |
|---|
| الرئيسي | 4.14 | 6.18.21 | 6.18.22 |
| 6.19 المستقر | 6.19.0 | 6.19.11 | 6.19.12 |
| 7.0-rc | 7.0-rc1 | 7.0-rc6 | 7.0-rc7 |
| التوزيعة | النواة المرفقة (تقريباً) | تم التصحيح؟ |
|---|
| Debian 12 (Bookworm) | 6.1.x | نعم (تراجع) |
| Debian 13 (Trixie) | 6.12.x / 6.14.x | نعم (تراجع) |
| Ubuntu 24.04 LTS | 6.8.x | نعم (USN-7xxx) |
| Ubuntu 24.10 | 6.11.x | نعم |
| RHEL 9.x | 5.14.x (معاد بناؤها) | نعم (RHSA) |
| Alpine 3.20 | 6.6.x | نعم (تراجع) |
| Arch Linux | متداول (≥ 6.18.22 الآن) | نعم |
| Kali Linux 2026.1 | 6.18.12 | ضعيفة |
| Kali Linux 2026.2+ | 6.18.22+ | تم الإصلاح |
| Linux Mint 22 | 6.8.x (أساس Ubuntu) | نعم (Ubuntu USN) |