🇰🇷 한글 설명
Linux 커널의 ntfs3 파일 시스템에서 LZNT 압축 해제 과정 중 정보 유출 취약점이 발견되었습니다. 압축 해제된 데이터가 요청된 크기보다 작을 경우, 초기화되지 않은 커널 페이지 메모리 영역이 사용자 공간으로 노출될 수 있습니다. 이를 통해 공격자는 커널 포인터를 획득하여 KASLR(커널 주소 공간 레이아웃 임의화)을 무력화할 수 있습니다.
💡 쉬운 설명
특수하게 제작된 압축 파일을 읽을 때, 컴퓨터의 중요한 비밀 정보가 담긴 메모리 일부가 공격자에게 노출될 수 있는 문제입니다. 이 정보를 이용하면 해커가 시스템의 보안 방어막을 뚫고 커널을 공격하기 쉬워집니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
fs/ntfs3: fix info-leak on partial LZNT decompress in ni_read_frame()
ni_read_frame() decompresses an LZNT $DATA frame into the vmapped target
pages and then trusts decompress_lznt()'s return value:
unc_size = decompress_lznt(frame_ondisk, ondisk_size, frame_mem,
frame_size);
if ((ssize_t)unc_size < 0) err = unc_size;
else if (!unc_size || unc_size > frame_size) err = -EINVAL;
decompress_lznt() stops as soon as the compressed stream is exhausted
(e.g. a zero chunk header) and returns the number of bytes it actually
wrote, which may be far less than frame_size. The bytes between unc_size
and frame_size are never written. The only memset() that follows zeroes
the region beyond i_valid; when the frame lies entirely within the file's
valid size that memset() does not run, so the gap retains whatever was in
the just-vmapped pages. All pages are then marked uptodate and returned
to userspace, disclosing uninitialized (recently-freed) kernel page
memory. A crafted compressed file whose stream decompresses to only a few
bytes leaks the remainder of every frame on a plain read(2), which is
enough to recover kernel pointers and defeat KASLR.
Zero the [unc_size, frame_size) tail immediately after a successful LZNT
decompress so the remainder reads back as zero.
📍 영향받는 시스템
LZNT 압축 기능을 사용하는 Linux 커널 (ntfs3 드라이버 포함 버전)
⚔️ 공격 벡터
조작된 LZNT 압축 데이터가 포함된 NTFS 파일 시스템 파일을 read(2) 시스템 호출로 읽기
🛡️ 대응 방법
LZNT 압축 해제 직후 잔여 메모리 영역을 0으로 초기화하는 패치가 적용된 최신 Linux 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 보안 패치 버전 이후인지 확인하십시오.