🇰🇷 한글 설명
Linux 커널의 I3C 마스터 드라이버에서 장치 등록 중 재귀적 잠금(Recursive Locking)이 발생하는 취약점입니다. 장치 등록 과정에서 이미 보유한 rwsem을 다시 획득하려 시도하여, 쓰기 작업이 대기 중일 때 시스템 데드락(Deadlock)이 발생할 수 있습니다.
💡 쉬운 설명
컴퓨터 부품을 등록하는 과정에서 시스템이 스스로를 잠가버려 멈추는 현상이 발생할 수 있습니다. 특정 하드웨어가 연결될 때 시스템이 응답하지 않는 상태가 될 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
i3c: master: Fix recursive locking during device registration
i3c_master_register_new_i3c_devs() registers newly discovered devices
while holding i3c_bus_normaluse_lock(), a down_read(). device_register()
can immediately probe the device, and probe callbacks typically invoke
I3C helpers that take i3c_bus_normaluse_lock() again, leading to a
recursive acquisition of the same rwsem. rwsems do not support recursive
read locking and can deadlock when a writer is waiting. See the
"Recursive read locks" section of Documentation/locking/lockdep-design.rst.
For example, with Intel LPSS I3C, LOCKDEP generates a WARNING like:
# echo intel-lpss-i3c.0 > /sys/bus/platform/drivers/mipi-i3c-hci/unbind
# echo intel-lpss-i3c.0 > /sys/bus/platform/drivers/mipi-i3c-hci/bind
WARNING: possible recursive locking detected
kworker/5:1/94 is trying to acquire lock:
ffff88811c810d78 (&i3cbus->lock){++++}-{4:4}, at: i3c_device_match_id+0x45/0x370
but task is already holding lock:
ffff88811c810d78 (&i3cbus->lock){++++}-{4:4}, at: i3c_master_reg_work_fn+0x21/0x5f0
Fix this by separating device creation from device registration.
Populate desc->dev under the maintenance lock, collect the devices that
still need registration into a local list, then release the lock before
calling device_register(). Finally retake the lock and clean up any
devices that failed to register.
Use the maintenance lock rather than the normal-use lock while adding
device objects. A write-side maintenance lock prevents readers from
observing a partially initialized desc->dev during initial device
population, or desc->dev disappearing if registration fails.
The local list requires a list node, so add a list node member to struct
i3c_device.
📍 영향받는 시스템
I3C 마스터 기능을 사용하는 Linux 커널 버전
⚔️ 공격 벡터
로컬 공격자가 특정 I3C 장치를 바인딩/언바인딩하거나 장치를 등록하여 데드락 유도
🛡️ 대응 방법
장치 생성과 등록 과정을 분리하고, 유지보수용 잠금(maintenance lock)을 사용하는 최신 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 패치된 최신 버전인지 확인