이 페이지에서는 android-mainline
에서 발견되었으며 파트너에게 중요한 수정사항과 버그 수정을 설명합니다.
2024년 11월 1일
- 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
의 참조 수를 잘못 구현하는 드라이버의 문제가 노출됩니다. 이로 인해 메모리 손상, use-after-free, 메모리 누수와 같은 다양한 유형의 오류가 발생합니다. - OF 파싱 관련 API의 모든 사용은 검사해야 합니다. 다음 목록은 일부이지만 지금까지 관찰된 사례를 포함합니다.
- Use after free(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()
- 다음을 사용하여
device_node
의char *
속성에 대한 직접 포인터를 유지합니다.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()
- Use after free(UAF):
- 앞서 언급한 변경사항은 Linux
6.12-rc4
를 방문(aosp/3315251 참고)하는 동안 복원되어CONFIG_OF_DYNAMIC
를 다시 사용 설정하여 결함이 있는 드라이버를 노출시킬 수 있습니다.
- 요약: