Saltar al contenido
CVE-2026-89542 Fuente: CVE.org Publicada · sin explotación confirmada

Vulnerabilidad de lectura fuera de límites en Linux kernel (SUNRPC)

Linux · Linux · Publicada en CVE.org el 11-09-2026 · Última actualización: 10-11-2026

Descripción

En el kernel de Linux, se resolvió la siguiente vulnerabilidad: SUNRPC: reforzar gss_krb5_unwrap_v2 frente a tokens cortos gss_krb5_unwrap_v2() lee los campos de encabezado EC y RRC en ptr+4 y ptr+6 antes de validar que el token tenga al menos GSS_KRB5_TOK_HDR_LEN (16) bytes, y su función auxiliar rotate_left() pasa buf->len - base a xdr_buf_subsegment() sin verificar que base <= buf->len. Cuando un llamador entrega un token de menos de 16 bytes, o un token cuyo len declarado deja base más allá del final del búfer, se producen tres fallas distintas: gss_krb5_unwrap_v2(offset, len, buf) ptr = buf->head[0].iov_base + offset ec = *(ptr + 4) /* OOB read on short head */ rrc = *(ptr + 6) /* OOB read on short head */ rotate_left(offset + 16, buf, rrc) xdr_buf_subsegment(buf, &subbuf, base, buf->len - base) /* u32 wrap when base > len */ _rotate_left(&subbuf, shift) shift %= buf->len /* divide-by-zero when base == len */ Después del descifrado, la aritmética de limpieza tiene la misma forma: movelen = min_t(unsigned int, buf->head[0].iov_len, len); movelen -= offset + GSS_KRB5_TOK_HDR_LEN + headskip; BUG_ON(offset + GSS_KRB5_TOK_HDR_LEN + headskip + movelen > buf->head[0].iov_len); El BUG_ON vuelve a sumar el valor recién restado, por lo que se reduce a min(A, B) > A y es permanentemente falso; no puede detectar el subdesbordamiento sin signo de movelen, que luego provoca un memmove() de ~UINT_MAX bytes. Se agregan cuatro protecciones de defensa en profundidad dentro del núcleo de unwrap para que sea seguro independientemente de lo que validen sus llamadores: - rechazar tokens con len - offset < GSS_KRB5_TOK_HDR_LEN antes de acceder a ptr+4/ptr+6; - salir de rotate_left() cuando buf->len <= base, cubriendo tanto el subdesbordamiento como los casos de longitud cero; - retornar anticipadamente de _rotate_left() cuando buf->len es cero, para que el módulo shift %= buf->len no falle; - reemplazar el BUG_ON inoperante por una verificación efectiva que retorna GSS_S_DEFECTIVE_TOKEN antes de la resta de movelen.

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: de9c17eb4a912c9028f7b470eb80815144883b26 y anteriores a 299d281c7225ded15b28cb861a98d818d82787fc · de9c17eb4a912c9028f7b470eb80815144883b26 y anteriores a 84ddbc8d084c0251d534f14f5d1a7da05be56404 · de9c17eb4a912c9028f7b470eb80815144883b26 y anteriores a 075d7cfc4df8c54cb202ba8b28420370c03ba9b6 · de9c17eb4a912c9028f7b470eb80815144883b26 y anteriores a f2591660e0eb263c9415bf0d0bb1b111e62df7a4 · de9c17eb4a912c9028f7b470eb80815144883b26 y anteriores a dddcb0f4b7e27fac16a78ea9a1c8ec2e8a241087 · de9c17eb4a912c9028f7b470eb80815144883b26 y anteriores a 806584a4b67a7233870c33e5b8f872e76dd02988 · de9c17eb4a912c9028f7b470eb80815144883b26 y anteriores a a7894e10572d53eb10109b8d07459cc8d3435811 · de9c17eb4a912c9028f7b470eb80815144883b26 y anteriores a 6959297aaa9572783d620a226d73c3fb94494888
  • Linux Afectadas: 2.6.35 No afectadas: 5.10.270 · 5.15.221 · 6.1.188 · 6.6.157 · 6.12.109 · 6.18.50

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

Ver el texto original en inglés (CVE.org)

SUNRPC: harden gss_krb5_unwrap_v2 against short tokens

In the Linux kernel, the following vulnerability has been resolved: SUNRPC: harden gss_krb5_unwrap_v2 against short tokens gss_krb5_unwrap_v2() reads the EC and RRC header fields at ptr+4 and ptr+6 before validating that the token is at least GSS_KRB5_TOK_HDR_LEN (16) bytes long, and its rotate_left() helper passes buf->len - base to xdr_buf_subsegment() without verifying that base <= buf->len. When a caller hands in a sub-16-byte token, or a token whose declared len leaves base past the end of the buffer, three distinct failures follow: gss_krb5_unwrap_v2(offset, len, buf) ptr = buf->head[0].iov_base + offset ec = *(ptr + 4) /* OOB read on short head */ rrc = *(ptr + 6) /* OOB read on short head */ rotate_left(offset + 16, buf, rrc) xdr_buf_subsegment(buf, &subbuf, base, buf->len - base) /* u32 wrap when base > len */ _rotate_left(&subbuf, shift) shift %= buf->len /* divide-by-zero when base == len */ After decryption, the cleanup arithmetic has the same shape: movelen = min_t(unsigned int, buf->head[0].iov_len, len); movelen -= offset + GSS_KRB5_TOK_HDR_LEN + headskip; BUG_ON(offset + GSS_KRB5_TOK_HDR_LEN + headskip + movelen > buf->head[0].iov_len); The BUG_ON re-adds the value just subtracted, so it reduces to min(A, B) > A and is permanently false; it cannot catch the unsigned underflow of movelen, which then drives a ~UINT_MAX-byte memmove(). Add four defense-in-depth guards inside the unwrap core so it is safe regardless of what its callers validate: - reject tokens with len - offset < GSS_KRB5_TOK_HDR_LEN before touching ptr+4/ptr+6; - bail from rotate_left() when buf->len <= base, covering both the underflow and zero-length cases; - return early from _rotate_left() when buf->len is zero, so the shift %= buf->len modulo cannot fault; - replace the dead BUG_ON with a live check that returns GSS_S_DEFECTIVE_TOKEN before the movelen subtraction.

Recibe el boletín cuando CISA agregue vulnerabilidades nuevas

Te escribimos solo cuando CISA agrega vulnerabilidades nuevas, ya traducidas: cada día que haya, o en un resumen los lunes. Confirmas por correo y te das de baja con un clic.

Frecuencia