
مجموعة أدوات للبحث والكشف عن ثغرة LPE في نواة لينكس CVE-2026-31431، تشمل تحليل الاستغلال، قواعد YARA، كشف auditd/Falco، دليل التصحيح، وبيئة مختبرية.
algif_aeadCISA KEV | CVSS 7.8 عالية | يؤثر على نوى لينكس 4.14 – أوائل 2026 (~9 سنوات)
CVE-2026-31431، الملقب بـ "Copy Fail"، هو ثغرة تصعيد امتيازات محلية (LPE) عالية الخطورة في النظام الفرعي للتشفير في نواة لينكس. يمكن لمستخدم محلي منخفض الامتيازات تصعيد صلاحياته إلى الجذر (root) في ثوانٍ على أي نظام غير مُصَحَّح.
| السمة | القيمة |
|---|---|
| CVE | CVE-2026-31431 |
| اللقب | Copy Fail |
| CVSS v3.1 | 7.8 عالية |
| ناقل الهجوم | محلي |
| الامتيازات المطلوبة | منخفضة |
| تفاعل المستخدم | لا شيء |
| المكوّن | crypto/algif_aead.c — قالب authencesn |
| تاريخ الإدخال | 2017 (الالتزام 72548b093ee3) |
| تاريخ الكشف | 2026 |
| سنوات الصمت | ~9 سنوات |
| CISA KEV | نعم |
| PoC عام | نعم (سكربت Python مستقل بحجم 732 بايت) |
detection/check_vulnerable.sh قبل وبعد المعالجة.CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
| المقياس | القيمة | الأساس المنطقي |
|--------|-------|-----------|
| ناقل الهجوم | **محلي** | يتطلب وصولاً إلى الصدفة (SSH، تنفيذ حاوية، وصول مادي) |
| تعقيد الهجوم | **منخفض** | موثوق وآلي بالكامل — لا يتطلب حالة سباق |
| الامتيازات المطلوبة | **منخفضة** | أي حساب مستخدم غير مميز |
| تفاعل المستخدم | **لا شيء** | لا يتطلب تفاعل الضحية |
| السرية | **عالية** | اختراق كامل للنظام |
| السلامة | **عالية** | اختراق كامل للنظام |
| التوفر | **عالية** | اختراق كامل للنظام |
### مشهد التهديدات
| العامل | التقييم |
|--------|-----------|
| توفر PoC | عام، مُسلّح، بايثون مستقل بحجم 732 بايت |
| موثوقية الاستغلال | عالية — يعمل عبر التوزيعات المختبرة دون تعديل |
| صعوبة الاكتشاف | عالية — لا كتابة على القرص، لا صفحات متسخة |
| مهارة المهاجم المطلوبة | منخفضة — مبتدئ مع PoC عام |
| CISA KEV | أُضيف في 2026 — مراقب بنشاط |
| Microsoft Defender | مُعلَّم كقيد تحقيق نشط |
### البيئات المتأثرة
| البيئة | الخطر |
|-------------|------|
| خوادم Linux على المعدن العاري | حرج |
| أجهزة Linux الافتراضية (سحابية أو محلية) | حرج |
| عُقد Kubernetes | حرج (يتيح أيضًا الهروب من الحاويات) |
| مضيفات Docker | حرج |
| الاستضافة المشتركة / متعددة المستأجرين | حرج |
| WSL2 / Linux على Windows | يُقيَّم حسب إصدار النواة |
---
## 3. الغوص التقني العميق
### 3.1 الخلفية: AF_ALG وAEAD
تعرض نواة Linux العمليات التشفيرية لمساحة المستخدم عبر **مقابس AF_ALG** (`AF_ALG = 38`). تتيح هذه الواجهة (`algif_aead`) للتطبيقات غير المميزة استدعاء مسرعات التشفير الخاصة بالأجهزة في النواة دون الحاجة إلى كود في وضع النواة.
**AEAD** (التشفير المصادق عليه مع البيانات المرتبطة) مثل AES-GCM وChaCha20-Poly1305 تُستخدم على نطاق واسع في TLS وتشفير الأقراص وبروتوكولات VPN. القالب المعرض للخطر هو `authencesn` — وهو تركيب AEAD يستخدم `hmac(sha256)` + `cbc(aes)` مع دعم رقم التسلسل الموسع (ESN)، ويُستخدم بشكل شائع في IPsec.
### 3.2 السبب الجذري
في عام 2017، أدخل الالتزام `72548b093ee3` **عملية AEAD في المكان** إلى `algif_aead` كتحسين للأداء — مما سمح لمحرك التشفير بقراءة وكتابة نفس المخزن المؤقت. كان هذا معيبًا:```
The bug chain:
1. Caller binds AF_ALG socket to:
authencesn(hmac(sha256),cbc(aes))
2. Caller sends a decryption request via sendmsg() with specific flags
3. Caller uses splice() to feed PAGE CACHE PAGES from an open file
descriptor directly into the socket's scatterlist
4. The authencesn template, during ESN header processing, uses the
OUTPUT BUFFER as scratch space — writing 4 bytes past the
expected output boundary
5. Because the scatterlist contains page cache pages (not private
copies), this scratch write lands DIRECTLY IN THE PAGE CACHE
6. Page cache is shared kernel-wide — all processes reading the
same file now see the modified bytes
Key insight: splice() is zero-copy — it hands page cache references
to the socket. The in-place "optimization" then writes INTO those
pages. No dirty bit is set because the write goes through the crypto
engine, not the normal write path.
توفر الثغرة كتابة محكومة بحجم 4 بايت في ذاكرة التخزين المؤقت للصفحات لأي ملف يمكن للمهاجم فتحه للقراءة:
الكتابة قابلة للتكرار — يقوم الاستغلال بتكرار الكتابة بحجم 4 بايت لترقيع تسلسلات كود أكبر.
[1] Open /usr/bin/su (or any setuid-root binary) for reading ↓ [2] Map a copy to find target instruction bytes (e.g., UID check, execve path, security gate) ↓ [3] Compute exact page cache offset of target bytes ↓ [4] Set up AF_ALG socket → authencesn(hmac(sha256),cbc(aes)) ↓ [5] splice() the target binary's page cache into the socket ↓ [6] Trigger decryption → authencesn scratch write patches the target bytes in page cache (4 bytes per iteration) ↓ [7] Repeat for each 4-byte patch needed ↓ [8] Execute /usr/bin/su → runs root-owned setuid binary but now with attacker-controlled code in page cache ↓ [9] Root shell
### 3.5 لماذا تفشل الدفاعات القياسية
| الدفاع | تم تجاوزه؟ | السبب |
|---------|-----------|--------|
| مراقبة تكامل الملفات (Tripwire/AIDE) | **نعم** | لا يوجد تغيير على القرص |
| فحوصات تجزئة الملفات في IDS | **نعم** | بايتات القرص لم تتغير |
| مراقبة الملفات عبر `inotify` | **نعم** | لا يوجد حدث كتابة في VFS |
| SELinux / AppArmor | **جزئي** | يتحكم في العملية، وليس في الكتابة إلى ذاكرة التخزين المؤقت للصفحات عبر محرك التشفير |
| وحدات التحميل للقراءة فقط | **نعم** | يتم تعديل ذاكرة التخزين المؤقت للصفحات في الذاكرة، وليس عبر وحدة التحميل |
| مراقبة `auditd` على الملف الثنائي | **نعم** | يراقب audit عمليات الكتابة في VFS — وهذا يتجاوز VFS |
### 3.6 إصدارات النواة المتأثرة
| الفرع | معرّض حتى | الإصلاح من |
|--------|-------------------|------------|
| 4.14.x | الكل (أصل الثغرة) | لا يوجد إصلاح من المصدر (EOL) |
| 5.4.x (LTS) | الكل | يتطلب إعادة توجيه من التوزيعة |
| 5.10.x (LTS) | الكل | يتطلب إعادة توجيه من التوزيعة |
| 5.15.x (LTS) | الكل | يتطلب إعادة توجيه من التوزيعة |
| 6.1.x (LTS) | ≤ 6.1.129 | **6.1.130+** |
| 6.6.x (LTS) | ≤ 6.6.86 | **6.6.87+** |
| 6.12.x (LTS) | ≤ 6.12.22 | **6.12.23+** |
| 6.15-rc | تم إصلاحه في rc | **6.15-rc+** |
> قد تكون نوى التوزيعات قد أعادت توجيه الإصلاح بأرقام إصدارات مختلفة. تحقق دائمًا من النشرة الأمنية لتوزيعتك.
---
## 4. منهجية الهجوم — الفريق الأحمر
> **مطلوب إذن.** هذا القسم موجود لمساعدة المدافعين على فهم منظور المهاجم. نفّذ فقط على الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها.
### 4.1 المتطلبات الأساسية
- شل بصلاحيات منخفضة على الهدف (SSH، تنفيذ داخل حاوية، سلسلة RCE)
- Python 3.10+ **أو** ملف ثنائي C مُجمّع
- نواة غير مُصلحة مع توفر `algif_aead`
### 4.2 الاستطلاع```bash
# Check if vulnerable
uname -r
cat /proc/crypto | grep -A10 "authencesn"
lsmod | grep algif_aead
# Verify setuid target exists
ls -la /usr/bin/su /usr/bin/sudo /usr/bin/passwd
أصدر الباحثون الأصليون (Theori) إثبات مفهوم (PoC) مستقلًا كاملًا بلغة Python بحجم 732 بايت:
python3 copy_fail_exp.py
python3 copy_fail_exp.py /usr/bin/passwd
تتوفر نسخة محلية في `exploit/poc.py`. راجع `exploit/README.md` للتحليل الفني.
### 4.4 سيناريو الهروب من الحاوية
نظرًا لأن ذاكرة التخزين المؤقت للصفحات في لينكس مشتركة بين جميع العمليات على نفس المضيف (بما في ذلك المضيف والحاويات):```
Attacker in container → patches /usr/bin/su in HOST page cache
Host user runs su → executes attacker code as root on host
يعمل هذا حتى من الحاويات غير المميزة، طالما أن نواة المضيف قابلة للاستغلال.
هذا هو التركيز الأساسي لهذا المستودع.
شغّل سكربت الكشف على أي نظام لينكس:```bash chmod +x detection/check_vulnerable.sh sudo ./detection/check_vulnerable.sh
**ما الذي يفحصه:**
- إصدار النواة مقابل النطاقات المعروفة بأنها قابلة للاستغلال
- حالة تحميل وحدة `algif_aead` وحالة الحظر (blacklist)
- توفر `authencesn` في `/proc/crypto`
- سلامة ذاكرة التخزين المؤقت للصفحات (page cache) للملفات الثنائية ذات setuid (يتطلب صلاحيات root)
- حالة التصحيحات الخاصة بالتوزيعة
- العمليات الجارية بحثًا عن مؤشرات استغلال نشطة
يتم حفظ تقرير بختم زمني في `/tmp/cve-2026-31431-report-*.txt`.
### 5.2 كشف YARA
يتم توفير قاعدتي YARA في `detection/yara/`:
| ملف القاعدة | الغرض |
|-----------|---------|
| `cve_2026_31431_base.yar` | يطابق PoC العام المعروف بدقة |
| `cve_2026_31431_enhanced.yar` | يكتشف الاستغلالات المُشوّشة (obfuscated) والمُجمّعة (compiled) والبديلة (variant) |```bash
# Install YARA
apt-get install yara # Debian/Ubuntu
dnf install yara # RHEL/Fedora
apk add yara # Alpine
# Scan running process executables
sudo yara -r detection/yara/cve_2026_31431_enhanced.yar /proc/*/exe 2>/dev/null
# Scan common dropper locations
sudo yara -r detection/yara/cve_2026_31431_enhanced.yar /home /tmp /var/tmp /dev/shm
# Scan uploaded files / quarantine
yara detection/yara/cve_2026_31431_base.yar <suspect_file>
لماذا القواعد المحسّنة مهمة: قد يقوم المهاجمون بإخفاء الـ PoC العام بلغة بايثون (ترميز السلاسل بـ base64، ترميز اسم الخوارزمية بـ XOR، الترجمة إلى ثنائي C، إزالة الرموز). تكتشف القاعدة المحسّنة هذه المتغيرات من خلال استهداف الثوابت التي لا يمكن إزالتها دون كسر الاستغلال:
authesn كاسم الخوارزميةsplice() لتحقيق وصول صفر-نسخ إلى ذاكرة التخزين المؤقت للصفحات38)انشر إلى /etc/audit/rules.d/cve-2026-31431.rules:```bash
-a always,exit -F arch=b64 -S socket -F a0=38 -k cve_2026_31431_afalg
-a always,exit -F arch=b64 -S splice -k cve_2026_31431_splice
-a always,exit -F arch=b64 -S init_module -S finit_module -k cve_2026_31431_modload
-a always,exit -F arch=b64 -S execve -F euid=0 -F auid>=1000 -k cve_2026_31431_suid_exec
إعادة التحميل:```bash
augenrules --load && service auditd restart
الاستعلام عن محاولات الاستغلال:```bash
ausearch -k cve_2026_31431_afalg --start today
ausearch -k cve_2026_31431_afalg -k cve_2026_31431_splice --start today
### 5.4 كشف Falco / eBPF
أضِف إلى `/etc/falco/rules.d/cve-2026-31431.yaml`:```yaml
- rule: CVE-2026-31431 AF_ALG Socket Creation
desc: Detects unprivileged process creating AF_ALG socket (family 38) — required step for Copy Fail exploit
condition: >
syscall.type = socket and
evt.arg.domain = 38 and
not user.uid = 0 and
not proc.name in (known_crypto_daemons)
output: >
CVE-2026-31431 exploitation attempt - AF_ALG socket (user=%user.name
uid=%user.uid pid=%proc.pid cmd=%proc.cmdline)
priority: CRITICAL
tags: [cve-2026-31431, lpe, kernel, crypto]
- list: known_crypto_daemons
items: [strongswan, charon, pluto, openssl]
- rule: CVE-2026-31431 Splice After AF_ALG
desc: Detects splice() syscall shortly after AF_ALG socket creation — exploitation sequence
condition: >
syscall.type = splice and
not user.uid = 0 and
evt.elapsed < 5000000000
output: >
CVE-2026-31431 splice after AF_ALG socket (user=%user.name pid=%proc.pid)
priority: CRITICAL
tags: [cve-2026-31431, lpe]
نظرًا لأن الاستغلال يعدّل ذاكرة التخزين المؤقت للصفحات دون الكتابة إلى القرص، فإن أدوات مراقبة سلامة الملفات (FIM) القياسية لا تكتشف ذلك. يكتشف هذا الفحص الاستغلال النشط:```bash #!/bin/bash
SETUID_BINS=("/usr/bin/su" "/usr/bin/sudo" "/usr/bin/passwd")
for binary in "${SETUID_BINS[@]}"; do [[ -f "$binary" ]] || continue LIVE_HASH=$(sha256sum "$binary" | awk '{print $1}') echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null # flush page cache DISK_HASH=$(sha256sum "$binary" | awk '{print $1}') if [[ "$LIVE_HASH" != "$DISK_HASH" ]]; then echo "CRITICAL: Page cache tampering detected on $binary" echo " Pre-flush: $LIVE_HASH" echo " Post-flush: $DISK_HASH" else echo "OK: $binary page cache matches disk" fi done
> **ملاحظة إنتاجية:** `drop_caches` يسبب انخفاضًا في الأداء. قم بتشغيله خلال نوافذ الصيانة أو على الأنظمة غير الحرجة أولاً.
### 5.6 مؤشرات الاختراق (IoCs)
| نوع IoC | المؤشر | مستوى الثقة |
|----------|-----------|-----------|
| سلسلة (ثنائية/نصية) | `authencesn(hmac(sha256),cbc(aes))` | عالي |
| بايتات سداسية عشرية | `78 DA AB 77 F5 71 63 62 64 64` (ترويسة حمولة zlib) | عالي |
| تسلسل استدعاءات النظام | `socket(38,5,0)` → `bind()` → `splice()` | عالي |
| الشبكة | لا شيء — محلي بالكامل | غير متاح |
| الملفات | لا كتابة على القرص (تخفي) | — |
| العمليات | عملية Python/C قصيرة العمر مع مقبس AF_ALG | متوسط |
| ذاكرة التخزين المؤقت للصفحات | ذاكرة تخزين مؤقت لصفحات ثنائي setuid ≠ تجزئة على القرص | حرج |
### 5.7 استعلامات كشف SIEM
**Splunk (مصدر auditd):**```spl
index=linux_audit sourcetype=auditd action=SYSCALL syscall=socket a0="0x26"
| join pid [
search index=linux_audit sourcetype=auditd action=SYSCALL syscall=splice
]
| where (_time - join_time) < 30
| table _time host user pid cmd a0
| eval severity="CRITICAL"
Elastic KQL:```kql event.action: "SYSCALL" AND process.args: "socket" AND auditd.data.a0: "0x26" AND NOT user.id: "0"
**Microsoft Sentinel (KQL):**```kql
Syslog
| where Facility == "kern" or ProcessName == "audit"
| where SyslogMessage contains "socket" and SyslogMessage contains "a0=0x26"
| extend UserName = extract("uid=([0-9]+)", 1, SyslogMessage)
| where UserName != "0"
| project TimeGenerated, Computer, UserName, SyslogMessage
| order by TimeGenerated desc
شغّل سكربت التصحيح التلقائي:```bash chmod +x patch/patch.sh sudo ./patch/patch.sh
### 6.1 التخفيف الفوري (بدون الحاجة إلى إعادة تشغيل*)```bash
# Blacklist the module permanently
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
echo "install authencesn /bin/false" | sudo tee -a /etc/modprobe.d/disable-algif-aead.conf
# Unload if currently loaded
sudo rmmod algif_aead 2>/dev/null || echo "Not loaded — mitigation active after config"
# Verify
lsmod | grep algif_aead && echo "WARNING: still loaded — reboot needed" || echo "OK: not loaded"
*إذا كانت algif_aead محمّلة بالفعل، يلزم إعادة تشغيل النظام حتى يسري الحظر بالكامل.
الآثار الجانبية: قد تفشل التطبيقات التي تستخدم واجهة AEAD الخاصة بالنواة عبر AF_ALG (وهي غير شائعة — معظمها يستخدم OpenSSL في مساحة المستخدم). عادةً لا تتأثر أدوات TLS القياسية، وتشفير الأقراص، وأدوات VPN.
kubectl get nodes -o wide
kubectl drain --ignore-daemonsets --delete-emptydir-data
kubectl uncordon
استخدم أدوات الترقية التلقائية للعقد (Karpenter، Managed Node Groups) أو تدوير تجمع عقد المجموعة حيثما كان ذلك متاحًا.
### 6.4 التحقق بعد التصحيح```bash
# Re-run detection script
sudo ./detection/check_vulnerable.sh
# Quick manual verification
uname -r # confirm new kernel version
lsmod | grep algif_aead # should be empty
cat /proc/crypto | grep authencesn # should return nothing (or still listed but module blacklisted)
يتم توفير مختبر Alpine Docker بسيط لاختبار أدوات الكشف بأمان.```bash cd lab/ docker compose up -d docker exec -it cve-2026-31431-lab /bin/sh
/cve-2026-31431/detection/check_vulnerable.sh
> **مهم:** حاويات Docker تتشارك نواة المضيف. يختبر المختبر حالة ثغرات **نواة مضيفك**. تعكس نتائج الثغرات النظام المضيف الفعلي — وهذا مقصود لتقييم واقعي.
للاختبار المعزول بإصدار نواة محدد وضعيف، استخدم جهازًا افتراضيًا مخصصًا بنواة مثبتة. راجع `lab/README.md` للحصول على إرشادات إعداد الجهاز الافتراضي.
---
## 8. المراجع
| المورد | الرابط |
|----------|------|
| استشارة NVD | https://nvd.nist.gov/vuln/detail/CVE-2026-31431 |
| البحث الأصلي | https://copy.fail |
| المقال التقني | https://xint.io/blog/copy-fail-linux-distributions |
| PoC عام | https://github.com/theori-io/copy-fail-CVE-2026-31431 |
| كتالوج CISA KEV | https://www.cisa.gov/known-exploited-vulnerabilities-catalog |
| إصلاح النواة — تراجع الالتزام | `a664bf3d603d` / `fafe0fa2995a` |
| الالتزام الضعيف | `72548b093ee3` |
| استشارة Microsoft Defender | مدونة Microsoft Defender Threat Intelligence |
---
## هيكل المستودع```
cve-2026-31431/
├── README.md ← This document
├── exploit/
│ ├── README.md ← Technical exploit breakdown
│ └── poc.py ← Public PoC (theori-io, for reference)
├── detection/
│ ├── README.md ← Detection guide
│ ├── check_vulnerable.sh ← Vulnerability & IoC detection script
│ └── yara/
│ ├── cve_2026_31431_base.yar ← Detects known public PoC
│ └── cve_2026_31431_enhanced.yar ← Detects obfuscated/compiled variants
├── patch/
│ ├── README.md ← Remediation guide
│ └── patch.sh ← Automated patch/mitigation script
└── lab/
├── README.md ← Lab setup guide
├── Dockerfile ← Alpine-based lab container
└── docker-compose.yml ← Lab orchestration
يُقدَّم هذا البحث لأغراض تعليمية وأمنية دفاعية فقط. صُمِّمت جميع الأدوات لمساعدة المدافعين على اكتشاف ومعالجة CVE-2026-31431 على الأنظمة المصرَّح لهم بحمايتها.
المستودع مُدار بواسطة rippsec
| الخاصية | القيمة |
|---|
| حجم الكتابة | 4 بايت |
| التحكم في الإزاحة | نعم — يتحكم المهاجم بها عبر إزاحة splice |
| الهدف | ذاكرة التخزين المؤقت للصفحات لأي ملف قابل للقراءة |
| وضع علامة الصفحة المتسخة | لا شيء |
| التعديل على القرص | لا شيء |
| تحديث الطابع الزمني | لا شيء |
| إدخال سجل النواة | لا شيء (إلا إذا تم تكوين auditd) |
| التقنية | المعرّف | ملاحظات |
|---|
| استغلال تصعيد الامتيازات | T1068 | التقنية الأساسية |
| إساءة استخدام آلية التحكم في الترقية: Setuid/Setgid | T1548.001 | اختطاف ثنائي Setuid |
| اختطاف تدفق التنفيذ | T1574 | تصحيح ثنائي في الذاكرة |
| إزالة المؤشرات: Timestomp | T1070.006 | لا يتم تحديث أي طوابع زمنية |
| تنفيذ الأوامر غير المباشر | T1202 | الثنائي المُصحح ينفذ الصدفة |
| التوزيعة | أمر التحديث |
|---|
| Ubuntu / Debian | apt-get update && apt-get upgrade linux-image-generic && reboot |
| RHEL / CentOS / Rocky | dnf update kernel && reboot |
| Amazon Linux 2 | yum update kernel && reboot |
| Amazon Linux 2023 | dnf update kernel && reboot |
| SUSE / SLES | zypper update kernel-default && reboot |
| Arch Linux | pacman -Syu linux && reboot |
| Alpine Linux | apk update && apk upgrade linux-lts && reboot |
| Debian | apt-get update && apt-get upgrade linux-image-amd64 && reboot |