CVE-2026-89541 in Linux
요약
\~에 의해 VulDB • 2026. 09. 12.
리눅스 커널에서 다음 취약점이 해결되었습니다.
SUNRPC: gss_unwrap_resp_priv의 길이 검사 강화
gss_unwrap_resp_priv() 함수는 RPCSEC_GSS opaque 길이를 다음과 같이 검증합니다.
offset = (u8 *)(p) - (u8 *)head->iov_base; if (offset + opaque_len > rcv_buf->len) goto unwrap_failed; maj_stat = gss_unwrap(ctx->gc_gss_ctx, offset, offset + opaque_len, rcv_buf);
두 피연산자는 모두 u32이며 합은 u32로 계산됩니다. opaque_len이 0xffffffff에 가까운 응답의 경우, offset + opaque_len는 작은 값으로 오버플로우되어 rcv_buf->len보다 작아지므로 경계 검사가 통과하고 gss_unwrap()가 end < begin 조건으로 호출됩니다. 또한 해당 검사에는 하한 bound도 없으므로 [0, GSS_KRB5_TOK_HDR_LEN) 범위의 모든 opaque_len이 허용되어 gss_krb5_unwrap_v2()로 전달되며, 이 함수의 복호화 전 헤더는 ptr+4 및 ptr+6에서 읽기를 수행하여 토큰을 벗어납니다.
조작된 RPCSEC_GSS 응답을 반환하는 krb5p NFS 서버는 클라이언트를 gss_krb5_unwrap_v2()와 그 뒤에 이어지는 rotate_left() 루프 내의 out-of-bounds reads로 이끌 수 있습니다.
해결책은 단일 결합 검사를 u32 산술에서 안전하며 RFC 4121 최소 외부 토큰 길이를 강제하는 세 가지 보호 장치(guards)로 대체하는 것입니다.
if (offset > rcv_buf->len) goto unwrap_failed; if (opaque_len > rcv_buf->len - offset) goto unwrap_failed; if (opaque_len < GSS_KRB5_TOK_HDR_LEN) goto unwrap_failed;
첫 번째 보호 장치는 두 번째 보호 장치의 뺄셈을 무조건적으로 안전하게 만듭니다. offset은 head kvec 내의 성공적인 xdr_inline_decode()에서 파생되므로, 실제로 이미 해당 경계를 만족합니다. 하한(floor) 검사는 커밋 5b757c2e57a5("SUNRPC: svcauth_gss: enforce krb5 token minimum length")에 추가된 서버 측 검사와 대조를 이룹니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.