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-mainline
và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 giới hạn 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 sự cố 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 giới hạn là yếu tố cần thiết để bảo vệ tính toàn vẹn của hạt nhân bằng cách phát hiện quyền truy cập ngoài giới hạn. Và khi bật
CONFIG_UBSAN_TRAP
, trình dọn dẹp giới hạn sẽ kích hoạt sự cố kernel panic (sự cố kernel panic) trên mọi phát hiện.- Phiên bản trước của trình dọn dẹp giới hạn 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ổ linh động. Phiên bản mới sử dụng thuộc tính
__counted_by
để xác định giới hạn mảng trong thời gian chạy và phát hiện nhiều trường hợp truy cập ngoài giới hạn hơn. Tuy nhiên, trong một số trường hợp, mảng được truy cập trước khi đặt biến kích thước, kích hoạt trình dọn dẹp giới hạn và gây ra sự cố 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 giới hạn 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ổ linh độ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 đã ký 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 bổ sung 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 đã ký trong nhân Linux có thể giúp xác định lỗi, nhưng có những trường hợp tràn là cố ý, chẳng hạn như với
atomic_long_t
. Do đó,CONFIG_UBSAN_SIGNED_WRAP
đã bị tắt để cho phép UBSAN chỉ hoạt động như một trình dọn dẹp giới hạn.
- Mặc dù việc dọn dẹp tình trạng tràn số nguyên đã ký trong nhân Linux có thể giúp xác định lỗi, nhưng có những trường hợp tràn là cố ý, 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 sự cố kernel panic khi phát hiện vấn đề để 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 việc nà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 đề__counted_by
đã biết.
- 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 giới hạn 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
- Ra mắt Linux 6.12-rc4
- Tóm tắt:
CONFIG_OF_DYNAMIC
có thể gây ra sự hồi quy nghiêm trọng cho các trình điều khiển bị lỗi. - Thông tin chi tiết: Trong khi hợp nhất
6.12-rc1
Linux vàoandroid-mainline
, chúng tôi nhận thấy các vấn đề về trình điều khiển ngoài cây không tải được. Thay đổi đã hiển thị lỗi trình điều khiển được xác định là thay đổi274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data")
và chúng tôi tạm thời huỷ thay đổi đó trong aosp/3287735. Thay đổi này sẽ chọnCONFIG_OF_OVERLAY
, sau đó chọnCONFIG_OF_DYNAMIC
. Với!OF_DYNAMIC
, tính năng đếm tham chiếu trênof_node_get()
vàof_node_put()
sẽ bị vô hiệu hoá hiệu quả vì các tính năng này được triển khai dưới dạngnoops
. Việc bật lạiOF_DYNAMIC
sẽ cho thấy các vấn đề trong trình điều khiển triển khai không chính xác tính năng đếm lượt 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ớ. - Tất cả các hoạt động sử dụng API liên quan đến việc phân tích cú pháp OF đều phải được kiểm tra. Danh sách sau đây chỉ là một phần nhưng chứa các 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 các hàm đó (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_node
sau bất kỳ loại thoát nào khỏi một số vòng lặp nhất định: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ữ 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::name
of_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_node
và quên huỷ tham chiếu (of_node_put()
). Các nút được trả về từ các 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ữ
device_node
từ một vòng lặp. Nếu bạn đang trả về hoặc bẻ từ trong phần sau, bạn cần bỏ 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 đề cập trước đó đã được khôi phục trong khi hạ cánh Linux
6.12-rc4
(xem aosp/3315251) bật lạiCONFIG_OF_DYNAMIC
và có thể hiển thị trình điều khiển lỗi.
- Tóm tắt: