🇰🇷 한글 설명
Linux 커널의 ublk 구성 요소에서 ublk_abort_queue() 함수가 복구 및 재발행 시 요청 참조를 적절히 확보하지 못하는 취약점이 발견되었습니다. 이로 인해 io_uring 명령 취소 시 요청이 잘못 처리되어 커널 NULL 포인터 역참조가 발생하고 시스템 패닉(Kernel Panic)이 유발될 수 있습니다.
💡 쉬운 설명
컴퓨터의 데이터 처리 요청을 취소하는 과정에서 메모리 관리 오류가 발생하여 시스템이 갑자기 멈추거나 꺼질 수 있는 문제입니다. 특정 상황에서 데이터 요청이 이미 사라졌는데 다시 사용하려고 시도할 때 발생합니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ublk: fix handling recovery & reissue in ublk_abort_queue()
Commit 8284066946e6 ("ublk: grab request reference when the request is handled
by userspace") doesn't grab request reference in case of recovery reissue.
Then the request can be requeued & re-dispatch & failed when canceling
uring command.
If it is one zc request, the request can be freed before io_uring
returns the zc buffer back, then cause kernel panic:
[ 126.773061] BUG: kernel NULL pointer dereference, address: 00000000000000c8
[ 126.773657] #PF: supervisor read access in kernel mode
[ 126.774052] #PF: error_code(0x0000) - not-present page
[ 126.774455] PGD 0 P4D 0
[ 126.774698] Oops: Oops: 0000 [#1] SMP NOPTI
[ 126.775034] CPU: 13 UID: 0 PID: 1612 Comm: kworker/u64:55 Not tainted 6.14.0_blk+ #182 PREEMPT(full)
[ 126.775676] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-1.fc39 04/01/2014
[ 126.776275] Workqueue: iou_exit io_ring_exit_work
[ 126.776651] RIP: 0010:ublk_io_release+0x14/0x130 [ublk_drv]
Fixes it by always grabbing request reference for aborting the request.
📍 영향받는 시스템
ublk 드라이버를 사용하는 Linux 커널 (커밋 8284066946e 이전 버전)
⚔️ 공격 벡터
로컬 사용자가 ublk 및 io_uring을 사용하여 특정 조건의 입출력 요청을 생성하고 취소함으로써 발생
🛡️ 대응 방법
커널 패치(Commit 8284066946e 포함 버전)를 적용하여 ublk 요청 참조 관리 로직을 업데이트해야 함
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인하십시오.