
POC لـ CVE-2026-23416 (linux kernel 6.17 – linux kernel 7 rc5) - ثغرة اكتشفها أنطونيوس
mm/mseal: تحديث نهاية VMA بشكل صحيح عند الدمج
تم اكتشاف الثغرة بواسطة Antonius / Blue Dragon Security
| الحقل | التفاصيل |
|---|---|
| معرف CVE | CVE-2026-23416 |
| النظام الفرعي | mm/mseal — mm/vma.c |
| المتأثر | نواة لينكس 6.17 حتى 7.0-rc5 |
| تم الإصلاح في | النواة 7.0-rc6، الإصدارات المستقرة الخلفية 6.18.21، 6.19.11 |
| الوصول المطلوب | مستخدم بدون صلاحيات (UID 1000، بدون قدرات) |
| استدعاءات النظام المستخدمة | memfd_create, mmap, mseal |
| قابلية التكرار | 100% حتمي، أقل من ثانية |
| تاريخ الحجز | 2026-01-13 |
| تاريخ النشر | 2026-04-02 |
يقع الخطأ في mseal_apply() داخل mm/mseal.c. عند التكرار على VMAs لتطبيق استدعاء النظام mseal(2)، تتعقب الدالة الموضع باستخدام curr_start و curr_end:
/* Simplified pre-fix logic */
curr_end = vma->vm_end;
/* ... process VMA ... */
curr_start = curr_end; /* advance to next VMA */
المشكلة: يمكن لـ vma_modify_flags() — التي تُستدعى أثناء التكرار — أن تدمج VMAs، مما يغير vma->vm_end في مكانه. هذا يجعل قيمة curr_end التي تم التقاطها قبل الدمج قديمة. في التكرار التالي، يتم تعيين curr_start إلى curr_end القديمة، مما ينتج عنوان بداية غير صحيح.
في نوى التصحيح (CONFIG_DEBUG_VM)، تؤدي حالة vmg غير المتسقة إلى:
VM_WARN_ON_VMG(middle &&
((middle != prev && vmg->start != middle->vm_start) ||
vmg->end > middle->vm_end))
عند mm/vma.c:830، مما ينتج تحذير kernel WARNING.
في نوى الإنتاج (حيث يتم تحويل WARN إلى no-op)، يستمر curr_start القديم بصمت — مما يعني أنه قد يتم تطبيق VM_SEALED على نطاق عنوان غير صحيح دون أي خطأ مرئي، مما يقوض ضمان الأمان الذي صمم mseal(2) لتوفيره.
mseal(2)
└─ do_mseal() [mm/mseal.c]
└─ mseal_apply()
└─ vma_modify_flags() [mm/vma.c]
└─ vma_modify()
└─ vma_merge_existing_range()
└─ VM_WARN_ON_VMG fires at line 830
/* BEFORE fix — mm/mseal.c mseal_apply() */
curr_end = vma->vm_end; // captured here
/* ... vma_modify_flags() may merge VMAs, changing vma->vm_end ... */
curr_start = curr_end; // stale! merge is not reflected
يقوم الإصلاح بتعيين curr_end = vma->vm_end بشكل غير مشروط في كل تكرار بعد أي دمج محتمل، ويضيف أيضًا تقييد curr_start/curr_end كقيم const مستمدة من النطاق المدخل وحدود VMA:
/* AFTER fix */
curr_end = vma->vm_end; // unconditional, always fresh
يقوم نموذج PoC ببناء التخطيط التالي قبل استدعاء mseal() الثاني:
[0x21da6000 - 0x21de5fff] VMA-A (fd2, MAP_SHARED|MAP_FIXED) ← مختوم بـ VM_SEALED بعد الخطوة 1
[0x21de6000 - 0x21e82fff] VMA-B (fd2, MAP_SHARED|MAP_FIXED) ← غير مختوم
[0x21e83000 - 0x21e84fff] VMA-C (متبقي)
الاستدعاء الثاني mseal(m2, 0x70000) يستهدف [0x21da6000 – 0x21e15fff]، ممتدًا عبر VMA-A (مختوم) إلى VMA-B (غير مختوم). داخل mseal_apply()، يتم استخدام curr_end القديم من VMA-A كـ curr_start عند معالجة VMA-B، مما يخلق حالة vmg غير متسقة.
memfd_create + mmap + mseal، ولا حاجة لأي CAP_*.mseal(2) هي أداة أمان أساسية — تحمي ثبات VMA. خطأ منطقي في تطبيقها يعني أنه قد يتم تطبيق VM_SEALED بشكل خاطئ بصمت عند عبور VMAs ذات حالات ختم مختلطة.ملف: cve-2026-23416-poc.c
gcc -o poc cve-2026-23416-poc.c
./poc
CONFIG_DEBUG_VM)============================================
CVE-2026-23416-POC
Discovered by : Antonius / Blue Dragon Security
https://bluedragonsec.com
https://github.com/bluedragonsecurity
============================================
[iter 0]
[iter 1]
...
[+] WARNING triggered N times total
تحقق من dmesg لـ:
WARNING: CPU: X PID: Y at mm/vma.c:830 vma_merge_existing_range+0x...
CONFIG_DEBUG_VM=y لملاحظة VM_WARN_ON_VMG (في نوى الإنتاج لا يزال الخطأ موجودًا لكنه صامت)ثلاثة التزامات إصلاح من المنبع (مطبقة في 7.0-rc6 والإصدارات المستقرة الخلفية):
| الالتزام | الشجرة |
|---|---|
40b3f4700e55 | مستقر |
إصدارات النواة التي تم إصلاحها: 7.0-rc6، 6.18.21، 6.19.11
| التاريخ | الحدث |
|---|---|
| 2026-01-13 | تم حجز معرف CVE |
| 2026-04-02 | تم نشر CVE، دمج التزامات الإصلاح |
Antonius (@w1sdom)
Blue Dragon Security — تانجيرانج، إندونيسيا
GitHub: bluedragonsecurity
تم إصدار نموذج PoC هذا للأغراض التعليمية والبحثية.
| مستقر |
2697dd8ae721 | مستقر |