Trang này mô tả các vấn đề quan trọng và bản sửa lỗi được tìm thấy trên android-mainline có thể quan trọng đối với các đối tác.
Ngày 15 tháng 11 năm 2024
Clang được cập nhật lên phiên bản 19.0.1 cho
android-mainlinevàandroid16-6.12- Tóm tắt: Phiên bản mới của Clang giới thiệu một trình dọn dẹp ranh giới cho các mảng, trong đó kích thước của mảng được lưu trữ trong một biến riêng biệt được liên kết với mảng bằng cách sử dụng thuộc tính
__counted_by. Tính năng này có thể gây ra lỗi kernel panic nếu kích thước mảng không được cập nhật đúng cách. Thông báo lỗi có dạng như sau:
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 *[]')Thông tin chi tiết: Trình dọn dẹp ranh giới là yếu tố cần thiết để bảo vệ tính toàn vẹn của nhân bằng cách phát hiện quyền truy cập ngoài ranh giới. Khi
CONFIG_UBSAN_TRAPđược bật, trình dọn dẹp ranh giới sẽ kích hoạt lỗi kernel panic khi phát hiện thấy bất kỳ lỗi nào.- Phiên bản trước của trình dọn dẹp ranh giới chỉ kiểm tra các mảng có kích thước cố định và không thể kiểm tra các mảng được phân bổ động. Phiên bản mới sử dụng thuộc tính
__counted_byđể xác định ranh giới mảng trong thời gian chạy và phát hiện thêm các trường hợp truy cập ngoài giới hạn. Tuy nhiên, trong một số trường hợp, mảng được truy cập trước khi biến kích thước được đặt, kích hoạt trình dọn dẹp ranh giới và gây ra lỗi kernel panic. Để giải quyết vấn đề này, hãy đặt kích thước của mảng ngay sau khi phân bổ bộ nhớ cơ bản, như minh hoạ trong aosp/3343204.
- Phiên bản trước của trình dọn dẹp ranh giới chỉ kiểm tra các mảng có kích thước cố định và không thể kiểm tra các mảng được phân bổ động. Phiên bản mới sử dụng thuộc tính
Giới thiệu về
CONFIG_UBSAN_SIGNED_WRAP: Phiên bản mới của Clang sẽ dọn dẹp tình trạng tràn và thiếu số nguyên có dấu mặc dù có cờ trình biên dịch-fwrapv. Cờ-fwrapvđược thiết kế để coi số nguyên có dấu là số nguyên không dấu có phần bù của hai với hành vi tràn được xác định.- Mặc dù việc dọn dẹp tình trạng tràn số nguyên có dấu trong nhân Linux có thể giúp xác định lỗi, nhưng vẫn có những trường hợp tràn là có chủ ý, chẳng hạn như với
atomic_long_t. Do đó,CONFIG_UBSAN_SIGNED_WRAPđã bị vô hiệu hoá để cho phép UBSAN chỉ hoạt động như một trình dọn dẹp ranh giới.
- Mặc dù việc dọn dẹp tình trạng tràn số nguyên có dấu trong nhân Linux có thể giúp xác định lỗi, nhưng vẫn có những trường hợp tràn là có chủ ý, chẳng hạn như với
Giới thiệu về
CONFIG_UBSAN_TRAP: UBSAN được định cấu hình để kích hoạt lỗi kernel panic khi phát hiện thấy vấn đề nhằm bảo vệ tính toàn vẹn của kernel. Tuy nhiên, chúng tôi đã tắt hành vi này từ ngày 23 tháng 10 đến ngày 12 tháng 11. Chúng tôi đã làm như vậy để bỏ chặn bản cập nhật trình biên dịch trong khi khắc phục các vấn đề đã biết về__counted_by.
- Tóm tắt: Phiên bản mới của Clang giới thiệu một trình dọn dẹp ranh giới cho các mảng, trong đó kích thước của mảng được lưu trữ trong một biến riêng biệt được liên kết với mảng bằng cách sử dụng thuộc tính
Ngày 1 tháng 11 năm 2024
- Linux 6.12-rc4 landing
- Tóm tắt:
CONFIG_OF_DYNAMICcó khả năng gây ra các lỗi nghiêm trọng cho trình điều khiển bị lỗi. - Thông tin chi tiết: Trong khi hợp nhất Linux
6.12-rc1vàoandroid-mainline, chúng tôi nhận thấy các vấn đề với trình điều khiển ngoài cây không tải được. Thay đổi làm lộ ra các lỗi trình điều khiển được xác định là cam kết274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data")và chúng tôi đã tạm thời hoàn nguyên thay đổi này trong aosp/3287735. Thay đổi này sẽ chọnCONFIG_OF_OVERLAY, tức là chọnCONFIG_OF_DYNAMIC. Với!OF_DYNAMIC, việc đếm số lượt tham chiếu trênof_node_get()vàof_node_put()sẽ bị vô hiệu hoá một cách hiệu quả vì chúng được triển khai dưới dạngnoops. Việc bật lạiOF_DYNAMICsẽ làm lộ ra các vấn đề trong trình điều khiển triển khai sai cơ chế đếm tham chiếu chostruct device_node. Điều này gây ra nhiều loại lỗi như hỏng bộ nhớ, use-after-free và rò rỉ bộ nhớ. - Bạn phải kiểm tra tất cả các cách sử dụng API phân tích cú pháp OF có liên quan. Danh sách sau đây chưa đầy đủ nhưng có chứa những trường hợp mà chúng tôi đã quan sát được:
- Sử dụng sau khi giải phóng (UAF):
- Sử dụng lại cùng một đối số
device_node: Các hàm đó gọiof_node_put()trên nút đã cho, có thể cần thêmof_node_get()trước khi gọi (ví dụ: khi gọi nhiều lần với cùng một nút làm đối số):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()
- Sử dụng
device_nodesau khi thoát khỏi một số vòng lặp:for_each_available_child_of_node_scoped()for_each_available_child_of_node()for_each_child_of_node_scoped()for_each_child_of_node()
- Giữ các con trỏ trực tiếp đến các thuộc tính
char *từdevice_node, ví dụ: sử dụng:const char *foo = struct device_node::nameof_property_read_string()of_property_read_string_array()of_property_read_string_index()of_get_property()
- Sử dụng lại cùng một đối số
- Rò rỉ bộ nhớ:
- Nhận
device_nodevà quên huỷ tham chiếu (of_node_put()). Các nút được trả về từ những nút này cần được giải phóng tại một thời điểm nào đó: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()
- Nhận
- Giữ lại một
device_nodetừ một lần lặp vòng lặp. Nếu đang trả về hoặc thoát khỏi nội dung sau, bạn cần loại bỏ phần tham chiếu còn lại tại một thời điểm nào đó:for_each_available_child_of_node()for_each_child_of_node()for_each_node_by_type()for_each_compatible_node()of_for_each_phandle()
- Sử dụng sau khi giải phóng (UAF):
- Thay đổi đã đề cập trước đó được khôi phục trong khi hạ cánh Linux
6.12-rc4(xem aosp/3315251) cho phépCONFIG_OF_DYNAMICmột lần nữa và có khả năng làm lộ các trình điều khiển bị lỗi.
- Tóm tắt: