این صفحه مشکلات مهم و رفع اشکالهای موجود در android-mainline را شرح میدهد که ممکن است برای شرکا مهم باشد.
15 نوامبر 2024
Clang برای
android-mainlineوandroid16-6.12به 19.0.1 به روز شده است.- خلاصه: نسخه جدید 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برای رفتار با اعداد صحیح امضا شده به عنوان اعداد صحیح بدون علامت مکمل دو با رفتار سرریز تعریف شده طراحی شده است.- در حالی که پاکسازی سرریز اعداد صحیح امضا شده در هسته لینوکس می تواند به شناسایی اشکالات کمک کند، مواردی وجود دارد که سرریز عمدی است، به عنوان مثال، با
atomic_long_t. در نتیجه،CONFIG_UBSAN_SIGNED_WRAPغیرفعال شده است تا به UBSAN اجازه دهد صرفاً به عنوان یک ضدعفونی کننده محدوده عمل کند.
- در حالی که پاکسازی سرریز اعداد صحیح امضا شده در هسته لینوکس می تواند به شناسایی اشکالات کمک کند، مواردی وجود دارد که سرریز عمدی است، به عنوان مثال، با
درباره
CONFIG_UBSAN_TRAP: UBSAN به گونهای پیکربندی شده است که وقتی مشکلی را برای محافظت از یکپارچگی هسته تشخیص میدهد، باعث ایجاد وحشت در هسته شود. با این حال، ما این رفتار را از 23 اکتبر تا 12 نوامبر غیرفعال کردیم. ما این کار را برای رفع انسداد بهروزرسانی کامپایلر انجام دادیم در حالی که مشکلات شناخته شده__counted_byبرطرف کردیم.
- خلاصه: نسخه جدید Clang یک ضدعفونی کننده مرزی برای آرایه ها معرفی می کند، که در آن اندازه آرایه در یک متغیر جداگانه که با استفاده از ویژگی
1 نوامبر 2024
- لینوکس 6.12-rc4 فرود
- خلاصه:
CONFIG_OF_DYNAMICبه طور بالقوه باعث ایجاد رگرسیون شدید برای درایورهای معیوب می شود. - جزئیات: در حین ادغام Linux
6.12-rc1درandroid-mainline، متوجه مشکلاتی در بارگیری درایورهای خارج از درخت شدیم. تغییری که باگهای درایور را آشکار کرد بهعنوان commit274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data")شناسایی شد و ما بهطور موقت آن را در aosp/3287735 برگردانیم. این تغییرCONFIG_OF_OVERLAYرا انتخاب می کند کهCONFIG_OF_DYNAMICانتخاب می کند. با!OF_DYNAMIC، ref-counting رویof_node_get()وof_node_put()به طور موثر غیرفعال می شود زیرا آنها به صورتnoopsپیاده سازی می شوند. فعال کردن مجددOF_DYNAMICمشکلاتی را در درایورهایی که به اشتباه ref-counting را برایstruct device_nodeپیاده سازی می کنند، آشکار می کند. این باعث انواع مختلفی از خطاها مانند خرابی حافظه، استفاده پس از آزاد شدن و نشت حافظه می شود. - همه کاربردهای APIهای مربوط به تجزیه باید بازرسی شوند. لیست زیر جزئی است، اما شامل مواردی است که ما مشاهده کرده ایم:
- استفاده بعد از رایگان (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::name -
of_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):
- تغییری که قبلاً ذکر شد، هنگام فرود لینوکس
6.12-rc4(به aosp/3315251 مراجعه کنید) بازیابی شد وCONFIG_OF_DYNAMICدوباره فعال کرد و احتمالاً درایورهای معیوب را فاش کرد.
- خلاصه: