ترجمة آلية لم تُراجَع بعد. النص الإنجليزي هو المرجع في حال الاختلاف.
الملخص
في نواة Linux، تم حل الثغرة التالية: keys: حماية اسم النوع أثناء وصف مفتاح. يجب أن تبقي الدالة keyctl_describe_key() اسم نوع المفتاح حيًا حتى تستهلكه kasprintf(). مرجع المفتاح المحتفظ به يبقي المفتاح ووصفه حيّين، لكنه لا يثبت الوحدة النمطية (module) التي توفر نوعه. يتم تمرير الاسم إلى kasprintf() دون الاحتفاظ بـ key->sem. تستخدم kvasprintf() مؤشر الاسم المحفوظ في تمريرتي تنسيق، مع تخصيص ذاكرة GFP_KERNEL بينهما. مع AF_RXRPC=m، يمكن لمهمة تمرر إذن العرض (View permission) قبل تقاعد النوع أن تتداخل مع عملية تفريغ وحدة نمطية مميزة بهذا الترتيب: 1. تبحث KEYCTL_DESCRIBE عن المفتاح، وتحفظ key->type->name في وسائط kasprintf() وتكمل تمريرة التنسيق الأولى. 2. بينما يتأخر المنسق قبل تمريرته الثانية، تستدعي af_rxrpc_exit() الدالة unregister_key_type()، التي تزيل النوع من السجل وتنتظر key_gc_keytype(). 3. يأخذ الجامع key->sem للكتابة، ويعيد كتابة المفتاح المحتفظ به إلى key_type_dead ويكمل التقاعد. تعود عملية إلغاء التسجيل وخروج الوحدة النمطية، مما يسمح لـ free_module() بتحرير النوع والاسم. 4. يستأنف المنسق تمريرته الثانية ويقرأ الاسم المحفوظ من تخزين الوحدة النمطية المحررة، مما قد يتسبب في حدوث خطأ في string(). احتفظ بـ key->sem للقراءة عبر kasprintf(). وبالتالي لا يمكن للجامع إعادة كتابة المفتاح أو إكمال التقاعد حتى تنتهي تمريرتا التنسيق. إذا فاز التقاعد بالقفل أولاً، يستخدم التنسيق اسم key_type_dead الأساسي بدلاً من ذلك. حرر الإشارة فورًا بعد kasprintf()، بما في ذلك عند فشل التخصيص، قبل النسخ إلى مساحة المستخدم. تقرير الخطأ (Oops) كما يلي: BUG: unable to handle page fault for address: fffffbfff8054794 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page RIP: 0010:string+0x23f/0x470 Call Trace: vsnprintf+0x330/0x1110
المعالجة
المراجع
- مرجعhttps://git.kernel.org/stable/c/19c4de819e52b7f606468fbfe4fcef4e812e2777
- مرجعhttps://git.kernel.org/stable/c/a49e6c9a1a5b3457c946a8efb616ce13b4ca8194
- مرجعhttps://git.kernel.org/stable/c/916667df7695366f23cfaf365b5840b228cc4b2e
- مرجعhttps://git.kernel.org/stable/c/dddd3a1ab7d12ee163477918ff6eb943361db4fe
- مرجعhttps://git.kernel.org/stable/c/3c3cfd9e262afc9558c38f8cec57f09d10988546
- مرجعhttps://git.kernel.org/stable/c/6b613747f7ea309ada5b8d05b55398c338f7a968
- مرجعhttps://git.kernel.org/stable/c/dea367df18e3a4faac393e3a4e818ee03af89b19
- مرجعhttps://git.kernel.org/stable/c/0461bc8f91116aae4a020e15f4e1c1fd535ab35e
- مرجعhttps://git.kernel.org/stable/c/fced7238b7e80cf8aa688d5af976e4aa6e33c329