🇰🇷 한글 설명
Linux 커널의 fastrpc 모듈에서 rpmsg 콜백 함수가 초기화되지 않은 상태에서 호출될 때 NULL 포인터 역참조가 발생할 수 있는 취약점입니다. DSP가 fastrpc_rpmsg_probe() 초기화가 완료되기 전에 glink 메시지를 보내면 커널 패닉이 발생할 수 있습니다.
💡 쉬운 설명
시스템이 부팅될 때 특정 부품이 준비되기도 전에 신호를 보내면, 컴퓨터의 핵심 운영체제가 길을 잃고 멈춰버리는 문제입니다. 이로 인해 시스템이 갑자기 재부팅되거나 작동을 멈출 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
misc: fastrpc: Fix NULL pointer dereference in rpmsg callback
A NULL pointer dereference was observed on Hawi at boot when the DSP
sends a glink message before fastrpc_rpmsg_probe() has completed
initialization:
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000178
pc : _raw_spin_lock_irqsave+0x34/0x8c
lr : fastrpc_rpmsg_callback+0x3c/0xcc [fastrpc]
...
Call trace:
_raw_spin_lock_irqsave+0x34/0x8c (P)
fastrpc_rpmsg_callback+0x3c/0xcc [fastrpc]
qcom_glink_native_rx+0x538/0x6a4
qcom_glink_smem_intr+0x14/0x24 [qcom_glink_smem]
The faulting address 0x178 corresponds to the lock variable inside
struct fastrpc_channel_ctx, confirming that cctx is NULL when
fastrpc_rpmsg_callback() attempts to take the spinlock.
There are two issues here. First, dev_set_drvdata() is called before
spin_lock_init() and idr_init(), leaving a window where the callback
can retrieve a valid cctx pointer but operate on an uninitialized
spinlock. Second, the rpmsg channel becomes live as soon as the driver
is bound, so fastrpc_rpmsg_callback() can fire before dev_set_drvdata()
is called at all, resulting in dev_get_drvdata() returning NULL.
Fix both issues by moving all cctx initialization ahead of
dev_set_drvdata() so the structure is fully initialized before it
becomes visible to the callback, and add a NULL check in
fastrpc_rpmsg_callback() as a guard against any remaining window.
📍 영향받는 시스템
Linux kernel (fastrpc module used in Qualcomm platforms)
⚔️ 공격 벡터
부팅 과정 중 특정 하드웨어(DSP)로부터의 조기 메시지 전송을 통한 로컬 서비스 거부(DoS)
🛡️ 대응 방법
cctx 초기화 순서를 dev_set_drvdata() 이전으로 변경하고, 콜백 함수 내에 NULL 체크 로직을 추가한 커널 패치 적용
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전인지 확인