CVE-2026-89541 in Linux
Sumário
de VulDB • 12/09/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
SUNRPC: endurecer as verificações de comprimento em gss_unwrap_resp_priv
gss_unwrap_resp_priv() valida o comprimento opaco RPCSEC_GSS com:
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);
Ambos os operandos são u32 e a soma é computada em u32. Uma resposta com opaque_len próximo de 0xffffffff faz com que offset + opaque_len transborde (overflow) para um valor pequeno, inferior a rcv_buf->len; assim, a verificação dos limites passa e gss_unwrap() é chamada com end < begin. A verificação também carece de um limite inferior, portanto qualquer opaque_len em [0, GSS_KRB5_TOK_HDR_LEN) é aceito e encaminhado para gss_krb5_unwrap_v2(), cujo cabeçalho pré-descriptografia lê em ptr+4 e ptr+6, ultrapassando o token.
Um servidor NFS krb5p que retorna uma resposta RPCSEC_GSS manipulada pode levar o cliente a leituras fora dos limites (out-of-bounds) em gss_krb5_unwrap_v2() e no loop rotate_left() subsequente.
Correção: substituir a única verificação combinada por três proteções seguras na aritmética u32, que impõem o comprimento mínimo do token externo conforme RFC 4121:
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;
A primeira proteção torna a subtração na segunda verificação incondicionalmente segura; offset é derivado de uma xdr_inline_decode() bem-sucedida no kvec do cabeçalho, portanto, na prática, já satisfaz o limite. O piso (floor) espelha a verificação adicionada no lado do servidor no commit 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.