🇰🇷 한글 설명
Linux 커널의 ksmbd 모듈에서 DACL 크기 계산 시 정수 오버플로가 발생할 수 있는 취약점이 발견되었습니다. 오버플로 발생 시 잘못된 ACL 크기가 기록되어, 이를 다시 파싱할 때 클라이언트나 ksmbd 자체에서 경계 외 읽기(Out-of-bounds read)를 유발할 수 있습니다.
💡 쉬운 설명
데이터의 크기를 계산하는 과정에서 숫자가 너무 커져 오류가 발생하면, 실제 데이터보다 작은 크기로 잘못 기록되는 문제입니다. 이로 인해 컴퓨터가 잘못된 위치의 데이터를 읽으려다 시스템 오류가 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ksmbd: restore DACL size on check_add_overflow() to avoid malformed ACL
check_add_overflow() unconditionally writes the truncated sum into *d
even on overflow, per its contract in include/linux/overflow.h.
The four check_add_overflow() guards in set_posix_acl_entries_dacl()
and set_ntacl_dacl() break out of the ACE-building loops on overflow,
but the truncated *size is then consumed downstream at the end of
set_ntacl_dacl():
pndacl->size = cpu_to_le16(le16_to_cpu(pndacl->size) + size);
This produces an on-wire NT ACL whose pndacl->size under-reports the
bytes actually written by the preceding fill_ace_for_sid()/memcpy()
calls, yielding a malformed ACL that can trigger out-of-bounds reads
when re-parsed by clients or ksmbd itself.
Restore *size to its pre-addition value on each overflow branch (via
`*size -= ace_sz` / `size -= nt_ace_size`) so that after the break,
*size once again holds the cumulative size of the successfully-written
ACEs. The committed ACL is then truncated-but-self-consistent rather
than malformed.
The ksmbd DACL builders are the only check_add_overflow() sites found
where an overflow path breaks out of a loop and the destination value
is consumed afterward. The other nearby break-style cases either
return -EINVAL on overflow (transport_ipc.c) or break without
consuming the overflowed destination value afterward (buildid.c).
📍 영향받는 시스템
Linux kernel (ksmbd module 포함 버전)
⚔️ 공격 벡터
조작된 NT ACL 데이터를 ksmbd 서버로 전송하여 오버플로 유도
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인