🇰🇷 한글 설명
Linux 커널의 OCFS2 파일 시스템에서 listxattr() 함수 호출 시 버퍼 크기 계산 오류가 발생합니다. 인라인 속성과 블록 기반 속성이 혼재된 경우, 버퍼가 가득 찼음에도 불구하고 더 큰 크기를 반환하여 커널 패닉(Kernel BUG)을 유발할 수 있습니다.
💡 쉬운 설명
파일의 추가 정보를 읽어올 때, 준비된 바구니 크기보다 더 많은 정보가 있다고 잘못 알려주어 시스템이 멈추는 문제입니다. 이로 인해 컴퓨터의 핵심인 커널이 갑자기 꺼지거나 오류가 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ocfs2: fix listxattr handling when the buffer is full
[BUG]
If an OCFS2 inode has both inline and block-based xattrs, listxattr()
can return a size larger than the caller's buffer when the inline names
consume that buffer exactly.
kernel BUG at mm/usercopy.c:102!
Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI
RIP: 0010:usercopy_abort+0xb7/0xd0 mm/usercopy.c:102
Call Trace:
__check_heap_object+0xe3/0x120 mm/slub.c:8243
check_heap_object mm/usercopy.c:196 [inline]
__check_object_size mm/usercopy.c:250 [inline]
__check_object_size+0x5c5/0x780 mm/usercopy.c:215
check_object_size include/linux/ucopysize.h:22 [inline]
check_copy_size include/linux/ucopysize.h:59 [inline]
copy_to_user include/linux/uaccess.h:219 [inline]
listxattr+0xb0/0x170 fs/xattr.c:926
filename_listxattr fs/xattr.c:958 [inline]
path_listxattrat+0x137/0x320 fs/xattr.c:988
__do_sys_listxattr fs/xattr.c:1001 [inline]
__se_sys_listxattr fs/xattr.c:998 [inline]
__x64_sys_listxattr+0x7f/0xd0 fs/xattr.c:998
...
[CAUSE]
Commit 936b8834366e ("ocfs2: Refactor xattr list and remove
ocfs2_xattr_handler().") replaced the old per-handler list accounting
with ocfs2_xattr_list_entry(), but it kept using size == 0 to detect
probe mode.
That assumption stops being true once ocfs2_listxattr() finishes the
inline-xattr pass. If the inline names fill the caller buffer exactly,
the block-xattr pass runs with a non-NULL buffer and a remaining size of
zero. ocfs2_xattr_list_entry() then skips the bounds check, keeps
counting block names, and returns a positive size larger than the
supplied buffer.
[FIX]
Detect probe mode by testing whether the destination buffer pointer is
NULL instead of whether the remaining size is zero.
That restores the pre-refactor behavior and matches the OCFS2 getxattr
helpers. Once the remaining buffer reaches zero while more names are
left, the block-xattr pass now returns -ERANGE instead of reporting a
size larger than the allocated list buffer.
📍 영향받는 시스템
Linux kernel (OCFS2 파일 시스템을 사용하는 시스템)
⚔️ 공격 벡터
조작된 xattr(확장 속성)을 가진 OCFS2 파일 시스템을 마운트하거나 관련 시스템 호출을 유도하여 커널 패닉 유발
🛡️ 대응 방법
커널 패치(Commit 936b8834366e 적용 버전)를 적용하여 버퍼 크기 검증 로직 수정
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 최신 패치 버전인지 배포판 보안 공지를 통해 확인하십시오.