توضّح هذه الصفحة المشاكل المهمة وإصلاحات الأخطاء التي تم العثور عليها في android-mainline
والتي قد تكون مهمة للشركاء.
15 نوفمبر 2024
تم تعديل Clang إلى الإصدار 19.0.1 لكل من
android-mainlineوandroid16-6.12- الملخّص: يقدّم الإصدار الجديد من Clang أداة تنظيف للحدود خاصة بالمصفوفات،
حيث يتم تخزين حجم المصفوفة في متغيّر منفصل مرتبط بالمصفوفة
باستخدام السمة
__counted_by. قد تتسبّب هذه الميزة في حدوث ذعر النواة إذا لم يتم تعديل حجم المصفوفة بشكل صحيح. تبدو رسالة الخطأ كما يلي:
UBSAN: array-index-out-of-bounds in common/net/wireless/nl80211.c index 0 is out of range for type 'struct ieee80211_channel *[] __counted_by(n_channels)' (aka 'struct ieee80211_channel *[]')التفاصيل: أداة تنظيف الحدود ضرورية لحماية سلامة النواة من خلال رصد عمليات الوصول خارج الحدود. وعند تفعيل
CONFIG_UBSAN_TRAP، يؤدي برنامج تنظيف الذاكرة إلى ذعر النواة عند العثور على أي مشكلة.- كانت النسخة السابقة من أداة تنظيف الحدود تتحقّق فقط من المصفوفات ذات الحجم الثابت، ولم يكن بإمكانها التحقّق من المصفوفات التي يتم تخصيصها بشكل ديناميكي. يستخدم الإصدار الجديد السمة
__counted_byلتحديد حدود المصفوفة في وقت التشغيل ورصد المزيد من حالات الوصول إلى خارج الحدود. ومع ذلك، في بعض الحالات، يتم الوصول إلى المصفوفة قبل ضبط متغيّر الحجم، ما يؤدي إلى تشغيل أداة تنظيف الحدود والتسبّب في حدوث ذعر النواة. لحلّ هذه المشكلة، اضبط حجم المصفوفة مباشرةً بعد تخصيص الذاكرة الأساسية، كما هو موضّح في aosp/3343204.
- كانت النسخة السابقة من أداة تنظيف الحدود تتحقّق فقط من المصفوفات ذات الحجم الثابت، ولم يكن بإمكانها التحقّق من المصفوفات التي يتم تخصيصها بشكل ديناميكي. يستخدم الإصدار الجديد السمة
حول
CONFIG_UBSAN_SIGNED_WRAP: يطهّر الإصدار الجديد من Clang الأعداد الصحيحة الموقّعة التي تتجاوز الحد الأقصى أو الأدنى على الرغم من علامة برنامج التجميع-fwrapv. تم تصميم العلامة-fwrapvللتعامل مع الأعداد الصحيحة الموقّعة على أنّها أعداد صحيحة غير موقّعة بقيمتي المتمم مع تحديد سلوك تجاوز السعة.- على الرغم من أنّ تنظيف تجاوز سعة الأعداد الصحيحة الموقّعة في نواة Linux يمكن أن يساعد في تحديد الأخطاء، هناك حالات يكون فيها تجاوز السعة مقصودًا، مثل
atomic_long_t. نتيجةً لذلك، تمCONFIG_UBSAN_SIGNED_WRAPإيقاف ميزة "التحقّق من الحدود" في UBSAN لتعمل فقط كأداة لتنظيف الحدود.
- على الرغم من أنّ تنظيف تجاوز سعة الأعداد الصحيحة الموقّعة في نواة Linux يمكن أن يساعد في تحديد الأخطاء، هناك حالات يكون فيها تجاوز السعة مقصودًا، مثل
لمحة عن
CONFIG_UBSAN_TRAP: تم ضبط UBSAN لتشغيل ذعر النواة عند رصد مشكلة لحماية سلامة النواة. ومع ذلك، أوقفنا هذه العملية من 23 أكتوبر إلى 12 نوفمبر. وقد اتّخذنا هذا الإجراء لإتاحة تحديث برنامج الترجمة أثناء حلّ المشاكل المعروفة في__counted_by.
- الملخّص: يقدّم الإصدار الجديد من Clang أداة تنظيف للحدود خاصة بالمصفوفات،
حيث يتم تخزين حجم المصفوفة في متغيّر منفصل مرتبط بالمصفوفة
باستخدام السمة
1 نوفمبر 2024
- إصدار Linux 6.12-rc4
- ملخّص:
CONFIG_OF_DYNAMICما قد يؤدي إلى حدوث مشاكل خطيرة في برامج التشغيل المعطّلة. - التفاصيل: أثناء دمج Linux
6.12-rc1فيandroid-mainline، لاحظنا مشاكل في تعذُّر تحميل برامج التشغيل خارج الشجرة. تم تحديد التغيير الذي أدى إلى ظهور أخطاء برامج التشغيل على أنّه عملية الإيداع274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data")، وقد تراجعنا عنه مؤقتًا في aosp/3287735. يؤدي التغيير إلى تحديدCONFIG_OF_OVERLAY، ما يؤدي إلى تحديدCONFIG_OF_DYNAMIC. باستخدام!OF_DYNAMIC، يتم إيقاف ميزة احتساب المراجع فيof_node_get()وof_node_put()بشكل فعّال لأنّها يتم تنفيذها على أنّهاnoops. سيؤدي تفعيلOF_DYNAMICمرة أخرى إلى الكشف عن مشاكل في برامج التشغيل التي تنفّذ بشكل خاطئ عملية احتساب المراجع الخاصة بـstruct device_node. ويؤدي ذلك إلى حدوث أنواع مختلفة من الأخطاء، مثل تلف الذاكرة واستخدام ذاكرة معيّنة بعد تفريغها وتسريب الذاكرة. - يجب فحص جميع استخدامات واجهات برمجة التطبيقات ذات الصلة بتحليل OF. القائمة التالية جزئية، ولكنها تتضمّن حالات لاحظناها:
- استخدام بعد التثبيت (UAF):
- إعادة استخدام وسيطة
device_nodeنفسها: تستدعي هذه الدوالof_node_put()على العقدة المحدّدة، وقد تحتاج إلى إضافةof_node_get()قبل استدعائها (على سبيل المثال، عند استدعائها بشكل متكرّر مع العقدة نفسها كوسيطة):of_find_compatible_node()of_find_node_by_name()of_find_node_by_path()of_find_node_by_type()of_get_next_cpu_node()of_get_next_parent()of_get_next_child()of_get_next_available_child()of_get_next_reserved_child()of_find_node_with_property()of_find_matching_node_and_match()
- استخدام
device_nodeبعد أي نوع من الخروج من حلقات معيّنة:for_each_available_child_of_node_scoped()for_each_available_child_of_node()for_each_child_of_node_scoped()for_each_child_of_node()
- الاحتفاظ بمؤشرات مباشرة إلى سمات
char *منdevice_nodeفي أي مكان، مثلاً باستخدام:const char *foo = struct device_node::nameof_property_read_string()of_property_read_string_array()of_property_read_string_index()of_get_property()
- إعادة استخدام وسيطة
- تسرّبات الذاكرة:
- الحصول على
device_nodeوعدم إلغاء مرجعه (of_node_put()) يجب تحرير العُقد التي يتم عرضها من هذه العُقد في مرحلة ما:of_find_compatible_node()of_find_node_by_name()of_find_node_by_path()of_find_node_by_type()of_find_node_by_phandle()of_parse_phandle()of_find_node_opts_by_path()of_get_next_cpu_node()of_get_compatible_child()of_get_child_by_name()of_get_parent()of_get_next_parent()of_get_next_child()of_get_next_available_child()of_get_next_reserved_child()of_find_node_with_property()of_find_matching_node_and_match()
- الحصول على
- الاحتفاظ بقيمة
device_nodeمن تكرار حلقي إذا كنت ستعود أو ستتوقف عن استخدام أي من العناصر التالية، عليك إزالة المرجع المتبقي في مرحلة ما:for_each_available_child_of_node()for_each_child_of_node()for_each_node_by_type()for_each_compatible_node()of_for_each_phandle()
- استخدام بعد التثبيت (UAF):
- تمت استعادة التغيير المذكور سابقًا أثناء إطلاق Linux
6.12-rc4(راجِع aosp/3315251) ما أدّى إلى تفعيلCONFIG_OF_DYNAMICمرة أخرى، ما قد يؤدي إلى ظهور برامج تشغيل معطّلة.
- ملخّص: