🇰🇷 한글 설명
Linux 커널의 ksmbd 모듈에서 SMB2 복합 요청의 크기를 검증하기 전에 StructureSize2 필드를 읽는 취약점이 발견되었습니다. 공격자가 마지막 요소의 크기를 정밀하게 조작하여 64바이트 경계를 넘어서는 읽기 작업을 수행하게 함으로써 slab-out-of-bounds read를 유발할 수 있습니다.
💡 쉬운 설명
컴퓨터가 데이터를 읽을 때 정해진 범위를 살짝 벗어나서 읽게 되는 오류가 있습니다. 나쁜 의도를 가진 사용자가 특수하게 만든 요청을 보내면 시스템의 메모리 정보를 몰래 훔쳐볼 위험이 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ksmbd: validate compound request size before reading StructureSize2
When ksmbd validates a compound (chained) SMB2 request,
ksmbd_smb2_check_message() reads pdu->StructureSize2 without first
checking that the compound element is large enough to contain it.
StructureSize2 is a 2-byte field at offset 64
(__SMB2_HEADER_STRUCTURE_SIZE) from the start of each element.
The compound-walking logic only guarantees that a full 64-byte SMB2
header is present for the trailing element: when NextCommand is 0, len is
reduced to the number of bytes remaining after next_smb2_rcv_hdr_off. A
remote client can craft a compound request whose last element has exactly
64 bytes, so the 2-byte StructureSize2 read at offset 64 extends one byte
past the receive buffer, producing a slab-out-of-bounds read.
BUG: KASAN: slab-out-of-bounds in ksmbd_smb2_check_message (fs/smb/server/smb2misc.c:402)
Read of size 2 at addr ffff888012ae31ac by task kworker/0:1/14
The buggy address is located 172 bytes inside of allocated 173-byte region
Workqueue: ksmbd-io handle_ksmbd_work
Call Trace:
...
kasan_report (mm/kasan/report.c:595)
ksmbd_smb2_check_message (fs/smb/server/smb2misc.c:402)
handle_ksmbd_work (fs/smb/server/server.c:119)
process_one_work (kernel/workqueue.c:3314)
worker_thread (kernel/workqueue.c:3397)
kthread (kernel/kthread.c:436)
ret_from_fork (arch/x86/kernel/process.c:158)
ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
Reject any compound element that is too small to hold StructureSize2
before dereferencing it.
📍 영향받는 시스템
ksmbd 모듈을 사용하는 Linux 커널 버전
⚔️ 공격 벡터
조작된 SMB2 복합 요청(Compound Request)을 전송하여 메모리 경계 밖의 데이터를 읽도록 유도
🛡️ 대응 방법
StructureSize2를 참조하기 전에 복합 요소의 크기가 충분한지 검증하도록 커널을 업데이트하십시오.
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 취약점이 패치된 최신 버전인지 확인하십시오.