
قواعد كشف Wazuh 4.14.4 لثغرة CVE-2026-31431 (Copy Fail) - تصعيد الامتيازات المحلية في لينكس عبر كتابة ذاكرة التخزين المؤقت للصفحات في authencesn
هندسة الكشف لثغرة تصعيد الصلاحيات في نواة لينكس Copy Fail · Ubuntu / RHEL / SUSE / Amazon Linux 2023 / Kali
CVE-2026-31431 هي خلل منطقي في قالب التشفير authencesn في نواة لينكس. تسمح لأي مستخدم محلي غير مميز بتنفيذ كتابة محكومة وحتمية بحجم 4 بايت في ذاكرة التخزين المؤقت للصفحات (page cache) لأي ملف قابل للقراءة على النظام - دون الحاجة إلى سباقات (race conditions)، أو عناوين نواة، أو صلاحيات مرتفعة.
سكربت بايثون 3.10+ بحجم 732 بايت يستخدم فقط وحدات المكتبة القياسية (os, socket, zlib) يستغل الثغرة للحصول على صلاحيات الجذر (root) على جميع توزيعات لينكس الرئيسية الصادرة منذ 2017.
الملف على القرص يبقى دون تغيير، مما يجعل مراقبة سلامة الملفات التقليدية (FIM) عمياء تمامًا.
تم اكتشافها بواسطة Taeyang Lee (Theori / Xint) بمساعدة أداة الذكاء الاصطناعي Xint Code.
الكتابة تستهدف فقط ذاكرة التخزين المؤقت للصفحات في الذاكرة. النواة لا تعلّم الصفحة على أنها متسخة (dirty)، لذا فإن آلية الكتابة الخلفية (writeback) لا تحفظها على القرص أبدًا. الملف الثنائي على القرص يبقى مطابقًا حرفيًا للأصل.
النهج التقليدي لـ FIM:
قراءة الملف من القرص -> حساب التجزئة -> المقارنة -> لا يوجد شذوذ مبلّغ عنه
واقع Copy Fail:
الملف على القرص = دون تغيير
ذاكرة التخزين المؤقت للصفحات = تالفة
نتيجة FIM = عمياء
الكشف الفعال الوحيد هو سلوكي، عبر مراقبة استدعاءات النظام (syscalls). يوفر هذا المستودع قواعد Wazuh مُتحققًا منها في بيئات الإنتاج تكتشف سلسلة الاستغلال على مستوى استدعاءات النواة.
الخطوة 1: socket(38, 5, 0) مقبس AF_ALG - لا يتطلب صلاحيات
الخطوة 2: bind() الربط بـ authencesn - تفعيل الكود الضعيف
الخطوة 3: sendmsg() صياغة حمولة AAD - البايتات 4-7 = القيمة المراد كتابتها
الخطوة 4: splice() [!] المشغّل - صفحات ذاكرة التخزين المؤقت تدخل SGL قابلة للكتابة
الخطوة 5: recv() authencesn يكتب seqno_lo في ذاكرة التخزين المؤقت للصفحات
الخطوة 6: execve(/usr/bin/su) الثنائي التالف setuid يشغّل شيلكود بصلاحيات UID 0
سplice() هي الخطوة الحرجة. فهي تُسلّم صفحات ذاكرة التخزين المؤقت إلى قائمة التشتت القابلة للكتابة (scatterlist) لمقبس AF_ALG دون نسخ - تحسين في المكان (in-place) من 2017 في algif_aead.c جعل الصفحات من مخزن الأنبوب (pipe buffer) قابلة لإعادة الاستخدام في SGL الوجهة. عندما يعمل authencesn.decrypt()، يكتب في تلك الصفحات، والتي تصادف أنها ذاكرة التخزين المؤقت للملف المستهدف.
جميع توزيعات لينكس التي تشحن أنوية منذ الالتزام 72548b093ee3 (2017) متأثرة.
الهروب من الحاويات: Copy Fail هي أيضًا ناقل للهروب من الحاويات. ذاكرة التخزين المؤقت للصفحات مشتركة بين جميع العمليات على المضيف، بما في ذلك عبر حدود الحاويات. الجزء الثاني من Xint يغطي استغلال Kubernetes.
COPY-FAIL-Detection-with-Wazuh-4.14.4/
│
├── rules/
│ └── local_rules.xml # 8 قواعد كشف Wazuh (199600-199607)
│
├── auditd/
│ └── cve-2026-31431.rules # قواعد مستشعر استدعاءات النظام auditd
│
├── sca/
│ └── cve_2026_31431.yml # سياسة SCA - مستقلة عن إصدار النواة
│
└── docs/
├── pentlab_uid.png # تنفيذ إثبات المفهوم - الحصول على الجذر على Kali
├── Rule-199604-TRIGs.png # القاعدة 199604 - 80 إصابة على pentlab
├── Rule_199604_Wazuh_Server_only.png # القاعدة 199604 - التحقق الأول
├── Splice_-_Non-root_process.png # القواعد 199600/199601/199604 تعمل
├── Modprobe_-_Possible_Algif_aed_load_attempt.png # القاعدة 199603
├── Pentlab-PoC.png # القاعدة 199603 على وكيل pentlab
├── exploit_chain_timeline.svg # سلسلة الاستغلال
└── SCA_CVE-2026-31431.png # نتيجة سياسة SCA 75%
طبقتان مستقلتان — لا تعتمدان على إصدار النواة.
مرشح uid!=0 يغطي المستخدمين بما يتجاوز الحسابات التفاعلية: حسابات الخدمات (www-data, postgres, jenkins)، الحاويات، وقذائف الويب دون جلسة تسجيل دخول.
قواعد مستشعر auditd (auditd/cve-2026-31431.rules):
-a always,exit -F arch=b64 -S socket -F a0=0x26 -F uid!=0 -k copy_fail_af_alg
-a always,exit -F arch=b32 -S socket -F a0=0x26 -F uid!=0 -k copy_fail_af_alg
-a always,exit -F arch=b64 -S splice -F uid!=0 -k copy_fail_splice
-w /usr/bin/su -p x -k copy_fail_execve_su
-w /usr/bin/kmod -p x -k copy_fail_modload
فحوصات تكوين آلية كل 12 ساعة عبر sca/cve_2026_31431.yml. لا يتطلب إصدار نواة.
ملاحظة هندسية: يجب أن تكون القاعدتان 199600 و199601 فرعيتين للقاعدة 92600 (عملية بايثون، العمق 1)، وليس لـ 80700. محرك قواعد Wazuh يتبع مسار سلسلة واحد لكل حدث. وضع قواعد الكشف في العمق 2 تحت 92600 يضمن فوزها في تقييم السلسلة على القواعد الشقيقة (مثل 92603-92606 في 0850-audit_rules.xml والتي تطابق أيضًا
if_group=audit + exe=python).
# Ubuntu / Debian / Kali
apt install auditd audispd-plugins -y
systemctl enable --now auditd
auditctl -s | grep enabled
# RHEL / Amazon Linux
yum install audit -y
systemctl enable --now auditd
# SUSE
zypper install audit -y
systemctl enable --now auditd
cp auditd/cve-2026-31431.rules /etc/audit/rules.d/
augenrules --load
auditctl -l | grep copy_fail
المخرجات المتوقعة:
-a always,exit -F arch=b64 -S socket -F a0=0x26 -F uid!=0 -F key=copy_fail_af_alg
-a always,exit -F arch=b32 -S socket -F a0=0x26 -F uid!=0 -F key=copy_fail_af_alg
-a always,exit -F arch=b64 -S splice -F uid!=0 -F key=copy_fail_splice
-w /usr/bin/su -p x -k copy_fail_execve_su
-w /usr/bin/kmod -p x -k copy_fail_modload
القواعد مقدمة في rules/local_rules.xml. يمكنك إما دمج المحتوى في ملف /var/ossec/etc/rules/local_rules.xml الحالي أو نشره كملف مستقل:
# الخيار أ - ملف مستقل
cp rules/local_rules.xml /var/ossec/etc/rules/cve-2026-31431_rules.xml
# الخيار ب - الإلحاق بـ local_rules.xml
cat rules/local_rules.xml >> /var/ossec/etc/rules/local_rules.xml
# التحقق من الصيغة - يجب أن يخرج بـ 0 مع صفر تحذيرات
/var/ossec/bin/wazuh-analysisd -t 2>&1 | tail -5
# إعادة تشغيل المدير
systemctl restart wazuh-manager
cp sca/cve_2026_31431.yml /var/ossec/etc/shared/default/
أضف إلى ossec.conf داخل كتلة <sca>:
<policies>
<policy>/var/ossec/etc/shared/default/cve_2026_31431.yml</policy>
</policies>
systemctl restart wazuh-manager
تأكد من أن Wazuh يستوعب سجل auditd:
<!-- أضف داخل <ossec_config> -->
<localfile>
<log_format>audit</log_format>
<location>/var/log/audit/audit.log</location>
</localfile>
# إنشاء مستخدم اختبار إذا لزم الأمر
useradd -m testuser 2>/dev/null || true
# توليد الإشارة 1 - مقبس AF_ALG
su - testuser -c "python3 -c \"import socket; socket.socket(38, 5, 0); print('AF_ALG OK')\""
# توليد الإشارة 3 - تنفيذ /usr/bin/su
su - testuser -c "/usr/bin/su --help 2>/dev/null || true"
# التحقق من التقاط auditd للأحداث
ausearch -k copy_fail_af_alg -ts recent 2>/dev/null | grep "key=\|exe=\|uid=" | head -5
# التحقق من توليد Wazuh للتنبيهات
grep -E "199600|199602" /var/ossec/logs/alerts/alerts.log | tail -10
grep -E "31431|cve_2026" /var/ossec/logs/alerts/alerts.log | tail -10
نتيجة SCA المتوقعة (نظام غير مخفف): 75% (3 ناجحة / 1 فاشلة - algif_aead غير مدرج في القائمة السوداء)
testuser (uid=1001) نفّذ إثبات المفهوم بحجم 732 بايت وحصل على قشرة جذر:

مقبس AF_ALG + splice() من نفس عملية بايثون - pid=46784 - التحقيق الفوري مطلوب:






نتائج اكتشاف لوحة تحكم Wazuh (الوكيل=pentlab، اليوم):
wazuh-analysisd -t: خروج 0 - صفر تحذيرات - تم تحميل جميع القواعد الثماني.
rmmod algif_aead 2>/dev/null || true
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
هذا لا يؤثر على dm-crypt/LUKS، أو kTLS، أو IPsec، أو OpenSSL، أو GnuTLS، أو SSH.
طبّق التزام النواة a664bf3d603d عبر تحديث نواة توزيعتك. يعيد التراجع عن تحسين 2017 في المكان في algif_aead.c، ويفصل req->src (TX SGL، حيث يُسلّم splice الصفحات) عن req->dst (RX SGL، مخزن المستخدم). جميع التوزيعات الرئيسية تشحن الإصلاح.
# Ubuntu / Debian
apt update && apt upgrade linux-generic
# RHEL / Amazon Linux
dnf update kernel
# SUSE
zypper update kernel-default
Kislley Rodrigues (m0us3r) سفير Wazuh | هندسة الكشف | الفريق الأزرق
قواعد الكشف، وتكوين مستشعر auditd، وسياسة SCA تم التحقق منها على Wazuh 4.14.4، وUbuntu 24.04.2 LTS (النواة 6.8.0-106-generic)، وKali GNU/Linux 2026.1 (النواة 6.18.12+kali-amd64).
| المصدر | الرابط |
|---|---|
| CISA تضيف ثغرة الوصول الجذري في لينكس المستغلة بنشاط CVE-2026-31431 إلى KEV | https://thehackernews.com/2026/05/cisa-adds-actively-exploited-linux-root.html |
تم تطوير هذا المشروع كجزء من برنامج سفراء Wazuh.
Wazuh هي منصة أمنية مجانية ومفتوحة المصدر توفر حماية موحدة عبر XDR وSIEM. تعرف على المزيد على wazuh.com.
| المصدر | الرابط |
|---|
| موقع CVE الرسمي | https://copy.fail/ |
| المقال التقني - Xint Research | https://xint.io/blog/copy-fail-linux-distributions |
| إثبات المفهوم - copy_fail_exp.py | https://github.com/theori-io/copy-fail-CVE-2026-31431/blob/main/copy_fail_exp.py |
| إصلاح النواة - a664bf3d603d | https://github.com/torvalds/linux/commit/a664bf3d603d |
| الالتزام الضعيف - 72548b093ee3 | https://github.com/torvalds/linux/commit/72548b093ee3 |
| MITRE ATT&CK T1068 | https://attack.mitre.org/techniques/T1068/ |
| التوزيعة | النواة | الحالة |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | ROOT CONFIRMED |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | ROOT CONFIRMED |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | ROOT CONFIRMED |
| SUSE 16 | 6.12.0-160000.9-default | ROOT CONFIRMED |
| Kali GNU/Linux 2026.1 | 6.18.12+kali-amd64 | ROOT CONFIRMED |
| القاعدة | الأصل | الإشارة | العمق | المستوى |
|---|
| 80700 | decoded_as=auditd | مرساة auditd (مدمجة في Wazuh) | 0 | 0 |
| 92600 | 80700 | تنفيذ عملية بايثون (مدمجة في Wazuh) | 1 | 0 |
| 199600 | 92600 | مقبس AF_ALG - سلسلة بايثون | 2 | 10 |
| 199601 | 92600 | استدعاء النظام splice() - سلسلة بايثون | 2 | 10 |
| 199604 | 199601 + if_matched=199600 | سلسلة الاستغلال - بايثون (نفس pid/120 ثانية) | 3 | 15 |
| 199602 | 80700 | تنفيذ /usr/bin/su | 1 | 6 |
| 199603 | 80700 | تنفيذ modprobe/kmod | 1 | 12 |
| 199605 | 80700 | مقبس AF_ALG - غير بايثون | 1 | 10 |
| 199606 | 80700 | استدعاء النظام splice() - غير بايثون | 1 | 10 |
| 199607 | 199606 + if_matched=199605 | سلسلة الاستغلال - غير بايثون (نفس pid/120 ثانية) | 2 | 15 |
| القاعدة | الإصابات | الوصف |
|---|
| 199604 | 80 | تم اكتشاف سلسلة الاستغلال - pid=46784 exe=/usr/bin/python3.13 |
| 199600 | 40 | تم إنشاء مقبس AF_ALG بواسطة عملية غير جذرية |
| 199603 | 28 | تم اكتشاف تنفيذ modprobe |
| 199602 | 12 | تم تنفيذ /usr/bin/su |
| التاريخ | الحدث |
|---|
| 2026-03-23 | تم الإبلاغ عن الثغرة لفريق أمن نواة لينكس |
| 2026-03-24 | تم استلام التأكيد الأولي |
| 2026-03-25 | تم اقتراح التصحيحات ومراجعتها |
| 2026-04-01 | تم الالتزام بالتصحيح في النواة الرئيسية (a664bf3d603d) |
| 2026-04-22 | تم تعيين CVE-2026-31431 |
| 2026-04-29 | الإفصاح العام - مقال Xint + نشر إثبات المفهوم |
| Dirty Cow (2016-5195) | Dirty Pipe (2022-0847) | Copy Fail (2026-31431) |
|---|
| سباق (Race condition) | نعم - محاولات متعددة | لا | لا - منطق حتمي |
| يمكن أن يعطل النظام | نعم | لا | لا |
| قابلية النقل | محدودة | خاصة بالإصدار | جميع التوزيعات 2017+ |
| حجم الاستغلال | كيلوبايتات (C) | مئات البايتات | 732 بايت (مكتبة بايثون القياسية) |
| كشف FIM | ممكن | ممكن | غير ممكن |
| الفحص | العنوان | المخاطر |
|---|
| 31431001 | algif_aead غير محمّل في الذاكرة | حرجة |
| 31431002 | algif_aead معطّل عبر modprobe.d | عالية |
| 31431003 | auditd نشط ويعمل | عالية |
| 31431004 | قواعد مستشعر CVE-2026-31431 منشورة | عالية |
| كتالوج الثغرات المستغلة المعروفة | https://www.cisa.gov/known-exploited-vulnerabilities-catalog |
| CVE-2026-31431 - crypto: algif_aead - العودة إلى العمل خارج المكان | https://www.cve.org/CVERecord?id=CVE-2026-31431 |