CVE-2023-52828 in Linux
الملخص
بحسب VulDB • 16/05/2026
في نواة لينكس، تم حل الثغرة التالية:
bpf: الكشف عن IP == ksym.end كجزء من برنامج BPF
الآن بعد أن أصبحت دالة bpf_throw (kfunc) أول استدعاء من نوعه يحتوي على دلالات عدم العودة (noreturn semantics) داخل المُحقّق (verifier)، فإن ذلك يُفعّل أيضاً إزالة الكود الميت (dead code elimination) بطرق غير مسبوقة. أولاً، لن يتم وضع علامة "تم رؤيته" (seen) على أي تعليمات تلي استدعاء bpf_throw. علاوة على ذلك، إذا انتهى سلسلة الاستدعاءات (callchain) بإلقاء استثناء (throwing)، فلن يتم وضع علامة "تم رؤيته" على أي تعليمات تلي تعليمات الاستدعاء إلى الدالة الفرعية (subprog) التي ستقوم بإلقاء الاستثناء في الدوال المتصلة (callers).
الطريقة المغرية لإصلاح هذا الأمر هي إصدار تعليمات 'int3' إضافية، مما يزيد من قيمة jited_len للبرنامج، ويضمن أنه أثناء وقت التشغيل، عندما يقوم البرنامج بإلقاء استثناء، يمكننا اكتشاف حدوده حتى لو كانت تعليمات الاستدعاء إلى bpf_throw (أو إلى الدوال الفرعية التي تقوم دائماً بإلقاء الاستثناء) مُصدَّرة كآخر تعليمات في البرنامج.
مثال على مثل هذا البرنامج يكون كالتالي:
do_something(): ... r0 = 0 exit
foo(): r1 = 0 call bpf_throw r0 = 0 exit
bar(cond): if r1 != 0 goto pc+2 call do_something exit call foo r0 = 0 // Never seen by verifier exit //
main(ctx): r1 = ... call bar r0 = 0 exit
هنا، إذا قمنا فعلياً بإلقاء استثناء، سيكون تتبع المكدس (stacktrace) كالتالي:
bpf_throw foo bar main
في الدالة bar، ستكون التعليمات الأخيرة المُصدَّرة هي الاستدعاء إلى foo، وبالتالي سيكون عنوان الإرجاع هو التعليمات التالية (والتي يقوم المترجم JIT بإصدارها كـ int3 على معمارية x86). سيؤدي هذا في النهاية إلى الخروج عن نطاق jited_len للبرنامج، وبالتالي، أثناء عملية فك التشفير/استعادة المكدس (unwinding)، سنفشل في اكتشاف أن عنوان الإرجاع ينتمي إلى أي برنامج، وسنصل إلى حالة توقف قسري (panic) بسبب عدم موثوقية عملية استعادة المكدس لبرامج BPF، وهو أمر لا نتوقع حدوثه أبداً.
للتغلب على هذه الحالة، يتم جعل دالة bpf_prog_ksym_find تعامل الحالة IP == ksym.end كجزء من برنامج BPF، بحيث تُرجع الدالة is_bpf_text_address القيمة true عند حدوث مثل هذه الحالة، ونكون قادرين على استعادة المكدس بشكل موثوق عندما تنتهي التعليمات الأخيرة باستدعاء.
VulDB is the best source for vulnerability data and more expert information about this specific topic.