Zephyr의 동적 커널 개체 추적(kernel/userspace/userspace.c, 이전의 kernel/userspace.c)은 동적으로 할당된 커널 개체의 이중 연결 목록(obj_list)을 유지 관리합니다. k_object_wordlist_foreach()에서 이 목록에 대한 반복은 SAFE 반복자(다음 노드를 캐시함)를 사용하여 list_lock에서 수행되었지만 목록 제거 및 노드 해제는 k_object_free()의 objfree_lock 및 unref_check()의 obj_lock과 같은 서로 다른 분리 스핀록에서 수행되었습니다. SMP 시스템에서는
Zephyr의 동적 커널 개체 추적(kernel/userspace/userspace.c, 이전의 kernel/userspace.c)은 동적으로 할당된 커널 개체의 이중 연결 목록(obj_list)을 유지 관리합니다. k_object_wordlist_foreach()에서 이 목록에 대한 반복은 SAFE 반복자(다음 노드를 캐시함)를 사용하여 list_lock에서 수행되었지만 목록 제거 및 노드 해제는 k_object_free()의 objfree_lock 및 unref_check()의 obj_lock과 같은 서로 다른 분리 스핀록에서 수행되었습니다. SMP 시스템에서 한 CPU가 Lists_lock 아래의 obj_list를 반복하는 동안 다른 CPU는 반복자가 다음 포인터로 캐시한 dyn_obj 노드의 링크를 해제하고 k_free()할 수 있어 반복자가 해제된 커널 메모리를 역참조하게 됩니다(해제 후 사용/매달린 목록 탐색). 모든 레이싱 작업은 시스템 호출을 통해 권한이 없는 사용자 모드 스레드에서 도달할 수 있습니다. unref_check()(obj_lock 아래)를 통해 k_object_alloc/k_object_alloc_size 및 k_object_release 드라이브 제거를 수행하는 반면, k_thread_abort 및 스레드 생성은 k_thread_perms_all_clear()/k_thread_perms_inherit()(lists_lock 아래)를 통해 반복을 구동합니다. 따라서 CONFIG_SMP + CONFIG_USERSPACE 빌드에서 권한이 박탈된 사용자 스레드는 사용자 공간 보안 경계에서 커널의 객체 추적 구조를 손상시켜 커널 메모리 손상(잠재적 권한 상승) 또는 커널 충돌(서비스 거부)을 초래할 수 있습니다. 수정 사항은 objfree_lock을 제거하고 k_object_free()의 find+remove 및 k_thread_perms_clear()의 unref_check() 주변을 포함하여 list_lock 아래의 모든 obj_list 수정 사항을 직렬화합니다. CONFIG_SMP+CONFIG_USERSPACE+CONFIG_DYNAMIC_OBJECTS 구성에 영향을 미칩니다. 결함은 2019년 스핀 잠금(8a3d57b6cc6 커밋, v1.14.0에서 처음 릴리스됨)으로 발생하며 v4.4.0을 통해 배송되었습니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 78.00 |
| 악용 신호(PoC 존재) | ×1.20 |
| VPI | 93.60 |
VPI 공식 vpi-v1 기준