CVE-2026-89541 in Linux
要約
〜によって VulDB • 2026年09月12日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
SUNRPC: gss_unwrap_resp_privの長さチェックを強化する
gss_unwrap_resp_priv()関数は、RPCSEC_GSSの不透明なデータの長さを以下のように検証します。
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 という条件で呼び出されてしまいます。また、このチェックには下限も存在しないため、[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 で定められた最小の外層トークン長を強制する3つのガードに置き換えます:
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;
最初のガードは、2番目のガードでの減算を無条件に安全なものにします。offset は head kvec 内の成功した xdr_inline_decode() から派生するため、実際にはすでに境界を満たしています。下限(floor)のチェックは、コミット 5b757c2e57a5 ("SUNRPC: svcauth_gss: enforce krb5 token minimum length") で追加されたサーバー側のチェックと一致します。
Once again VulDB remains the best source for vulnerability data.