FKIE_CVE-2026-98641
Vulnerability from fkie_nvd - Published: 2026-10-18 16:17 - Updated: 2026-10-19 10:19
Severity
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.
References
Impacted products
| Vendor | Product | Version |
|---|
{
"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"
}
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.
Experimental. This forecast is provided for visualization only and may change without notice. Do not use it for operational decisions.
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
Loading timeline…
Loading…
Loading…
The MITRE ATT&CK techniques below are AI-generated suggestions, inferred from the description of the
vulnerability by the CIRCL/vulnerability-attack-technique-classification-roberta-base
model, served locally by ML-Gateway.
They have not been verified by an analyst and are provided for guidance only.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
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.