CVE-2026-64047

net: tls: fix off-by-one in sg_chain entry count for wrapped sk_msg ring

State
Published
Severity
9.8 Critical
Published
Jul 19, 2026
Updated
Oct 19, 2026
Reserved
Jul 19, 2026

Read the record on cve.org

Description

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

net: tls: fix off-by-one in sg_chain entry count for wrapped sk_msg ring

When an sk_msg scatterlist ring wraps (sg.end < sg.start), tls_push_record() chains the tail portion of the ring to the head using sg_chain(). An extra entry in the sg array is reserved for this:

struct sk_msg_sg { [...] /* The extra two elements: * 1) used for chaining the front and sections when the list becomes * partitioned (e.g. end < start). The crypto APIs require the * chaining; * 2) to chain tailer SG entries after the message. */ struct scatterlist data[MAX_MSG_FRAGS + 2];

The current code uses MAX_SKB_FRAGS + 1 as the ring size:

sg_chain(&msg_pl->sg.data[msg_pl->sg.start], MAX_SKB_FRAGS - msg_pl->sg.start + 1, msg_pl->sg.data);

This places the chain pointer at

sg_chain(data[start], (MAX_SKB_FRAGS - msg_start + 1) .. = &data[start] + (MAX_SKB_FRAGS - msg_start + 1) - 1 = data[start + (MAX_SKB_FRAGS - start + 1) - 1] = data[MAX_SKB_FRAGS]

instead of the true last entry. This is likely due to a "race" of the commit under Fixes landing close to commit 031097d9e079 ("bpf: sk_msg, zap ingress queue on psock down")

Convert to ARRAY_SIZE and drop the data[start] / - start (as suggested by Sabrina).

Scores

CVSSScoreVectorSource
3.19.8 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HLinux

Weaknesses

  • CWE-191 Integer Underflow (Wrap or Wraparound)

Affected Products

ProductVersions
LinuxLinux
  • 9aaaa56845a06aeabdd597cbe19492dc01f281ec to before 73963a375885d5ccb7def39fd0b4f542e0f343ddAffected
  • 9aaaa56845a06aeabdd597cbe19492dc01f281ec to before 47110c3a9ac247b688657337f5981efcfcb240dcAffected
  • 9aaaa56845a06aeabdd597cbe19492dc01f281ec to before 84158c2997159df4a0d70cd9c46774512d32a522Affected
  • 9aaaa56845a06aeabdd597cbe19492dc01f281ec to before 131ef12057d92b77b636321b7849c69222405a97Affected
  • 9aaaa56845a06aeabdd597cbe19492dc01f281ec to before 66339b71f105e6f83e0da3b9583d95077534fe1dAffected
  • 9aaaa56845a06aeabdd597cbe19492dc01f281ec to before eca989eab4b2599dcb02f72140a7c08f08838520Affected
  • 9aaaa56845a06aeabdd597cbe19492dc01f281ec to before 2fb0dc7e0099686c4e9d2732745d8a31b18c3628Affected
  • 9aaaa56845a06aeabdd597cbe19492dc01f281ec to before 285943c6e7ca309bbea84b253745154241d9788aAffected
  • d529d6c9f7e3aaeac13c4948f79799ccb825f29dAffected
  • 5.4.14 to before 5.5Affected
LinuxLinux
  • 5.5Affected
  • before 5.5Not affected
  • 5.10.258 through 5.10.*Not affected
  • 5.15.209 through 5.15.*Not affected
  • 6.1.175 through 6.1.*Not affected
  • 6.6.142 through 6.6.*Not affected
  • 6.12.92 through 6.12.*Not affected
  • 6.18.34 through 6.18.*Not affected
  • 7.0.11 through 7.0.*Not affected
  • 7.1 and laterNot affected

References

Every record here comes from the CVE Program’s CVE List. © 1999–2026 The MITRE Corporation. CVE is a registered trademark of The MITRE Corporation. The records are reproduced under the CVE Program terms of use.