
اكتشاف وتخفيف CVE-2026-31431 (فشل النسخ) على أنظمة لينكس.
أداة CLI بلغة Python بدون أي تبعيات خارجية تتحقق مما إذا كان مضيف Linux يبدو معرّضًا لـ CVE-2026-31431 ("Copy Fail") دون تشغيل أي استغلال. يمكنها أيضًا تطبيق تخفيف مؤقت متحفظ عندما يكون المكوّن المتأثر قابلًا للتحميل كوحدة نواة. تدعم Debian/Ubuntu وRHEL/Rocky/AlmaLinux وFedora وSUSE.
pip install copyfail-guard
copyfail-guard
CVE-2026-31431 هو خطأ منطقي في واجهة النواة algif_aead (مقبس AF_ALG AEAD)
يسمح لمستخدم محلي غير مميز بإجراء كتابة محكومة من 4 بايت
في ذاكرة التخزين المؤقت للصفحات لأي ملف قابل للقراءة، مما يؤدي إلى تصعيد الامتيازات إلى الجذر.
درجة CVSS 7.8، موجودة منذ النواة 4.14، وتم إصلاحها في الإصدارات المستقرة بدءًا من أبريل 2026.
يوجد استغلال عام والمشكلة مدرجة في CISA KEV.
بعض فحوصات الثغرات تعتمد على "تشغيل الاستغلال ومعرفة ما إذا كان يعمل". هذا ليس أمرًا جيدًا للقيام به على المضيفات الإنتاجية. يتبع copyfail-guard نهجًا غير استغلالي. لا يحاول تشغيل الخطأ، أو تعديل ملفات setuid، أو إثبات قابلية الاستغلال. بدلاً من ذلك، يفحص حالة المضيف (إصدار النواة، حالة تحميل الوحدة، إعدادات modprobe) ويبلغ ما إذا كان الجهاز يبدو معرّضًا.
fix بسيط عمدًا — فهو لا يستدعي مدير الحزم الخاص بك.
الإصلاح الدائم يتطلب ترقية النواة عبر آلية التحديث العادية لتوزيعتك.
pip install copyfail-guard
أو شغّله مباشرة من نسخة مستنسخة دون تثبيت:
PYTHONPATH=src python3 -m copyfail_guard detect
copyfail-guard [--json] [--dry-run] [--quiet] [detect | fix | reset]
$ copyfail-guard
[copyfail-guard] CVE-2026-31431 (Copy Fail) — VULNERABLE
Distribution: Ubuntu 24.04.1 LTS (debian family)
Kernel: 6.8.0-50-generic (branch 6.12, fixed at 6.12.85)
Module: algif_aead — loaded as .ko
Mitigation: none
Recommended actions:
1. Apply mitigation now:
sudo copyfail-guard fix
2. Update the kernel for a permanent fix:
Update the kernel on this system to 6.12.85 or later (whatever your
distribution ships once it has integrated the CVE-2026-31431 fix), then reboot.
دائمًا قم بمعاينة النتيجة باستخدام --dry-run قبل التطبيق:
$ sudo copyfail-guard --dry-run fix
[copyfail-guard] fix (dry-run) — OK
[ ok ] Pre-flight checks (Linux, host, root)
[skip] Would write modprobe blacklist [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[skip] Would attempt to unload algif_aead (not currently loaded) [algif_aead]
[skip] Would append audit record [/var/log/copyfail-guard.log]
$ sudo copyfail-guard fix
[copyfail-guard] fix — OK
[ ok ] Pre-flight checks (Linux, host, root)
[ ok ] Wrote modprobe blacklist [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[ ok ] Unloaded algif_aead [algif_aead]
[ ok ] Appended audit record [/var/log/copyfail-guard.log]
Next step for a permanent fix:
Update the kernel to a CVE-2026-31431-patched version using your
distribution's normal update mechanism, then reboot.
إذا كانت الوحدة قيد الاستخدام حاليًا، فقد تفشل خطوة إلغاء التحميل. في هذه الحالة يمكن تثبيت قاعدة modprobe الدائمة بنجاح، وسيقوم copyfail-guard بالإبلاغ عن فشل إلغاء التحميل كسجل إجراء بنمط تحذيري بدلاً من الادعاء بأن الوحدة تمت إزالتها.
--json يُصدر مستندًا منظمًا على stdout، مناسبًا لـ jq أو Ansible أو خطوط SOAR:
$ copyfail-guard --json | jq .verdict
"vulnerable"
$ copyfail-guard --json | jq '{verdict, kernel: .kernel.patched_threshold}'
{
"verdict": "vulnerable",
"kernel": "6.12.85"
}
بعد الترقية إلى نواة مصححة، استخدم الأمر الفرعي reset لإزالة
قاعدة modprobe المثبتة بواسطة fix:
$ sudo copyfail-guard --dry-run reset
[copyfail-guard] reset (dry-run) — OK
[skip] Would remove /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
$ sudo copyfail-guard reset
[copyfail-guard] reset — OK
[ ok ] Removed /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
Reboot to allow algif_aead to load again if needed.
reset عديم الحالة — إذا كان الملف غائبًا بالفعل فإنه يخرج بالرمز 0 مع رسالة
"لا شيء للقيام به". ثم أعد التشغيل.
الحاويات. يرفض fix العمل داخل حاوية لأن /proc/modules
يعكس نواة المضيف لكن الحاوية لا تملك صلاحية تحميل أو إلغاء تحميل
الوحدات. شغّل copyfail-guard على المضيف مباشرة.
algif_aead المدمج. بعض النوى تدمج algif_aead مباشرة في
الصورة (CONFIG_CRYPTO_USER_API_AEAD=y). تخفيف modprobe ليس له أي تأثير في
هذا التكوين؛ الإصلاح الوحيد هو ترقية النواة. يبلغ detect
بـ unmitigable_builtin في هذه الحالة. تشغيل fix سيظل يثبّت قاعدة modprobe
(التي تمنع أي نسخة قابلة للتحميل متعايشة من التحميل) لكن النسخة المدمجة
غير متأثرة — ترقية النواة وإعادة التشغيل هما الحل الحقيقي الوحيد.
blacklist مقابل install … /bin/false. كلا التوجيهين يمنعان
التحميل التلقائي العادي، لكن install algif_aead /bin/false أقوى لأنه
يمنع أيضًا استدعاءات modprobe algif_aead الصريحة العادية. يمكن لمسؤول
بصلاحيات كافية تجاوز سياسة modprobe، على سبيل المثال باستخدام
أدوات تحميل وحدات منخفضة المستوى أو أعلام modprobe خاصة. يثبّت copyfail-guard دائمًا
الصيغة الأقوى. إذا كان نظامك يحتوي بالفعل على توجيه blacklist بسيط،
تبلغ الأداة بـ mitigated لكنها تصدر ملاحظة توصي بالترقية.
SELinux/AppArmor. الكتابة إلى /etc/modprobe.d/ على RHEL ترث عادةً
system_u:object_r:modules_conf_t:s0 من الدليل الأصلي، لذا لا حاجة عادةً
لإعادة وضع العلامات يدويًا للملف الذي يكتبه copyfail-guard.
initramfs. algif_aead غير مضمن عادةً في صورة الإقلاع على التوزيعات
الرئيسية، لذا لا يقوم copyfail-guard بتشغيل update-initramfs -u أو
dracut -f بعد تثبيت قاعدة modprobe. إذا كانت توزيعتك أو بنيتك المحلية
تتضمن algif_aead في initramfs، اتبع إرشادات النواة/الوحدة الخاصة بتوزيعتك.
Apache 2.0 — انظر LICENSE.
| الأمر الفرعي | الإجراء |
|---|
detect | يجمع خمس إشارات (إصدار النواة، /proc/modules، modules.builtin، modules.dep، إعدادات modprobe) في واحد من ستة أحكام |
fix | يكتب بشكل ذري قاعدة modprobe install algif_aead /bin/false ويحاول إلغاء تحميل algif_aead |
reset | يزيل قاعدة modprobe المثبتة بواسطة fix (شغّله بعد الترقية إلى نواة مصححة) |
| الرمز | المعنى |
|---|
0 | آمن — الحكم هو patched أو mitigated أو not_applicable؛ أو نجحت خطوة الإصلاح الدائم |
1 | معرّض — الحكم هو vulnerable أو unmitigable_builtin |
2 | خطأ — تعذر تحديد الحالة، أو رفض شرط مسبق، أو فشلت خطوة الإصلاح الدائم |
| الحكم | الوصف |
|---|
patched | النواة قيد التشغيل عند الإصدار المصحح أو أحدث |
mitigated | النواة معرّضة لكن algif_aead محظور بواسطة إعدادات modprobe |
not_applicable | النواة معرّضة لكن algif_aead غير موجود على هذا النظام |
vulnerable | النواة معرّضة، الوحدة قابلة للتحميل، لا يوجد تخفيف مطبق |
unmitigable_builtin | algif_aead مدمج في صورة النواة — تخفيف modprobe ليس له أي تأثير؛ ترقية النواة مطلوبة |
unknown | تعذر تحليل إصدار النواة أو أنه خارج النطاق المُقيَّم |