{
  "cveId": "CVE-2026-99191",
  "url": "https://patchblox.com/security/cve/CVE-2026-99191",
  "summary": "CVE-2026-99191 is fixed in linux on 1 platform by DEBIAN-CVE-2026-99191 (version 6.12.115-2), released November 3, 2026. It is not reported as exploited. Patch Radar priority: Routine.",
  "title": "calipso: keep BIG TCP payload_len in calipso_skbuff_setattr()",
  "description": "In the Linux kernel, the following vulnerability has been resolved:  calipso: keep BIG TCP payload_len in calipso_skbuff_setattr()  calipso_skbuff_setattr() adjusts payload_len by the length of the option it inserts or resizes:  \tpayload = ntohs(ip6_hdr-\u003Epayload_len); \tip6_hdr-\u003Epayload_len = htons(payload \u002B len_delta);  GRO can build BIG TCP packets larger than IPV6_MAXPLEN, and stores payload_len == 0 for them; ipv6_payload_len() then falls back to skb-\u003Elen.  For such a packet forwarded to a destination mapped to CALIPSO, the code above writes len_delta (or 65536 \u002B len_delta when shrinking) into payload_len, and ipv6_payload_len() no longer falls back to skb-\u003Elen.  nf_tables, conntrack and sch_cake rely on it.  The same arithmetic also wraps when a packet grows past IPV6_MAXPLEN, and a BIG TCP packet that shrinks below IPV6_MAXPLEN should get its real length back.  Set payload_len from the skb length with ipv6_set_payload_len(), which stores 0 above IPV6_MAXPLEN and the real length otherwise, as ipv6_gro_complete() does.  The network header was just reset to skb-\u003Edata, so skb-\u003Elen - sizeof(*ip6_hdr) is the payload length.  Tested on one kernel (arm64, QEMU) with SELinux permissive, a minimal mdp-generated policy (network_peer_controls=1), \u0022netlabelctl calipso add pass doi:16\u0022 and a NetLabel mapping of fd00:2::/64 to CALIPSO DOI 16.  calipso_skbuff_setattr() was called through netlbl_skbuff_setattr() from a test-only debugfs hook (not part of this patch) adding a level-only label; payload_len after the call:    case                         before fix   after fix   real length   1000, unlabeled                    1016        1016          1016   70000 GSO, payload_len 0             16           0         70016   65530 GSO, grows past MAXPLEN        10           0         65546   65540 GSO with a 24 byte hop   header, shrinks below MAXPLEN     65528       65532         65532   1000 with a 24 byte hop header      992         992           992  (0 means ipv6_payload_len() returns the real length.)  On the forward path, with a client injecting unlabeled UDP through a router to a server, the router adds the CALIPSO option and the server delivers all datagrams (Udp6InDatagrams 5, Ip6InTruncatedPkts 0) with this patch.",
  "published": "2026-10-28T11:17:40Z",
  "severity": "Moderate",
  "cvss": 6.5,
  "epss": 0.00174,
  "epssPercentile": 0.06925,
  "priority": "Routine",
  "priorityTier": 4,
  "exploited": false,
  "vendorExploited": false,
  "disclosed": false,
  "vendorAdvisory": "https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-99191",
  "fixes": [
    {
      "platform": "linux",
      "product": "linux",
      "release": "Debian 13.5 (trixie)",
      "fixedVersion": "6.12.115-2",
      "fix": "DEBIAN-CVE-2026-99191",
      "url": "https://patchblox.com/security/fix/linux/debian-cve-2026-99191",
      "released": "2026-11-03T18:58:21Z"
    }
  ],
  "noFixYet": [],
  "dataAsOf": "2026-11-08T00:53:09Z",
  "attribution": {
    "text": "Data: Patchblox Patch Radar",
    "url": "https://patchblox.com/security/patch-radar",
    "terms": "https://patchblox.com/security/patch-radar/use-the-data"
  }
}