CVE-2026-31707 in Linux
요약
\~에 의해 VulDB • 2026. 05. 10.
리눅스 커널에서 다음 취약점이 해결되었습니다:
ksmbd: ipc_validate_msg()에서 응답 크기 검증
ipc_validate_msg()는 각 응답 유형에 대해 예상 메시지 크기를 계산할 때, 데몬 응답의 공격자가 제어 가능한 필드를 고정된 구조체 크기에 더하거나(unsigned int 산술 연산으로) 곱합니다. 다음 세 가지 경우에서 오버플로가 발생할 수 있습니다:
KSMBD_EVENT_RPC_REQUEST: msg_sz = sizeof(struct ksmbd_rpc_command) + resp->payload_sz; KSMBD_EVENT_SHARE_CONFIG_REQUEST: msg_sz = sizeof(struct ksmbd_share_config_response) + resp->payload_sz; KSMBD_EVENT_LOGIN_REQUEST_EXT: msg_sz = sizeof(struct ksmbd_login_response_ext) + resp->ngroups * sizeof(gid_t);
resp->payload_sz는 __u32이고 resp->ngroups는 __s32입니다. 각 덧셈 연산은 unsigned int에서 래핑(wrap)될 수 있으며, sizeof(gid_t)와의 곱셈은 부호 있는 정수와 size_t가 혼합되어 음수인 ngroups가 곱셈 전에 SIZE_MAX로 변환됩니다. msg_sz의 래핑된 값이 우연히 entry->msg_sz와 일치하면 다음 줄의 크기 검사(size check)를 우회하게 되며, 하류 소비자들(smb2pdu.c:6742의 rpc_resp->payload_sz를 사용한 memcpy, ksmbd_alloc_user의 resp_ext->ngroups를 사용한 kmemdup)은 검증되지 않은 길이를 신뢰하게 됩니다.
RPC_REQUEST 및 SHARE_CONFIG_REQUEST 경로에서 check_add_overflow()를 사용하여 기능적 페이로드 크기를 제한하지 않고 정수 오버플로를 감지합니다. 사용자 공간의 ksmbd-tools는 NetShareEnumAll과 같은 호출에 대해 NDR 응답을 4096바이트 단위로 증가시키므로, 응답 측에서 하드 전송 한계를 설정하는 것은 실행 불가능합니다. LOGIN_REQUEST_EXT의 경우, resp->ngroups가 부호 있는 [0, NGROUPS_MAX] 범위를 벗어날 경우 즉시 거부하고 ipc_validate_msg()에서 오류를 보고하여 IPC 경계에서 오류가 발생하도록 합니다. 이 경계 설정으로 인해 후속 곱셈과 덧셈 연산은 UINT_MAX보다 훨씬 낮은 범위 내에 머무릅니다. 이제 중복된 ngroups 검사 및 ksmbd_alloc_user()의 pr_err는 제거됩니다.
이는 요청 측(request side)을 강화한 aab98e2dbd64("ksmbd: fix integer overflows on 32 bit systems")의 응답 측(response side) 대응 개념입니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.