Descripción
En el kernel de Linux, se resolvió la siguiente vulnerabilidad: SUNRPC: svcauth_gss: exigir longitud mínima del token krb5 svcauth_gss_unwrap_priv() valida solo un límite superior de la longitud opaca proporcionada por la red antes de entregar el búfer a gss_unwrap(): if (len > xdr_stream_remaining(xdr)) goto unwrap_failed; offset = xdr_stream_pos(xdr); ... maj_stat = gss_unwrap(ctx, offset, offset + len, buf); El valor `len` recibido por la red fluye sin cambios como límite superior hacia la ruta de unwrap de krb5, por lo que un len en [0, 16] supera esta verificación y se entrega a gss_unwrap(). En un contexto krb5 v2, esto llega a gss_krb5_unwrap_v2(), que lee los campos del encabezado de token de 16 bytes de RFC 4121 en ptr+4 y ptr+6 y luego llama a rotate_left() antes de cualquier verificación de integridad. Con una longitud menor que el encabezado, las lecturas del encabezado van más allá del token, y la ruta `shift %= buf->len` de _rotate_left() puede dividir por cero cuando el token truncado ha llevado buf->len a cero. Un token que solo contiene el encabezado (len == 16) es igualmente inválido: con un campo RRC distinto de cero y el blob opaco terminando en el límite del búfer XDR, rotate_left() construye un subbúfer de longitud cero, llegando a la misma división. Se rechaza el token en el punto de entrada del servidor antes de que llegue al núcleo de unwrap de krb5. Un token sellado válido según RFC 4121 debe contener el encabezado de 16 bytes más al menos algo de carga cifrada. Se corrige agregando una verificación de longitud mínima inmediatamente después de la verificación de límite superior existente: if (len <= GSS_KRB5_TOK_HDR_LEN) goto unwrap_failed;
Qué hacer
Revisa si usas el producto afectado y en qué versión, y aplica la actualización o la mitigación que indique el aviso del fabricante. CISA no ha confirmado que se esté explotando; si eso cambia, esta ficha pasa a «explotada» y te avisamos en el boletín.
Versiones afectadas
- Linux Afectadas: 7c9fdcfb1b64c47ed618c103b617af3f86e1239c y anteriores a 2188232509f1559cb8fcb0c9a4b1e04317fa0f15 · 7c9fdcfb1b64c47ed618c103b617af3f86e1239c y anteriores a 0ea5b0c7f212c2772d32c2b88287b89a9cdf6edd · 7c9fdcfb1b64c47ed618c103b617af3f86e1239c y anteriores a dd6afc6cab8c5d387d1ed2f069562ef7bdadd651 · 7c9fdcfb1b64c47ed618c103b617af3f86e1239c y anteriores a de942dd8c2c8358bcad04ce44271954c48924423 · 7c9fdcfb1b64c47ed618c103b617af3f86e1239c y anteriores a 2eed1e6a976a44015c3ee78841fe336796e2b21c · 7c9fdcfb1b64c47ed618c103b617af3f86e1239c y anteriores a a919c5c88769cf8fb3ec071e6078d830bf512489
- Linux Afectadas: 2.6.18 No afectadas: 6.1.191 · 6.6.157 · 6.12.109 · 6.18.50 · 7.2.4 · 7.3
Según el registro de la vulnerabilidad en CVE.org, tal como lo publicó el fabricante. Confirma tu versión exacta en el aviso del fabricante.
Referencias
- Referencia en git.kernel.orggit.kernel.org/stable/c/2188232509f1559cb8fcb0c9a4b1e04317fa0f15
- Referencia en git.kernel.orggit.kernel.org/stable/c/0ea5b0c7f212c2772d32c2b88287b89a9cdf6edd
- Referencia en git.kernel.orggit.kernel.org/stable/c/dd6afc6cab8c5d387d1ed2f069562ef7bdadd651
- Referencia en git.kernel.orggit.kernel.org/stable/c/de942dd8c2c8358bcad04ce44271954c48924423
- Referencia en git.kernel.orggit.kernel.org/stable/c/2eed1e6a976a44015c3ee78841fe336796e2b21c
- Referencia en git.kernel.orggit.kernel.org/stable/c/a919c5c88769cf8fb3ec071e6078d830bf512489
Ver el texto original en inglés (CVE.org)
SUNRPC: svcauth_gss: enforce krb5 token minimum length
In the Linux kernel, the following vulnerability has been resolved: SUNRPC: svcauth_gss: enforce krb5 token minimum length svcauth_gss_unwrap_priv() validates only an upper bound on the wire-supplied opaque length before handing the buffer to gss_unwrap(): if (len > xdr_stream_remaining(xdr)) goto unwrap_failed; offset = xdr_stream_pos(xdr); ... maj_stat = gss_unwrap(ctx, offset, offset + len, buf); The wire value `len` flows unchanged as the upper bound into the krb5 unwrap path, so a len in [0, 16] passes this check and is handed to gss_unwrap(). For a krb5 v2 context that lands in gss_krb5_unwrap_v2(), which reads the 16-byte RFC 4121 token header fields at ptr+4 and ptr+6 and then calls rotate_left() before any integrity check. With a sub-header length the header reads run past the token, and _rotate_left()'s `shift %= buf->len` path can divide by zero when buf->len has been driven to zero by the truncated token. A header-only token (len == 16) is equally invalid: with a non-zero RRC field and the opaque blob ending at the XDR buffer boundary, rotate_left() builds a zero-length subbuffer, reaching the same division. Reject the token at the server entry point before it reaches the krb5 unwrap core. A valid sealed RFC 4121 token must contain the 16-byte header plus at least some encrypted payload. Fix by adding a minimum-length check immediately after the existing upper-bound check: if (len <= GSS_KRB5_TOK_HDR_LEN) goto unwrap_failed;