CVE-2026-98952 (GCVE-0-2026-98952)
Vulnerability from cvelistv5
Published
2026-10-23 12:19
Modified
2026-10-24 14:09
Summary
In the Linux kernel, the following vulnerability has been resolved: pfcp: make sure the SEID is linear before reading it pfcp_encap_recv() only makes sure that the UDP header and the 4 byte PFCP header are in the linear area. When the S flag is set, pfcp_session_recv() then reads the 8 byte SEID that follows, which is not covered by the pskb_may_pull() check. A short PFCP packet with the S flag set, or one whose session header lies in a fragment, therefore makes pfcp_session_recv() read beyond the end of the packet data, and whatever it finds there is stored in the tunnel metadata that flower later classifies on. Pull up to the end of the SEID before reading it, and drop packets that are too short to contain it. Reload the header pointer afterwards since pskb_may_pull() may reallocate the skb head. Use offsetofend() rather than sizeof(struct pfcphdr_session): the structure is not packed, so its size is 16 bytes because of the alignment of the __be64 member, while the header on the wire is only 12 bytes, and valid session messages would be dropped.
Impacted products
Vendor Product Version
Linux Linux Version: 6dd514f48110ebb4bf36875b9e7e02d07b589caa
Version: 6dd514f48110ebb4bf36875b9e7e02d07b589caa
Version: 6dd514f48110ebb4bf36875b9e7e02d07b589caa
Version: 6dd514f48110ebb4bf36875b9e7e02d07b589caa
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "drivers/net/pfcp.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "3192a5e398c64d48aad64a09e29643e327369bc4",
              "status": "affected",
              "version": "6dd514f48110ebb4bf36875b9e7e02d07b589caa",
              "versionType": "git"
            },
            {
              "lessThan": "b18a6496495495e2dc27e525aa3315a0c59b9513",
              "status": "affected",
              "version": "6dd514f48110ebb4bf36875b9e7e02d07b589caa",
              "versionType": "git"
            },
            {
              "lessThan": "2fb6d05f706d79bbdc88835be2f4f45ab56dd819",
              "status": "affected",
              "version": "6dd514f48110ebb4bf36875b9e7e02d07b589caa",
              "versionType": "git"
            },
            {
              "lessThan": "23609bce9e1de525d1d0e73fc68c6e7971d0b49e",
              "status": "affected",
              "version": "6dd514f48110ebb4bf36875b9e7e02d07b589caa",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "drivers/net/pfcp.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "6.10"
            },
            {
              "lessThan": "6.10",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.113",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.18.*",
              "status": "unaffected",
              "version": "6.18.57",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "7.2.*",
              "status": "unaffected",
              "version": "7.2.11",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "7.3",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.12.113",
                  "versionStartIncluding": "6.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.57",
                  "versionStartIncluding": "6.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.11",
                  "versionStartIncluding": "6.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3",
                  "versionStartIncluding": "6.10",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\npfcp: make sure the SEID is linear before reading it\n\npfcp_encap_recv() only makes sure that the UDP header and the 4 byte\nPFCP header are in the linear area. When the S flag is set,\npfcp_session_recv() then reads the 8 byte SEID that follows, which is\nnot covered by the pskb_may_pull() check.\n\nA short PFCP packet with the S flag set, or one whose session header\nlies in a fragment, therefore makes pfcp_session_recv() read beyond the\nend of the packet data, and whatever it finds there is stored in the\ntunnel metadata that flower later classifies on.\n\nPull up to the end of the SEID before reading it, and drop packets\nthat are too short to contain it. Reload the header pointer afterwards\nsince pskb_may_pull() may reallocate the skb head.\n\nUse offsetofend() rather than sizeof(struct pfcphdr_session): the\nstructure is not packed, so its size is 16 bytes because of the\nalignment of the __be64 member, while the header on the wire is only 12\nbytes, and valid session messages would be dropped."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 7.3,
            "baseSeverity": "HIGH",
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L",
            "version": "3.1"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "AV:N - pfcp_create_sock() binds an unconnected AF_INET socket to INADDR_ANY:8805; an IPv4 PFCP request setting PFCP_SEID_FLAG follows udp_rcv() \u2192 udp_queue_rcv_one_skb() \u2192 pfcp_encap_recv() \u2192 pfcp_session_recv(), so the bytes causing the over-read arrive in a routable UDP message.\nAC:L - A sender needs only a 12\u201319-byte UDP/PFCP packet with PFCP_SEID_FLAG set, or a fragmented packet leaving the SEID non-linear; the original pskb_may_pull() covers only PFCP_HLEN, so pfcp_session_recv() deterministically reads the unpulled field without a race.\nPR:N - udp_sock_create4() binds PFCP_PORT without restricting a peer, and udp_queue_rcv_one_skb() invokes pfcp_encap_recv() after only packet-policy and checksum checks; neither it nor pfcp_session_recv() authenticates the sender. CAP_NET_ADMIN is needed only to configure the listening device.\nUI:N - pfcp_encap_recv() executes automatically in the UDP receive path when the crafted PFCP request reaches port 8805; no victim action is required after the PFCP interface is configured.\nS:U - The over-read, resulting per-skb tunnel metadata, and flower classification remain within the host kernel\u0027s networking security authority; no VM, IOMMU, or other authority boundary is crossed.\nC:L - pfcp_session_recv() copies exactly eight stale bytes beyond the short or non-linear packet data into pfcp_metadata.seid; fl_classify() then uses that value as an SEID key, permitting a bounded classification oracle rather than arbitrary-memory disclosure.\nI:L - The stale md-\u003eseid is copied by skb_flow_dissect_tunnel_info() into the flower key used by fl_classify(), so a session packet can take the wrong drop, redirect, or other action. There is no out-of-bounds write or control-flow primitive.\nA:L - The eight-byte read remains in allocated skb tailroom or skb_shared_info rather than furnishing a production-kernel fault; however, the false SEID can make fl_classify() drop or misdirect valid fragmented PFCP requests, limiting availability impact to packet or service degradation."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-10-24T14:09:37.815Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/3192a5e398c64d48aad64a09e29643e327369bc4"
        },
        {
          "url": "https://git.kernel.org/stable/c/b18a6496495495e2dc27e525aa3315a0c59b9513"
        },
        {
          "url": "https://git.kernel.org/stable/c/2fb6d05f706d79bbdc88835be2f4f45ab56dd819"
        },
        {
          "url": "https://git.kernel.org/stable/c/23609bce9e1de525d1d0e73fc68c6e7971d0b49e"
        }
      ],
      "title": "pfcp: make sure the SEID is linear before reading it",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-98952",
    "datePublished": "2026-10-23T12:19:12.127Z",
    "dateReserved": "2026-09-25T10:25:14.382Z",
    "dateUpdated": "2026-10-24T14:09:37.815Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}


Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Sightings

Author Source Type Date

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
  • Confirmed: The vulnerability is confirmed from an analyst perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
  • Patched: This vulnerability was successfully patched by the user reporting the sighting.
  • Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
  • Not confirmed: The user expresses doubt about the veracity of the vulnerability.
  • Not patched: This vulnerability was not successfully patched by the user reporting the sighting.


Loading…

Loading…