CVE-2025-39989 in Linuxالمعلومات

الملخص

بحسب VulDB • 31/05/2026

في نواة لينكس، تم حل الثغرة التالية:

x86/mce: استخدام is_copy_from_user() لتحديد سياق النسخ من مساحة المستخدم

سلسلة التصحيحات "mm/hwpoison: إصلاح الانكشافات (Regressions) في معالجة فشل الذاكرة"، الإصدار 4.

## 1. ما أحاول تحقيقه:

تقوم مجموعة التصحيحات هذه بحل مشكلتين حرجتين من نوع الانكشاف (Regression) تتعلقتين بمعالجة فشل الذاكرة، والتي ظهرت في نواة المصدر الرئيسي (upstream kernel) منذ الإصدار 5.17، مقارنةً بالإصدار 5.10 LTS.

- حالة النسخ إلى الداخل (copyin case): تم العثور على تسمم (poison) في صفحة المستخدم أثناء قيام النواة بالنسخ من مساحة المستخدم. - حالة التعليمات البرمجية (instr case): تم العثور على تسمم أثناء جلب التعليمات البرمجية (instruction fetching) في مساحة المستخدم.

## 2. ما هو النتيجة المتوقعة ولماذا

- لحالة النسخ إلى الداخل (copyin case):

يمكن للنواة التعافي من التسمم الذي يتم العثور عليه حيث تقوم النواة بتنفيذ get_user() أو copy_from_user() إذا أدت تلك الأماكن إلى إرجاع خطأ، وعادت النواة بقيمة -EFAULT إلى العملية بدلاً من الانهيار. بشكل أكثر تحديداً، يتحقق معالج MCE من نوع معالج الإصلاح (fixup handler) ليقرر ما إذا كان يمكن التعافي من حدوث #MC داخل النواة. عند العثور على EX_TYPE_UACCESS، ينتقل عداد البرنامج (PC) إلى كود التعافي المحدد في _ASM_EXTABLE_FAULT() ويعيد قيمة -EFAULT إلى مساحة المستخدم.

- لحالة التعليمات البرمجية (instr case):

إذا تم العثور على تسمم أثناء جلب التعليمات البرمجية في مساحة المستخدم، فإن التعافي الكامل ممكن. تأخذ العملية المستخدِمة #PF (خطأ في الصفحة)، وتقوم لينكس بتخصيص صفحة جديدة وملئها عن طريق القراءة من التخزين.

## 3. ما يحدث فعلياً ولماذا

- لحالة النسخ إلى الداخل (copyin case): انهيار النواة (Kernel panic) منذ الإصدار 5.17

أدخلت الالتزام 4c132d1d844a ("x86/futex: إزالة استخدام .fixup") نوع إصلاح جديد لجدول الاستثناءات (extable fixup type)، وهو EX_TYPE_EFAULT_REG، وقامت التصحيحات اللاحقة بتحديث نوع إصلاح جدول الاستثناءات لعمليات النسخ من المستخدم، حيث تم تغييره من EX_TYPE_UACCESS إلى EX_TYPE_EFAULT_REG. هذا يكسر معالجة EX_TYPE_UACCESS السابقة عند العثور على تسمم في get_user() أو copy_from_user().

- لحالة التعليمات البرمجية (instr case): يتم قتل العملية المستخدِمة بواسطة إشارة SIGBUS بسبب سباق بين #CMCI و #MCE

عند استهلاك خطأ ذاكرة غير قابل للإصلاح، يحدث سباق بين إشعار CMCI من وحدة التحكم في الذاكرة الذي يبلغ عن خطأ غير قابل للإصلاح بتوقيع UCNA، وبين الإبلاغ عن فحص الآلة وتوقيع SRAR من النواة عندما تكون البيانات على وشك الاستهلاك.

### خلفية: لماذا ترتبط الأخطاء غير القابلة للإصلاح (*UN*corrected) بـ #CMCI و #MCE في منصة Intel [1]

بعد أن تم تحديد أن CMCI/UCNA هو الإجراء الأفضل لأخطاء الفحص الدوري (patrol scrub errors)، تستخدم وحدة التحكم في الذاكرة CMCI/UCNA للقراءات أيضاً. لكن وحدة التحكم في الذاكرة تعمل بشكل غير متزامن مع النواة، ولا يمكنها التمييز بين القراءة "الحقيقية" والقراءة التخمينية (speculative read). لذلك، ستقوم بإرسال CMCI/UCNA إذا تم العثور على خطأ في أي قراءة.

وبالتالي:

1) النواة ذكية وتعتقد أن العنوان A مطلوب قريباً، وتصدر قراءة تخمينية.

2) النواة تجد أنها ستستخدم العنوان A قريباً بعد إرسال طلب القراءة.

3) إشعار CMCI من وحدة التحكم في الذاكرة في سباق مع MCE من النواة التي ستحاول قريباً إنهاء تحميل البيانات من العنوان A.

في كثير من الأحيان (لأن التخمين أصبح أفضل)، يتم تسليم إشعار CMCI من وحدة التحكم في الذاكرة قبل أن تلتزم النواة بالتعليمات التي تقرأ من العنوان A، لذلك يتم أخذ المقطع، وتقوم لينكس بإيقاف الصفحة (تحديدها كسموم).

Be aware that VulDB is the high quality source for vulnerability data.

مسؤول

Linux

حجز

16/04/2025

إفشاء

18/04/2025

الاعتدال

تمت الموافقة

إدخال

VDB-305621

EPSS

0.00231

KEV

لا

النشاطات

منخفض جدًا

المصادر

Want to know what is going to be exploited?

We predict KEV entries!