CVE-2026-89551

CVE-2026-89551

Critical · published September 12, 2026

CVSS v3.1
9.8
EPSS
1%
Percentile
42.9
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

SUNRPC: xdr_buf_trim: clamp buf->len to avoid underflow

xdr_buf_trim() trims `len` bytes from the tail of an xdr_buf by

walking the tail, pages, and head iovecs. Each per-section step

uses min_t() so it never removes more bytes than that section

holds, but the final accounting at the fix_len label subtracts the

total bytes actually consumed from buf->len without any clamp:

fix_len:

buf->len -= (len - trim);

When the caller has set buf->len to a value smaller than the sum

of the iov_lens, (len - trim) can exceed buf->len and the unsigned

subtraction wraps to near UINT_MAX. gss_krb5_unwrap_v2() reaches

xdr_buf_trim() in exactly that state:

buf->head[0].iov_len -= GSS_KRB5_TOK_HDR_LEN + headskip;

buf->len = len - (GSS_KRB5_TOK_HDR_LEN + headskip);

xdr_buf_trim(buf, ec + GSS_KRB5_TOK_HDR_LEN + tailskip);

buf->len is a small wire-derived value while the iov_lens are at

page scale, so the per-section loops legitimately consume far more

bytes than buf->len records. The wrapped buf->len then propagates

as the authoritative stream bound into every downstream XDR

decoder.

Fix by clamping the decrement so buf->len bottoms out at zero:

buf->len -= min_t(unsigned int, buf->len, len - trim);

On the normal path where the iov_lens sum to buf->len, (len - trim)

is always <= buf->len and the result is identical to before. No

callers change behavior outside the underflow case.

The record
Technical detail
CVSS v3.1
9.8 · CRITICAL
Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00514 · 42.9th percentile
Published
2026-09-12T00:19Z
References (8)
EPSS history
Timeline
  • 13 SEP 03:23Z
    EPSS moved — → 0%
    epss
  • 11 SEP 19:44Z
    SUNRPC: xdr_buf_trim: clamp buf->len to avoid underflow
    cvelistv5