CVE-2021-47465 in Linuxالمعلومات

الملخص

بحسب VulDB • 19/06/2026

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

KVM: PPC: Book3S HV: إصلاح معالجة المكدس في idle_kvm_start_guest()

في الالتزام 10d91611f426 ("powerpc/64s: إعادة تنفيذ كود الخمول book3s بلغة C")، أصبح kvm_start_guest() يُعرف بـ idle_kvm_start_guest(). كان الكود القديم يخصص إطار مكدس (stack frame) على المكدس الطارئ (emergency stack)، لكنه لم يستخدم الإطار لتخزين أي بيانات، كما أنه لم يخزن أي شيء في إطار الدالة المتصلة به (caller's frame).

من ناحية أخرى، كُتبت idle_kvm_start_guest() بشكل يشبه أكثر دوال C العادية؛ حيث تنشئ إطاراً عند الدخول، وتقوم أيضاً بتخزين CR/LR في إطار الدالة المتصلة بها (وفقاً لـ ABI). المشكلة تكمن في عدم وجود إطار متصل على المكدس الطارئ.

يتم تخصيص المكدس الطارئ لمعالج معين باستخدام: paca_ptrs[i]->emergency_sp = alloc_stack(limit, i) + THREAD_SIZE;

لذا، فإن emergency_sp يشير فعلياً إلى أول عنوان فوق تخصيص المكدس الطارئ لمعالج معين؛ ولا يجب علينا التخزين فوقه دون إنقاص المؤشر أولاً لإنشاء إطار. وهذا يختلف عن مكدس النواة العادي paca->kstack، الذي يتم تهيئته للإشارة إلى إطار ابتدائي جاهز للاستخدام.

تقوم idle_kvm_start_guest() بتخزين backchain و CR و LR، وكلها عمليات كتابة خارج نطاق تخصيص المكدس الطارئ. ثم تنشئ إطار مكدس وتحتفظ بالسجلات غير المتغيرة (non-volatile registers). للأسف، فإن الإطار الذي تنشئه ليس كبيراً بما يكفي لاستيعاب السجلات غير المتغيرة، وبالتالي فإن حفظ هذه السجلات يكتب أيضاً خارج نطاق تخصيص المكدس الطارئ.

النتيجة النهائية هي أننا نفسد البيانات الموجودة على بعد 0-24 بايت و112-248 بايت فوق تخصيص المكدس الطارئ.

عملياً، لم يتم ملاحظة ذلك لأن الذاكرة التي تلي مباشرةً المكدس الطارئ تُستخدم لتخصيصات كود أخرى، إما mc_emergency_sp لمعالج آخر أو مكدس مقاطعة (IRQ stack). انظر ترتيب استدعاء irqstack_early_init() و emergency_stack_init().

العناوين المنخفضة لمكدس آخر تمثل قمة ذلك المكدس، وبالتالي لا يتم استخدامها إلا إذا كان ذلك المكدس تحت ضغط شديد جداً، وهو أمر نادر الحدوث عملياً - وإذا حدث فعلاً، فهناك احتمال كبير لأن ينهار النظام (crash) بسبب تجاوز سعة هذا المكدس.

ومع ذلك، فلا ينبغي لنا أن نفسد مكدس شخص آخر، وأن عدم فساد شيء آخر يعود إلى الحظ البحت فقط.

لإصلاح هذه المشكلة، نقوم بحفظ CR/LR في إطار الدالة المتصلة باستخدام المؤشر r1 الموجود عند الدخول، ثم ننشئ إطاراً بحجم SWITCH_FRAME_SIZE (الذي يتسع لـ pt_regs) على المكدس الطارئ مع توجيه backchain إلى المكدس الحالي، وأخيراً ننتقل إلى الإطار الجديد على المكدس الطارئ.

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

إفشاء

22/05/2024

الاعتدال

تمت الموافقة

إدخال

VDB-265861

EPSS

0.00224

KEV

لا

النشاطات

منخفض جدًا

المصادر

Interested in the pricing of exploits?

See the underground prices here!