
قواعد الكشف، توقيعات YARA، قواعد auditd/Wazuh، وقوالب أحداث MISP لثغرة CVE-2026-31431 في نواة لينكس (Copy Fail) لتصعيد الامتيازات محليًا. تتضمن مؤشرات الاختراق (IoCs)، خطوات التخفيف، وتحليل الاستغلال.
تاريخ النشر: 2026-04-30
CVSSv3: 7.8 (عالي)
النوع: تصعيد الامتيازات المحلي (LPE)
النظام الفرعي: نواة Linux algif_aead / authencesn قالب تشفيري
المتأثر: أنوية Linux 4.14 – 6.18.21 (جميع التوزيعات تقريباً منذ 2017)
المراجع:
CVE-2026-31431 هو خلل منطقي أُدخل في النواة 4.14 (2017) عند التقاء ثلاثة تغييرات مستقلة:
authencesn (أُضيف عام 2011 لدعم ESN في IPsec) يكتب 4 بايتات من بيانات مؤقتة خارج حدود مخزن الإخراج.AF_ALG دعم AEAD في عام 2015، مما سمح لمساحة المستخدم بإرسال البيانات عبر splice() من ملفات محفوظة في ذاكرة الصفحات.algif_aead.c للعمل في المكان نفسه (req->src == req->dst)، مما يضع صفحات حية من ذاكرة الصفحات في قائمة تشتت قابلة للكتابة.النتيجة: يمكن لمستخدم غير مميز كتابة 4 بايتات يتحكم بها المهاجم بالضبط في نسخة ذاكرة الصفحات في النواة لأي ملف قابل للقراءة — بما في ذلك ثنائيات setuid و/etc/passwd — دون لمس الملف الموجود على القرص. إثبات المفهوم العملي هو سكربت Python بحجم 732 بايت. لا توجد حالة سباق. لا توجد إزاحات خاصة بالتوزيعات. موثوق عبر Ubuntu وRHEL وAmazon Linux وSUSE.
Attacker opens AF_ALG socket (family 38, type 5) └─ Binds to "authencesn(hmac(sha256),cbc(aes))" └─ Sets SOL_ALG (279) options including key and authsize └─ Accepts a connection socket
Attacker opens target file (e.g., /etc/passwd) read-only └─ Uses splice() to feed page-cache pages into the AEAD socket's RX buffer └─ Sends crafted AAD via sendmsg() — bytes 4–7 of AAD = attacker-controlled write value
authencesn performs in-place decryption: └─ scatterwalk_map_and_copy writes seqno_lo into the chained page-cache page └─ recvmsg() returns an error (HMAC fails — expected), but the write already happened
Page-cache now contains attacker-modified copy of the file └─ Kernel executes from page-cache, not disk └─ On-disk file is UNCHANGED — file integrity tools see nothing
يستهدف إثبات المفهوم `/etc/passwd`: حيث يحدد موقع حقل UID للمستخدم الحالي ويستبدله بـ `0000`، ثم يستدعي `su` للحصول على قشرة جذر (root).
---
## قيود الاكتشاف
> **اقرأ هذا القسم قبل نشر أي قواعد أدناه.**
هذا الاستغلال له خاصيتان تحدّان من تغطية الكشف بشكل كبير:
**1. تتم عملية الكتابة في ذاكرة التخزين المؤقت للصفحات (page cache)، وليس في نظام الملفات.**
أي أداة كشف تراقب أحداث نظام الملفات — `inotify`، `fanotify`، AIDE، Tripwire، مراقبة المسارات في auditd — لن **تلاحظ** التعديل. لا تتم كتابة الملف على القرص مطلقًا. هذا يعني أن علامات `-p w` (الكتابة) في مراقبة مسارات auditd لكل من `/usr/bin/su` أو `/etc/passwd` لن تلتقط الكتابة الفعلية للاستغلال.
**2. تستخدم الآلية واجهات نواة مشروعة.**
سوكيتات `AF_ALG` و`splice()` و`authencesn` جميعها لها استخدامات مشروعة (IPsec، اختبارات ذاتية للنواة، إدخال/إخراج بنمط sendfile). يجب أن يركز الكشف على *التركيب* بين هذه البدائيات بدلاً من أي منها بمعزل عن الآخرين، وينبغي توقع نتائج إيجابية كاذبة على الأنظمة التي تشغّل IPsec أو تجري اختبارات تشفير للنواة.
**ما يمكن أن يلتقطه الكشف:**
- استدعاء النظام `socket(AF_ALG, SOCK_SEQPACKET, 0)`
- استدعاء النظام `splice()` المرتبط بما سبق، خاصةً قرب الوصول إلى ثنائيات setuid
- سكربت إثبات المفهوم نفسه (عبر YARA)
- سلسلة الخوارزمية المحددة `authencesn(hmac(sha256),cbc(aes))` في ذاكرة العملية أو ملفات السكربت
**ما لا يمكن أن يلتقطه الكشف:**
- الكتابة الفعلية في ذاكرة التخزين المؤقت للصفحات (في الذاكرة، بلا حدث على نظام الملفات)
- الاستخدام بعد الاستغلال لمدخل ذاكرة التخزين المؤقت للصفحات المعدَّل (يبدو كاستدعاء عادي لـ `su` أو `passwd`)
- الاختلافات التي تتجنب Python أو سلسلة الخوارزمية المحددة
---
## التخفيف الفوري
قبل نشر قواعد الكشف، طبّق هذا التخفيف على أي مضيف غير مُصَحَّح:```bash
# Disable algif_aead kernel module — blocks the exploit primitive entirely
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
sudo rmmod algif_aead 2>/dev/null || true
تحقق من أن الإجراء الوقائي نشط باستخدام الكاشف الرسمي:```bash
python3 test_cve_2026_31431.py
> **ملاحظة:** سيفشل الأمر `rmmod` إذا لم تكن الوحدة النمطية محمّلة حاليًا؛ وهذا أمر مقبول. يمنع إعداد `modprobe.d` تحميلها في المستقبل. لا تأثير لهذا الإجراء التخفيفي على أحمال العمل القياسية لـ TLS أو SSH أو تشفير نظام الملفات — بل يؤثر فقط على IPsec مع أرقام التسلسل الموسعة باستخدام قالب `authencesn`، وهو أمر غير شائع خارج بوابات VPN المخصصة.
---
## قاعدة YARA
احفظ باسم `cve_2026_31431.yar`
> **نطاق الفحص:** صُممت هذه القاعدة لفحص ملفات نصوص بايثون على القرص أو الملتقطة من تفريغات الذاكرة. ستطابق الـ PoC المعروف والمتغيرات القريبة منه. لن تكتشف نشاط الاستغلال على مستوى استدعاءات النظام — استخدم قواعد auditd/Wazuh لذلك.```yara
rule CVE_2026_31431_CopyFail_PoC_HighConfidence {
meta:
description = "High-confidence match: CVE-2026-31431 Copy Fail PoC or close variant"
author = "Detection Engineering"
reference = "https://xint.io/blog/copy-fail-linux-distributions"
cve = "CVE-2026-31431"
date = "2026-04-30"
severity = "High"
cvss = "7.8"
strings:
// Algorithm string unique to this exploit path — very high fidelity
$alg_full = "authencesn(hmac(sha256),cbc(aes))" ascii
// Specific socket call signature from PoC: AF_ALG=38, SOCK_SEQPACKET=5
$socket_call = "socket(38,5,0)" ascii
// SOL_ALG socket option (decimal 279)
$solalg = "setsockopt(279" ascii
// Hex key/iv payload written via setsockopt in PoC
$key_payload = "0800010000000010" ascii
// splice() usage in context of AEAD operations
$splice = "splice(" ascii
// Target indicators from PoC (page-cache corruption targets)
$target_passwd = "/etc/passwd" ascii
$target_su = "/usr/bin/su" ascii
// AF_ALG aead bind strings
$aead_bind = "\"aead\"" ascii
condition:
// High-confidence: unique algorithm string alone is sufficient
$alg_full
or
// Medium-confidence: socket primitive + option number
($socket_call and $solalg)
or
// Medium-confidence: splice into AEAD socket targeting a setuid path
($aead_bind and $splice and ($target_passwd or $target_su))
or
// PoC hex payload present alongside splice
($key_payload and $splice)
}
rule CVE_2026_31431_CopyFail_Mechanism {
meta:
description = "Behavioral: AF_ALG AEAD + splice combination suggestive of CVE-2026-31431 technique"
author = "Detection Engineering"
reference = "https://xint.io/blog/copy-fail-linux-distributions"
cve = "CVE-2026-31431"
date = "2026-04-30"
severity = "Medium"
note = "Higher false positive rate than HighConfidence rule — review matches in context"