🇰🇷 한글 설명
Linux 커널의 scsi_debug 모듈에서 REPORT ZONES 명령 처리 시 발생하는 정수 언더플로우 및 Out-of-Bounds(OOB) 쓰기 취약점입니다. 32비트 시스템에서 특정 크기의 할당 요청 시 메모리 크기가 0으로 절단되어 잘못된 메모리 주소에 데이터를 쓰는 문제가 발생할 수 있습니다.
💡 쉬운 설명
컴퓨터가 메모리 크기를 계산하는 과정에서 숫자가 너무 커져 0으로 잘못 인식되는 오류가 있습니다. 이로 인해 시스템이 엉뚱한 메모리 위치에 데이터를 쓰려고 시도하다가 시스템이 멈추거나 충돌할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
scsi: scsi_debug: Fix REPORT ZONES alloc_len underflow OOB write
resp_report_zones() sizes the reply buffer from the CDB allocation
length. The v3 fix rounds alloc_len up with ALIGN() before deriving the
descriptor count:
rep_max_zones = (ALIGN((u64)alloc_len, RZONES_DESC_HD) -
RZONES_DESC_HD) >> ilog2(RZONES_DESC_HD);
arr_len = (u64)RZONES_DESC_HD * (rep_max_zones + 1);
For alloc_len in 0xFFFFFFC1..0xFFFFFFFF, ALIGN() rounds up to
0x100000000, so arr_len is 4 GB. On 32-bit, kzalloc()'s size_t is 32-bit
and truncates 0x100000000 to 0; kzalloc(0) returns ZERO_SIZE_PTR, which
passes the !arr check, and desc = arr + 64 is then dereferenced in the
loop -> out-of-bounds write / panic.
Clamp rep_max_zones to devip->nr_zones. The loop already stops at
sdebug_capacity (after nr_zones zones), so a report can never hold more
than nr_zones descriptors; the clamp does not change the report, it only
bounds arr_len to (nr_zones + 1) * RZONES_DESC_HD, a real device
property that can never reach 0x100000000.
📍 영향받는 시스템
scsi_debug 모듈을 사용하는 32비트 Linux 커널 시스템
⚔️ 공격 벡터
조작된 SCSI REPORT ZONES 명령을 통해 커널 메모리 오염 유도
🛡️ 대응 방법
scsi_debug의 rep_max_zones 값을 장치의 실제 존(zone) 개수로 제한하도록 커널 패치 적용
🔧 검증 코드
커널 버전과 scsi_debug 모듈 정보를 확인하여 최신 보안 패치가 적용된 커널인지 확인합니다.
uname -a && modinfo scsi_debug 2>/dev/null
📊 CVSS Vector String
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
💻 영향받는 소프트웨어
NVIDIA Cloud Gaming Guest Driver for Linux