CVE-2026-99109 in Linux
요약
\~에 의해 VulDB • 2026. 10. 28.
리눅스 커널에서 다음 취약점이 해결되었습니다:
smb: 클라이언트: 요청 버퍼에 맞지 않는 SetEA 요청 거부
CIFSSMBSetEA()는 호출자의 확장 속성(extended attribute) 값을 SMB 요청 버퍼로 복사할 때, 해당 값이 버퍼에 맞는지를 확인하지 않습니다. 소스 코드에는 이 요구사항이 명시되어 있었지만 구현되지 않았습니다:
/*BB add length check to see if it would fit in negotiated SMB buffer size BB */ /* if (ea_value_len > buffer_size - 512 (enough for header)) */ if (ea_value_len) memcpy(parm_data->list.name + name_len + 1, ea_value, ea_value_len);
입력 시 적용되는 유일한 경계 조건은 cifs_xattr_set()에 있습니다:
#define MAX_EA_VALUE_SIZE CIFSMaxBufSize ... if (size > MAX_EA_VALUE_SIZE)
CIFSMaxBufSize는 버퍼의 전체 페이로드 용량이므로, 정확히 그 크기의 값은 SMB 헤더, TRANS2 파라미터 블록, fealist 헤더 및 EA 이름(동일한 객체 내에서 앞에 작성됨)을 위한 공간이 전혀 남지 않습니다.
SendReceive()는 이미 이 길이에 대해 올바른 제한을 강제합니다:
if (in_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE)
하지만 이는 복사 작업 이후에 호출됩니다. 권한 없는 setxattr(2)가 250바이트 이름과 16384바이트 값을 사용하여 SMB1 마운트에서 실행되면, 16588바이트 크기의 cifs_request 객체 시작점으로부터 345바이트 지점에서부터 16384바이트가 작성되어 최종적으로 그 끝이 해당 객체를 141바이트 넘게 벗어납니다:
BUG: KASAN: slab-out-of-bounds in CIFSSMBSetEA+0xabc/0xde0 Write of size 16384 at addr ffff888003aa0159 by task init/68 __asan_memcpy+0x3c/0x60 CIFSSMBSetEA+0xabc/0xde0 cifs_xattr_set+0xd3a/0xff0 __vfs_setxattr+0x13e/0x1a0 The buggy address is located 345 bytes inside of allocated 16588-byte region
복사 작업 이후가 아니라 복사 전에 조립된 요청에 SendReceive()의 제한을 적용하고, 합계가 테스트되기 전에 오버플로우(wrap)할 수 없도록 바이트 카운터 범위를 확장합니다.
byte_count는 U16_MAX와 비교되는데, 이는 16비트 pSMB->ByteCount에 저장되기 때문입니다. 모듈 로딩 시 CIFSMaxBufSize가 최대 1024*127까지 설정될 수 있으므로 이 상황이 발생할 수 있습니다. EA 이름이 5바이트이고 값이 65521바이트인 경우, count는 정확히 U16_MAX가 되지만 byte_count는 65556이 됩니다. 이때 cpu_to_le16()은 이를 20으로 절단(truncate)하여 ByteCount가 실제 길이와 일치하지 않는 프레임을 전송하게 됩니다. byte_count를 테스트하는 것은 count도 커버하는데, 이는 byte_count가 두 값 중 더 크고 count의 유일한 16비트 소비자가 이 지점 이후에 작성되기 때문입니다.
check_add_overflow()는 total_len이 보고되기 전에 할당되도록 먼저 평가됩니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.