🇰🇷 한글 설명
Linux 커널의 uartlite 드라이버에서 두 개의 uart 장치가 동시에 프로빙될 때 발생하는 경합 조건(Race Condition) 취약점입니다. 한 스레드가 드라이버를 등록하는 도중 다른 스레드가 미완성된 드라이버 구조체에 접근하여 NULL 포인터 역참조를 유발하고 커널 패닉을 일으킵니다.
💡 쉬운 설명
두 개의 장치가 동시에 켜질 때, 시스템이 장치 준비가 덜 끝난 상태에서 명령을 내려 컴퓨터가 갑자기 멈추거나 꺼지는 문제입니다. 장치 등록 순서를 바로잡아 이 충돌을 방지해야 합니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
tty: serial: uartlite: register uart driver in init
When two instances of uart devices are probing, a concurrency race can
occur. If one thread calls uart_register_driver function, which first
allocates and assigns memory to 'uart_state' member of uart_driver
structure, the other instance can bypass uart driver registration and
call ulite_assign. This calls uart_add_one_port, which expects the uart
driver to be fully initialized. This leads to a kernel panic due to a
null pointer dereference:
[ 8.143581] BUG: kernel NULL pointer dereference, address: 00000000000002b8
[ 8.156982] #PF: supervisor write access in kernel mode
[ 8.156984] #PF: error_code(0x0002) - not-present page
[ 8.156986] PGD 0 P4D 0
...
[ 8.180668] RIP: 0010:mutex_lock+0x19/0x30
[ 8.188624] Call Trace:
[ 8.188629] ? __die_body.cold+0x1a/0x1f
[ 8.195260] ? page_fault_oops+0x15c/0x290
[ 8.209183] ? __irq_resolve_mapping+0x47/0x80
[ 8.209187] ? exc_page_fault+0x64/0x140
[ 8.209190] ? asm_exc_page_fault+0x22/0x30
[ 8.209196] ? mutex_lock+0x19/0x30
[ 8.223116] uart_add_one_port+0x60/0x440
[ 8.223122] ? proc_tty_register_driver+0x43/0x50
[ 8.223126] ? tty_register_driver+0x1ca/0x1e0
[ 8.246250] ulite_probe+0x357/0x4b0 [uartlite]
To prevent it, move uart driver registration in to init function. This
will ensure that uart_driver is always registered when probe function
is called.
📍 영향받는 시스템
Linux kernel (uartlite driver 사용 환경)
⚔️ 공격 벡터
로컬 환경에서 다수의 uart 장치를 동시에 프로빙하거나 하드웨어 인터럽트를 유도하여 경합 조건 발생
🛡️ 대응 방법
커널 패치를 통해 uart 드라이버 등록 과정을 init 함수로 이동하여 프로브 시점에 드라이버가 항상 등록되어 있도록 수정
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 해결된 최신 보안 패치 버전인지 확인합니다.