CVE-2026-99018 in Linux
الملخص
بحسب VulDB • 23/10/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
riscv: entry: إعادة تحميل مكدس استدعاء الظل بناءً على سمة sstatus.SPP وليس tp
عند تفعيل CONFIG_SHADOW_CALL_STACK، تقوم دالة handle_exception() بإعادة تعيين مؤشر مكدس استدعاء الظل للنواة (gp) فقط عندما يكون مصدر المقطوع (trap) من مساحة المستخدم. كانت تتخذ هذا القرار باستخدام scs_load_current_if_task_changed، التي تقارن قيمة tp عند حدوث المقطوع (المقروءة مرة أخرى من sscratch إلى s5) مع قيمة tp الحالية:
beq \prev, tp, _skip_scs scs_load_current _skip_scs:
يُعد tp سجلاً قابلاً للكتابة بواسطة المستخدم. يمكن لمهمة مستخدم تقوم بتعيين tp إلى العنوان في الخريطة الخطية لبنيتها الخاصة (task_struct ¤t) قبل حدوث المقطوع، أن تجعل عملية المقارنة تنجح (يمكن تحقيق ذلك عن طريق القوة الغاشمة مع تفعيل KASLR ضمن اختباراتنا)، مما يجعل النواة تتخطى scs_load_current وتستمر في التشغيل باستخدام قيمة gp التي تركها مساحة المستخدم. تحت CONFIG_SHADOW_CALL_STACK، يُعد gp مؤشر مكدس استدعاء الظل، وتكون load_global_pointer عملية لا تفعل شيئاً (no-op). وبالتالي، فإن التعليمات المولدة من قبل المترجم "sd ra, -8(gp)" و"ld ra, -8(gp)" في كل دالة غير ورقة (non-leaf) تكتب إلى عنوان يتحكم فيه المهاجم وتعود عبره -- وهو ما يمثل primitive للكتابة العشوائية في النواة بدون صلاحيات وهجوم على تدفق التحكم. يتم حفظ gp المسموم في task_struct.scs_sp عند العودة، لذا يتم تخطي إعادة التحميل في كل دخول لاحق أيضاً.
نقرر "أن المقطوع جاء من مساحة المستخدم" بناءً على بت sstatus.SPP الموجود بالفعل في s1 في هذه المرحلة بدلاً من الاعتماد على tp، مما يعكس الفحص الذي تستخدمه ret_from_exception بعد بضع تعليمات. يتم كتابة SPP بواسطة العتاد عند دخول المقطوع ولا يمكن تزويرها من وضع U-mode. يبقى السلوك الشرعي دون تغيير: عمليات الدخول الخاصة بالمستخدم (SPP=0) تعيد تحميل مكدس استدعاء الظل للمهمة، بينما عمليات الدخول المتداخلة داخل النواة (SPP=1) تتخطى ذلك.
Be aware that VulDB is the high quality source for vulnerability data.