
نص كشف لـ CVE-2026-31431 (Copy Fail) يتحقق من إصدار النواة، ووجود التصحيح، وإعدادات النواة، وتوفر مقبس AF_ALG، وثنائيات setuid، والإجراءات التخفيفية لتحديد حالة الثغرة الأمنية على أنظمة لينكس.
للكشف فقط. يوجد PoC عملي بالفعل على copy.fail/#exploit. هذا السكربت مخصص لمسؤولي الأنظمة وفرق الأمان لتحديد أماكن تعرضهم للثغرة — أو استمرار تعرضهم لها بعد تطبيق التصحيح.
في 29 أبريل 2026، تم الكشف علنًا عن ثغرة تُسمى Copy Fail (CVE-2026-31431) من قبل فريق Xint Code Research Team. إنها خلل منطقي موجود بهدوء في نواة لينكس منذ حوالي 2017 — ما يقارب عقدًا من الزمن — وتسمح لأي مستخدم محلي غير مميز بالحصول على صلاحيات الجذر.
ليس "الحصول على الجذر في ظل ظروف محددة مع بعض الحظ ورياح مواتية." فقط... الحصول على الجذر. بشكل موثوق. على كل توزيعات لينكس الرئيسية تقريبًا.
تؤثر على Ubuntu وAmazon Linux وRHEL وSUSE وأي شيء آخر يعمل بنواة سائدة من آخر ~8 سنوات. نفس السكربت، بدون إعادة ترجمة، وبدون تعديلات خاصة بالتوزيعات.
نعم، الأمر سيء كما يبدو.
تحتوي نواة لينكس على نظام فرعي للتشفير يمكن الوصول إليه من قبل المستخدمين غير المميزين عبر مقابس AF_ALG. توجد آلية تُسمى splice() يمكنها تغذية بيانات الملفات مباشرة إلى ذلك النظام الفرعي دون نسخها — مما يعني أن النسخة المخزنة في ذاكرة النواة من ملف (ما يُسمى "page cache") تنتهي داخل عملية تشفير.
خوارزمية واحدة محددة — authencesn، المستخدمة لأرقام التسلسل الموسعة في IPsec — لديها خصوصية حيث تستخدم مخزن الإخراج كمساحة عمل مؤقتة وتكتب 4 بايتات أبعد قليلاً من الموضع المفترض. عادةً ما يكون هذا غير ضار. ولكن عندما تنتهي صفحات page cache من ثنائي setuid مثل في سلسلة داخل مخزن الإخراج ذلك (بفضل "تحسين" عام 2017 في )، تهبط تلك الـ 4 بايتات مباشرة في النسخة المخزنة في ذاكرة النواة من الثنائي.
/usr/bin/sualgif_aead.cتفشل العملية مع خطأ. لا تقوم النواة أبدًا بوضع علامة على تلك الصفحة كمتسخة. الملف على القرص يبقى دون تغيير. أدوات فحص سلامة الملفات التي تتحقق من المجاميع الاختبارية على القرص لا ترى أي خطأ.
لكن page cache هو ما يتم تنفيذه. وsu هو setuid root.
الشرح الفني الكامل موجود على xint.io ويستحق القراءة حقًا.
سبعة من الإصدار الأصلي بالإضافة إلى ستة فحوصات جديدة أُضيفت لسد فجوات الكشف:
| # | الفحص | ما الذي يبحث عنه |
|---|---|---|
| 1 | إصدار النواة | هل هذه النواة ضمن النطاق المتأثر (4.10–6.14)؟ |
| 2 | وجود التصحيح | هل commit الإصلاح موجود فعليًا في نواتك قيد التشغيل؟ |
| 3 | وحدة algif_aead | هل الوحدة الضعيفة محمّلة أو قابلة للتحميل؟ |
| 4 | CONFIG_CRYPTO_AUTHENC (جديد) | هل CONFIG_CRYPTO_AUTHENC مدمجة (=y) أم وحدة (=m)؟ هذا الخيار الواحد يبني كلاً من authenc وauthencesn. المدمجة تعني أن تخفيف قائمة الحظر في modprobe لا يفعل شيئًا. |
| 5 | CONFIG_CRYPTO_USER_API_AEAD (جديد) | هل واجهة مستخدم AF_ALG AEAD مضمّنة في الترجمة أصلًا؟ إذا لم تكن كذلك، فإن مسار الاستغلال بأكمله مغلق وقت الترجمة. |
| 6 | مقبس AF_ALG | هل يمكن لمستخدم غير مميز فتح واحد الآن؟ |
| 7 | Python os.splice | هل مسار الاستغلال بـ Python الخالص متاح؟ |
| 8 | ثنائيات setuid | قائمة موسعة من أهداف setuid-root القابلة للقراءة الموجودة على النظام. |
| 9 | التخفيفات | AppArmor وSELinux وseccomp — ما الموجود؟ |
| 10 | مساحات أسماء المستخدمين (جديد) | هل مساحات أسماء المستخدمين غير المميزة مفعّلة؟ (لا تمنع Copy Fail مباشرة، لكنها تؤثر على سطح تصعيد الصلاحيات المحلي الأوسع.) |
| 11 | الصفحات الضخمة الشفافة (جديد) | حالة THP — يمكن أن تؤثر على محاذاة page cache وموثوقية الاستغلال. |
| 12 | كشف البيئة (جديد) | سياق Docker/حاوية/VM — الحاويات تشارك نواة المضيف؛ المضيف هو ما يحتاج إلى التصحيح. |
| 13 | تحذير مستخدم الجذر (جديد) | يحذر إذا كان التشغيل كجذر، لأن عدة فحوصات تعطي نتائج إيجابية خاطئة للجذر بغض النظر عن قيود غير المميزين. |
يغطي سكربت Bash نفس منطق الكشف الأساسي لكنه يحذف ثلاثة عناصر خاصة بـ Python:
| # | الفحص | ملاحظات |
|---|---|---|
| 1 | إصدار النواة | |
| 2 | وجود التصحيح | |
| 3 | وحدة algif_aead | |
| 4 | مقبس AF_ALG | يستخدم Python كمساعد إذا كان متاحًا؛ يتراجع إلى استنتاج إعدادات النواة |
| 5 | ثنائيات setuid | قائمة موسعة، نفس نسخة Python |
| 6 | التخفيفات | AppArmor وSELinux وseccomp |
| 7 | CONFIG_CRYPTO_AUTHENC | |
| 8 | مساحات أسماء المستخدمين | |
| 9 | الصفحات الضخمة الشفافة | |
| 10 | كشف البيئة |
غير موجود في سكربت شل (مقارنة بـ Python):
| الفحص المفقود | السبب |
|---|---|
| CONFIG_CRYPTO_USER_API_AEAD | لم يُنفَّذ بعد — مخطط له |
| توفر Python os.splice | غير قابل للتطبيق على سكربت شل |
| تحذير مستخدم الجذر | لم يُنفَّذ بعد — مخطط له |
لن يصلح أي من السكربتين أي شيء أو يستغل أي شيء. يخبرانك بالحقيقة حول نظامك لتتمكن من التصرف بناءً عليها.
# استنسخ أو حمّل السكربت، ثم:
python3 cve-2026-31431-detect.py
هذا كل شيء. تقرير ملوّن مع ملخص في النهاية.
يخرج السكربت برمز غير صفري عند وجود نتائج ضعيفة، مما يجعله مناسبًا للاستخدام في خطوط الأنابيب:
| الرمز | المعنى |
|---|---|
0 | لا توجد شروط ضعيفة |
1 | يوجد شرط أو أكثر من الشروط الضعيفة |
# مثال: إفشال خطوة CI إذا كان المضيف ضعيفًا
python3 cve-2026-31431-detect.py
rc=$?
if [ $rc -eq 1 ]; then
echo "VULNERABLE — block deployment"
elif [ $rc -ne 0 ]; then
echo "ERROR — script failed to complete (exit $rc)"
fi
CVE-2026-31431 'Copy Fail' — Vulnerability Detection
authencesn page cache corruption / local privilege escalation
Running as uid=1001, euid=1001
=== Kernel Version ===
[VULNERABLE] Kernel version
Reason : Kernel is in the vulnerable range (4.10 – 6.14)
Detail : Release: 6.12.0-124.45.1.el10_1 — patch status must be confirmed
=== CONFIG_CRYPTO_AUTHENC (Kernel Config) ===
[VULNERABLE] CONFIG_CRYPTO_AUTHENC
Reason : Built as module (=m): auto-loads on AF_ALG bind(); modprobe blacklist is the correct mitigation
=== CONFIG_CRYPTO_USER_API_AEAD (Kernel Config) ===
[VULNERABLE] CONFIG_CRYPTO_USER_API_AEAD
Reason : AF_ALG AEAD interface is a loadable module — unprivileged users can access the crypto subsystem via AF_ALG sockets
...
SYSTEM IS LIKELY VULNERABLE TO CVE-2026-31431
Recommended actions:
1. Apply your distribution's kernel update for CVE-2026-31431
2. Until patched, blacklist the module:
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
NOTE: this is ONLY effective when CONFIG_CRYPTO_AUTHENC=m (module).
If CONFIG_CRYPTO_AUTHENC=y (built-in), patching is the only fix.
سكربت Bash مصاحب (cve-2026-31431-detect.sh) متاح للبيئات التي لا يتوفر فيها Python أو حيث يُفضَّل استخدام أدوات شل الأصلية. ينفذ 10 من أصل 13 فحصًا — راجع جدول مقارنة الفحوصات أعلاه لتفاصيل الاختلافات.
# تشغيل أساسي
bash cve-2026-31431-detect.sh
# إخراج JSON — مناسب لاستيعاب SIEM وAnsible facts وتجميع السجلات
bash cve-2026-31431-detect.sh --json > scan-results.json
# وضع هادئ — طباعة الملخص فقط (مفيد في سجلات CI)
bash cve-2026-31431-detect.sh --quiet
# تعطيل ألوان ANSI (للملفات السجلية)
bash cve-2026-31431-detect.sh --no-colour
يستخدم سكربت شل نفس رموز الخروج (0 = سليم، 1 = ضعيف) وينتج إخراج JSON مكافئًا لاستهلاك خطوط الأنابيب. عندما يتوفر Python 3 على النظام، يستخدمه سكربت شل لإجراء اختبار مقبس AF_ALG الحي؛ وإلا يتراجع إلى استنتاج إعدادات النواة.
الإصلاح الحقيقي هو تصحيح نواتك. تحقق من النشرات الأمنية لتوزيعتك.
| التوزيعة | أين تنظر |
|---|---|
| Ubuntu | ubuntu.com/security/CVE-2026-31431 |
| RHEL / Amazon Linux | dnf update kernel |
| SUSE | zypper update kernel-default |
| Debian | apt update && apt upgrade |
إذا أبلغ فحص CONFIG_CRYPTO_AUTHENC عن =m (مبنية كوحدة، وليست مدمجة)، يمكنك حظرها:
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
مهم: هذا التخفيف ليس له أي تأثير إذا كانت
CONFIG_CRYPTO_AUTHENC=y(مدمجة). في هذه الحالة، تصحيح النواة هو الحل الوحيد. فحص CONFIG_CRYPTO_AUTHENC في السكربت يخبرك بأي حالة أنت فيها. لاحظ أنCONFIG_CRYPTO_AUTHENCهو مفتاح إعداد النواة الصحيح — فهو يبني كلاً من وحدتيauthencوauthencesnمن خيار واحد.
قد يؤثر هذا على IPsec إذا كنت تستخدمه — تحقق قبل النشر على نطاق واسع.
الإصلاح من المنبع هو هذا الـ commit — يعيد تحسين AEAD الموضعي لعام 2017 في algif_aead.c، ويفصل قوائم scatterlist للمصدر والوجهة بحيث لا يمكن لصفحات page cache أن تنتهي في الوجهة القابلة للكتابة بعد الآن.
إذا كنت تشغّل هذا داخل حاوية Docker أو pod في Kubernetes أو أي بيئة حاويات أخرى، سيحذرك السكربت: الحاويات تشارك نواة المضيف. الثغرة موجودة في النواة، وليس في صورة الحاوية. يجب عليك تقييم وتصحيح المضيف.
# GitHub Actions
# The step will naturally fail and block the pipeline when the script exits 1.
# No extra configuration needed — non-zero exit codes fail steps by default.
- name: Check CVE-2026-31431
run: |
python3 cve-2026-31431-detect.py
rc=$?
if [ $rc -eq 1 ]; then
echo "VULNERABLE — pipeline blocked"
exit 1
elif [ $rc -ne 0 ]; then
echo "ERROR — detection script failed to complete (exit $rc)"
exit $rc
fi
# Ansible
# Uses playbook_dir to ensure the script path resolves correctly.
# failed_when checks for any non-zero exit (vulnerability OR script error).
- name: Check for CVE-2026-31431
script: "{{ playbook_dir }}/cve-2026-31431-detect.py"
register: cve_check
failed_when: cve_check.rc != 0
# Nagios / monitoring check (shell script — supports exit codes natively)
bash cve-2026-31431-detect.sh --quiet
# exit 0 = OK, exit 1 = CRITICAL (vulnerable)
# JSON output for SIEM / log aggregation (shell script)
bash cve-2026-31431-detect.sh --json --quiet > /var/log/cve-2026-31431-$(hostname)-$(date +%Y%m%d).json
| التاريخ | الحدث |
|---|---|
| 2026-03-23 | تم الإبلاغ لفريق أمان نواة لينكس |
| 2026-03-24 | تم الإقرار |
| 2026-03-25 | تم اقتراح ومراجعة التصحيحات |
| 2026-04-01 | تم الالتزام بالإصلاح في النواة الرئيسية |
| 2026-04-22 | تم تعيين CVE-2026-31431 |
| 2026-04-29 | الكشف العلني |
الفضل لـ Taeyang Lee في Theori للرؤية البحثية الأصلية، وفريق Xint Code Research Team لكتابة تقرير الكشف الكامل.
وجدت نتيجة إيجابية خاطئة؟ توزيعة لا يغطيها السكربت؟ إعداد نواة يجب فحصه؟ نرحب بالطلبات (PRs). الهدف هو إشارة دقيقة، وليس مجرد نص أحمر مخيف.
تُقدَّم هذه الأداة كما هي لأغراض الأمان الدفاعية. وجّهها إلى الأنظمة التي لديك إذن بتقييمها. لا تكن غريبًا في ذلك.