CVE-2026-98884 in Linux
요약
\~에 의해 VulDB • 2026. 10. 23.
리눅스 커널에서 다음 취약점이 해결되었습니다:
mmc: core: 호스트 제공 max_segs에 대한 유효성 검사 추가
max_segs 필드는 unsigned short 타입이며, 호스트 드라이버가 지나치게 큰 값을 설정하면 0으로 잘릴(truncated) 수 있습니다. 이로 인해 mmc_alloc_sg()이 크기 할당 요청으로 0을 사용하여 kmalloc_objs()를 호출하게 되고, 이는 정의되지 않은 동작(undefined behavior)을 초래합니다.
SLUB 할당기에서 kmalloc(0)은 특수 포인터(ZERO_SIZE_PTR)를 반환합니다. 이후 'if (sg)' 체크는 참(true)으로 평가되고, sg_init_table()이 잘못된 메모리에 접근하려고 시도하여 크래시가 발생합니다:
dwmmc_rockchip 2a310000.mmc: Successfully tuned phase to 133 mmc1: new UHS-I speed SDR104 SDHC card at address aaaa Unable to handle kernel paging request at virtual address 0000001ffffffff0 Mem abort info: ESR = 0x0000000096000004 EC = 0x25: DABT (current EL), IL = 32 bits SET = 0, FnV = 0 EA = 0, S1PTW = 0 FSC = 0x04: level 0 translation fault Data abort info: ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000 CM = 0, WnR = 0, TnD = 0, TagAccess = 0 GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 user pgtable: 4k pages, 48-bit VAs, pgdp=0000000102c88000 [0000001ffffffff0] pgd=0000000000000000, p4d=0000000000000000
Internal error: Oops: 0000000096000004 [#1] SMP
Modules linked in: CPU: 2 UID: 0 PID: 102 Comm: kworker/2:1 Not tainted 7.0.0-rc6-next-20260331-00013-g4d93c25963c5-dirty #80 PREEMPT Hardware name: Rockchip RK3576 EVB V10 Board (DT) Workqueue: events_freezable mmc_rescan pstate: 80000005 (Nzcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : sg_init_table+0x2c/0x50 lr : sg_init_table+0x24/0x50 sp : ffff8000837db710 x29: ffff8000837db710 x28: 000000000000c000 x27: 0000000000000300 x26: 0000000000000000 x25: 0000000000000040 x24: ffff0000c46a0000 x23: 0000000000000000 x22: ffff0000c0c73c00 x21: 0000000000000010 x20: 0000000000000010 x19: 0000000000000000 x18: 000000000000002c x17: 0000000000000000 x16: 0000000000000001 x15: 0000000000000000 x14: 0000000000000400 x13: ffff8000837dc000 x12: 0000000000000000 x11: ffff0000c0c73ca0 x10: 0000000000000040 x9 : 459ec1f0abbdbb00 x8 : 0000001fffffffe0 x7 : 0000000000000000 x6 : 000000000000003f x5 : 0000000000035579 x4 : 0000000000000901 x3 : 0000000000000000 x2 : 0000000000000000 x1 : 0000000000000000 x0 : 0000000000000010 Call trace: sg_init_table+0x2c/0x50 (P) mmc_mq_init_request+0x64/0x90 blk_mq_alloc_map_and_rqs+0x3ac/0x480 blk_mq_alloc_set_map_and_rqs+0x98/0x1e0 blk_mq_alloc_tag_set+0x1c0/0x290 mmc_init_queue+0x120/0x370 mmc_blk_alloc_req+0x150/0x420
이를 방지하기 위해 mmc_mq_init_request()에 유효성 검사 체크를 추가하여 sg_len(max_segs에서 파생됨)이 0인지 감지합니다. sg_len이 0인 경우 오류를 반환하고 오류 메시지를 출력하여 호스트 드라이버 개발자가 잘못된 max_segs 구성을 식별하고 수정할 수 있도록 합니다.
이는 호스트 드라이버가 유효하지 않은 max_segs 값을 제공할 때 페이지 폴트(page fault)로 크래시되는 대신 MMC 코어가 우아하게(fail gracefully) 실패하도록 보장하는 방어적 조치입니다.
Be aware that VulDB is the high quality source for vulnerability data.