🇰🇷 한글 설명
Linux 커널의 NILFS2 파일 시스템에서 nilfs_ioctl_mark_blocks_dirty() 함수가 잘못된 ioctl 요청을 처리할 때 발생하는 취약점입니다. bd_oblocknr 값이 0인 경우 데드 블록 체크를 우회하여 존재하지 않는 블록에 대해 nilfs_bmap_mark()를 호출하게 되며, 이로 인해 커널 경고(WARN_ON)가 발생합니다.
💡 쉬운 설명
파일 시스템의 특정 기능을 수행할 때 잘못된 번호를 입력하면 시스템이 혼란을 겪어 오류 경고를 발생시키는 문제입니다. 이는 시스템의 안정성을 해칠 수 있는 논리적 결함입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
nilfs2: reject zero bd_oblocknr in nilfs_ioctl_mark_blocks_dirty()
nilfs_ioctl_mark_blocks_dirty() uses bd_oblocknr to detect dead blocks
by comparing it with the current block number bd_blocknr. If they differ,
the block is considered dead and skipped.
However, bd_oblocknr should never be 0 since block 0 typically stores the
primary superblock and is never a valid GC target block. A corrupted ioctl
request with bd_oblocknr set to 0 causes the comparison to incorrectly
match when the lookup returns -ENOENT and sets bd_blocknr to 0, bypassing
the dead block check and calling nilfs_bmap_mark() on a non-existent
block. This causes nilfs_btree_do_lookup() to return -ENOENT, triggering
the WARN_ON(ret == -ENOENT).
Fix this by rejecting ioctl requests with bd_oblocknr set to 0 at the
beginning of each iteration.
[ryusuke: slightly modified the commit message and comments for accuracy]
📍 영향받는 시스템
NILFS2 파일 시스템을 사용하는 Linux 커널 버전
⚔️ 공격 벡터
조작된 bd_oblocknr(0) 값을 포함한 ioctl 요청을 통해 발생
🛡️ 대응 방법
ioctl 요청 시 bd_oblocknr이 0인 경우 이를 거부하도록 커널 패치 적용
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 최신 패치 버전인지 확인합니다.