🇰🇷 한글 설명
Linux 커널의 CXL(Compute Express Link) 드라이버에서 자동 탐색 중 타겟 배열 내에 NULL 포인터 구멍(hole)이 발생하는 취약점입니다. 이로 인해 NULL 포인터 참조로 인한 시스템 오류(General Protection Fault)가 발생하거나, 유효한 엔드포인트 디코더 개수를 잘못 계산하는 문제가 발생할 수 있습니다.
💡 쉬운 설명
컴퓨터 부품을 연결하는 과정에서 빈 자리를 제대로 채우지 못해 시스템이 갑자기 멈추거나 오류가 발생하는 문제입니다. 빈 공간을 건너뛰지 않고 차곡차곡 채우도록 수정하여 이 문제를 해결했습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
cxl/region: Fill first free targets[] slot during auto-discovery
Any invalid endpoint decoder pointer in the target array of an active
region is not allowed by cxl driver. This means cxl driver always
assumes the first p->nr_targets entries of the target array in an
auto-assembly region are valid. However, there are scenarios that could
leave NULL endpoint decoder pointer holes in the target array.
1. When cxl_cancel_auto_attach() removes an endpoint decoder from a
target array, the target slot is set to NULL. If the removed endpoint
decoder is not the last element in the target array, the target array
will contain a NULL hole.
2. When a auto-assembly region removes an assigned endpoint decoder, if
the removed endpoint decoder is not the last element in the target
array, always remains a NULL hole in the target array.
When a NULL pointer hole exists in a region's target array, it
introduces two potential problems:
1. Access an endpoint decoder via a NULL pointer. it always trigger
calltrace like that.
Oops: general protection fault, probably for non-canonical address 0xdffffc0000000008: 0000 [#1] SMP KASAN PTI
RIP: 0010:cxl_calc_interleave_pos+0x26/0x810 [cxl_core]
Call Trace:
<TASK>
cxl_region_attach+0xc50/0x2140 [cxl_core]
cxl_add_to_region+0x321/0x2330 [cxl_core]
discover_region+0x92/0x150 [cxl_port]
device_for_each_child+0xf3/0x170
cxl_port_probe+0x150/0x200 [cxl_port]
cxl_bus_probe+0x4f/0xa0 [cxl_core]
really_probe+0x1c8/0x960
__driver_probe_device+0x323/0x450
driver_probe_device+0x45/0x120
__device_attach_driver+0x15d/0x280
bus_for_each_drv+0x10f/0x190
2. Not having enough valid endpoint decoders attached to an
auto-assembly region. if an auto-assembly region is created with lock
flag or assigned endpoint decoder with lock flag, which means
assigned endpoint decoder will not be reset during detaching, they
could re-attach to the auto-assembly region again. But cxl region
driver relies on p->nr_targets to verify whether the required number
of endpoint decoders has been attached, and NULL endpoint decoder
pointers are still counted in that case.
To fix above issues, adjust cxl_region_attach_auto() logic to find the
first free target slot for endpoint decoder attachment, this ensures
NULL holes in the target array are filled, rather than adding new
endpoint decoders at the tail of the target array.
📍 영향받는 시스템
Linux kernel (CXL driver components)
⚔️ 공격 벡터
로컬 공격자가 CXL 장치의 자동 연결/해제 시나리오를 조작하여 커널 패닉을 유도할 수 있음
🛡️ 대응 방법
CXL 드라이버를 최신 커널 버전으로 업데이트하여 cxl_region_attach_auto() 로직을 적용해야 함
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 패치된 최신 릴리스 버전인지 확인하십시오.
💻 영향받는 소프트웨어
IBM Security Verify Access