CVE-2026-98641 (GCVE-0-2026-98641)

Vulnerability from cvelistv5 – Published: 2026-10-18 15:20 – Updated: 2026-10-19 09:23
VLAI
Title
bpf, arm64: set up the frame pointer for the exception callback
Summary
In the Linux kernel, the following vulnerability has been resolved: bpf, arm64: set up the frame pointer for the exception callback A program acting as exception boundary saves all callee-saved registers, so build_prologue() takes the exception_cb path and never calls push_callee_regs(). That is the only place find_used_callee_regs() runs, and with it the only place ctx->fp_used is set, so the callback prologue does not emit the mov x25, sp that points BPF_REG_FP at the frame the callback runs on. x25 keeps whatever it held when bpf_throw() was called. If the throw came from a subprogram that uses its own BPF stack, that is the subprogram's frame pointer, and since the subprogram never returns it never restores x25 either. Stack accesses through BPF_REG_FP are rewritten to be stack pointer relative, so those still land in the callback's own frame. Materializing the register does not: a callback that passes the address of a local variable to a helper hands over an address in the dead subprogram's frame. That address is below the callback's stack pointer by then, and the helper's own call chain covers it, so the helper can write over its own return address. 0x1234 below is the value the helper was asked to store: pc : 0x1234 lr : 0x1234 Call trace: 0x1234 (P) bpf_test_run+0x188/0x3e0 bpf_prog_test_run_skb+0x47c/0x998 __sys_bpf+0xbdc/0xdd8 Kernel panic - not syncing: Oops: Fatal exception in interrupt Set ctx->fp_used on the exception callback path so that the existing code further down sets x25 from the stack pointer. The epilogue restores it from the main program's save area along with the other callee-saved registers, as it already does. x86 sets the frame pointer for the callback from the argument it is passed, and powerpc computes it from the stack pointer.
Severity
No CVSS data available.
Assigner
Linux CNA under the mitre root
CNA scorecard D 53/100 over 6639 records in the last 180 days details
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: 5d4fa9ec5643a5c75d3c1e6abf50fb9284caf1ff , < ecdd770a9fc3eaf6c3127c5991312b84774a7b0f (git)
Affected: 5d4fa9ec5643a5c75d3c1e6abf50fb9284caf1ff , < b67b4c763f211e7a6391c356fef552e2ea63f08a (git)
Affected: 5d4fa9ec5643a5c75d3c1e6abf50fb9284caf1ff , < d7cd5ebe13989f265015910faa25e5d50faa4c22 (git)
Affected: 5d4fa9ec5643a5c75d3c1e6abf50fb9284caf1ff , < ef1fb82f12186dd26153b14d9fbcf4ec98db81b3 (git)
guessed Create a notification for this product.
Linux Linux Affected: 6.12
Unaffected: 0 , < 6.12 (semver)
Unaffected: 6.12.112 , ≤ 6.12.* (semver)
Unaffected: 6.18.55 , ≤ 6.18.* (semver)
Unaffected: 7.2.9 , ≤ 7.2.* (semver)
Unaffected: 7.3 , ≤ * (original_commit_for_fix)
guessed Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "arch/arm64/net/bpf_jit_comp.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "ecdd770a9fc3eaf6c3127c5991312b84774a7b0f",
              "status": "affected",
              "version": "5d4fa9ec5643a5c75d3c1e6abf50fb9284caf1ff",
              "versionType": "git"
            },
            {
              "lessThan": "b67b4c763f211e7a6391c356fef552e2ea63f08a",
              "status": "affected",
              "version": "5d4fa9ec5643a5c75d3c1e6abf50fb9284caf1ff",
              "versionType": "git"
            },
            {
              "lessThan": "d7cd5ebe13989f265015910faa25e5d50faa4c22",
              "status": "affected",
              "version": "5d4fa9ec5643a5c75d3c1e6abf50fb9284caf1ff",
              "versionType": "git"
            },
            {
              "lessThan": "ef1fb82f12186dd26153b14d9fbcf4ec98db81b3",
              "status": "affected",
              "version": "5d4fa9ec5643a5c75d3c1e6abf50fb9284caf1ff",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "arch/arm64/net/bpf_jit_comp.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "6.12"
            },
            {
              "lessThan": "6.12",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.112",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.18.*",
              "status": "unaffected",
              "version": "6.18.55",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "7.2.*",
              "status": "unaffected",
              "version": "7.2.9",
              "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.112",
                  "versionStartIncluding": "6.12",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.55",
                  "versionStartIncluding": "6.12",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.9",
                  "versionStartIncluding": "6.12",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3",
                  "versionStartIncluding": "6.12",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nbpf, arm64: set up the frame pointer for the exception callback\n\nA program acting as exception boundary saves all callee-saved registers,\nso build_prologue() takes the exception_cb path and never calls\npush_callee_regs(). That is the only place find_used_callee_regs() runs,\nand with it the only place ctx-\u003efp_used is set, so the callback prologue\ndoes not emit the\n\n  mov x25, sp\n\nthat points BPF_REG_FP at the frame the callback runs on. x25 keeps\nwhatever it held when bpf_throw() was called. If the throw came from a\nsubprogram that uses its own BPF stack, that is the subprogram\u0027s frame\npointer, and since the subprogram never returns it never restores x25\neither.\n\nStack accesses through BPF_REG_FP are rewritten to be stack pointer\nrelative, so those still land in the callback\u0027s own frame. Materializing\nthe register does not: a callback that passes the address of a local\nvariable to a helper hands over an address in the dead subprogram\u0027s\nframe. That address is below the callback\u0027s stack pointer by then, and\nthe helper\u0027s own call chain covers it, so the helper can write over its\nown return address. 0x1234 below is the value the helper was asked to\nstore:\n\n  pc : 0x1234\n  lr : 0x1234\n  Call trace:\n   0x1234 (P)\n   bpf_test_run+0x188/0x3e0\n   bpf_prog_test_run_skb+0x47c/0x998\n   __sys_bpf+0xbdc/0xdd8\n  Kernel panic - not syncing: Oops: Fatal exception in interrupt\n\nSet ctx-\u003efp_used on the exception callback path so that the existing code\nfurther down sets x25 from the stack pointer. The epilogue restores it\nfrom the main program\u0027s save area along with the other callee-saved\nregisters, as it already does. x86 sets the frame pointer for the\ncallback from the argument it is passed, and powerpc computes it from\nthe stack pointer."
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-10-19T09:23:10.965Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/ecdd770a9fc3eaf6c3127c5991312b84774a7b0f"
        },
        {
          "url": "https://git.kernel.org/stable/c/b67b4c763f211e7a6391c356fef552e2ea63f08a"
        },
        {
          "url": "https://git.kernel.org/stable/c/d7cd5ebe13989f265015910faa25e5d50faa4c22"
        },
        {
          "url": "https://git.kernel.org/stable/c/ef1fb82f12186dd26153b14d9fbcf4ec98db81b3"
        }
      ],
      "title": "bpf, arm64: set up the frame pointer for the exception callback",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-98641",
    "datePublished": "2026-10-18T15:20:12.730Z",
    "dateReserved": "2026-09-25T10:25:14.361Z",
    "dateUpdated": "2026-10-19T09:23:10.965Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-98641",
      "date": "2026-11-09",
      "epss": "0.00168",
      "percentile": "0.06101"
    },
    "microsoft_vex": {
      "current_release_date": "2026-10-21T18:43:09.000Z",
      "cve": "CVE-2026-98641",
      "id": "msrc_CVE-2026-98641",
      "initial_release_date": "2026-10-20T22:24:50.000Z",
      "product_status:under_investigation": "1",
      "source": "Microsoft CSAF VEX",
      "status": "final",
      "title": "bpf, arm64: set up the frame pointer for the exception callback",
      "url": "https://msrc.microsoft.com/csaf/vex/2026/msrc_cve-2026-98641.json",
      "version": "2"
    },
    "nvd": {
      "cve": {
        "affected": [
          {
            "affectedData": [
              {
                "defaultStatus": "unaffected",
                "product": "Linux",
                "programFiles": [
                  "arch/arm64/net/bpf_jit_comp.c"
                ],
                "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                "vendor": "Linux",
                "versions": [
                  {
                    "lessThan": "ecdd770a9fc3eaf6c3127c5991312b84774a7b0f",
                    "status": "affected",
                    "version": "5d4fa9ec5643a5c75d3c1e6abf50fb9284caf1ff",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "b67b4c763f211e7a6391c356fef552e2ea63f08a",
                    "status": "affected",
                    "version": "5d4fa9ec5643a5c75d3c1e6abf50fb9284caf1ff",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "d7cd5ebe13989f265015910faa25e5d50faa4c22",
                    "status": "affected",
                    "version": "5d4fa9ec5643a5c75d3c1e6abf50fb9284caf1ff",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "ef1fb82f12186dd26153b14d9fbcf4ec98db81b3",
                    "status": "affected",
                    "version": "5d4fa9ec5643a5c75d3c1e6abf50fb9284caf1ff",
                    "versionType": "git"
                  }
                ]
              },
              {
                "defaultStatus": "affected",
                "product": "Linux",
                "programFiles": [
                  "arch/arm64/net/bpf_jit_comp.c"
                ],
                "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                "vendor": "Linux",
                "versions": [
                  {
                    "status": "affected",
                    "version": "6.12"
                  },
                  {
                    "lessThan": "6.12",
                    "status": "unaffected",
                    "version": "0",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "6.12.*",
                    "status": "unaffected",
                    "version": "6.12.112",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "6.18.*",
                    "status": "unaffected",
                    "version": "6.18.55",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "7.2.*",
                    "status": "unaffected",
                    "version": "7.2.9",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "*",
                    "status": "unaffected",
                    "version": "7.3",
                    "versionType": "original_commit_for_fix"
                  }
                ]
              }
            ],
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
          }
        ],
        "cveTags": [],
        "descriptions": [
          {
            "lang": "en",
            "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nbpf, arm64: set up the frame pointer for the exception callback\n\nA program acting as exception boundary saves all callee-saved registers,\nso build_prologue() takes the exception_cb path and never calls\npush_callee_regs(). That is the only place find_used_callee_regs() runs,\nand with it the only place ctx-\u003efp_used is set, so the callback prologue\ndoes not emit the\n\n  mov x25, sp\n\nthat points BPF_REG_FP at the frame the callback runs on. x25 keeps\nwhatever it held when bpf_throw() was called. If the throw came from a\nsubprogram that uses its own BPF stack, that is the subprogram\u0027s frame\npointer, and since the subprogram never returns it never restores x25\neither.\n\nStack accesses through BPF_REG_FP are rewritten to be stack pointer\nrelative, so those still land in the callback\u0027s own frame. Materializing\nthe register does not: a callback that passes the address of a local\nvariable to a helper hands over an address in the dead subprogram\u0027s\nframe. That address is below the callback\u0027s stack pointer by then, and\nthe helper\u0027s own call chain covers it, so the helper can write over its\nown return address. 0x1234 below is the value the helper was asked to\nstore:\n\n  pc : 0x1234\n  lr : 0x1234\n  Call trace:\n   0x1234 (P)\n   bpf_test_run+0x188/0x3e0\n   bpf_prog_test_run_skb+0x47c/0x998\n   __sys_bpf+0xbdc/0xdd8\n  Kernel panic - not syncing: Oops: Fatal exception in interrupt\n\nSet ctx-\u003efp_used on the exception callback path so that the existing code\nfurther down sets x25 from the stack pointer. The epilogue restores it\nfrom the main program\u0027s save area along with the other callee-saved\nregisters, as it already does. x86 sets the frame pointer for the\ncallback from the argument it is passed, and powerpc computes it from\nthe stack pointer."
          }
        ],
        "id": "CVE-2026-98641",
        "lastModified": "2026-10-19T10:19:28.340",
        "metrics": {},
        "published": "2026-10-18T16:17:17.247",
        "references": [
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/b67b4c763f211e7a6391c356fef552e2ea63f08a"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/d7cd5ebe13989f265015910faa25e5d50faa4c22"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/ecdd770a9fc3eaf6c3127c5991312b84774a7b0f"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/ef1fb82f12186dd26153b14d9fbcf4ec98db81b3"
          }
        ],
        "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "vulnStatus": "Received"
      }
    },
    "redhat_vex": {
      "aggregate_severity": "Moderate",
      "current_release_date": "2026-11-07T11:31:15+00:00",
      "cve": "CVE-2026-98641",
      "id": "CVE-2026-98641",
      "initial_release_date": "2026-10-18T00:00:00+00:00",
      "product_status:known_affected": "110",
      "product_status:known_not_affected": "93",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: bpf, arm64: set up the frame pointer for the exception callback",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-98641.json",
      "version": "3"
    },
    "suse_vex": {
      "aggregate_severity": "moderate",
      "current_release_date": "2026-10-21T23:42:58Z",
      "cve": "CVE-2026-98641",
      "id": "CVE-2026-98641",
      "initial_release_date": "2026-10-21T23:42:58Z",
      "product_status:known_affected": "13",
      "product_status:known_not_affected": "335",
      "source": "SUSE CSAF VEX",
      "status": "interim",
      "title": "SUSE CVE CVE-2026-98641",
      "url": "https://ftp.suse.com/pub/projects/security/csaf-vex/2026/cve-2026-98641.json",
      "version": "2"
    }
  }
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Drag nodes to arrange them. Double-click a related vulnerability to open it, or a source to visit its link. The Physics button on the left tunes the layout and the simulation; the legend at the bottom left hides or shows nodes by kind and by sighting type.

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Vulnerability timeline

Sightings and recorded dates, grouped by day · UTC

JSON
How durations are calculated

Following the VTEM framework (Black Hat USA 2015), time to patch starts when the vendor or a coordinator was informed, total time to patch at discovery, and disclosure to patch at public disclosure; vendor response time runs from the report to its acknowledgement. Time to exploit and time unpatched start at the earliest discovery or report, falling back to public disclosure. Unpatched time ends at the first recorded patch, or the calculation time when no patch is recorded. Exploitation to patch shows the interval between those two events; a published proof of concept is a public exploit, not exploitation.

Each result shows its source dates. A negative interval means the end event came first; when date-only inputs leave the order open, the result says so. Date-only inputs are approximate. The earliest evidence wins: KEV report dates and sightings are labelled as such. Records describing another vulnerability are listed but never calculated from, and a PoC alone does not establish exploitation. Missing patch evidence does not prove that no patch exists. Filters below change the event list only.

Events included in the timeline

Loading timeline…


    Loading…

    Loading…

    Loading…

    Related by attack behaviour

    Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.