Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain low-privilege eBPF load access
-
DeliveryCraft program with divergent verifier paths
-
ExploitVerifier omits zero-extension (zext_dst) marking
-
ExecutionInject arbitrary upper-half register value on s390
-
ImpactCorrupt kernel memory and escalate privileges
Vulnerability Assessment
| Exploitation Conditions | Exploitation requires the ability to load an eBPF program into the kernel - in practice CAP_BPF/CAP_SYS_ADMIN, or a system where unprivileged eBPF is permitted (kernel.unprivileged_bpf_disabled=0) - matching the CVSS PR:L/AV:L. The concrete trigger is a program whose verifier state diverges so that a checkpoint is reached on a path where a register's upper half was not initialized, causing the verifier to skip the zext_dst marking. The impact is materially limited to the s390 architecture, where the JIT depends on the verifier emitting explicit zero extension; on other architectures the practical security impact is substantially reduced. Limiting factors: local access only, a privilege/configuration prerequisite for BPF loading, and architecture dependency (s390). |
| Impact | Signals are largely concordant toward moderate, not emergency, priority. The CVSS 3.1 vector (AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H, 7.8 HIGH) describes a locally-triggered, low-privilege memory-safety flaw with full CIA impact, consistent with kernel-level compromise. EPSS is low at 0.15% (4th percentile), the CVE is NOT on CISA KEV, and no public exploit is referenced, so there is no evidence of active or imminent widespread exploitation. The vuln.today decision label is 'this_week', which reflects a fix-promptly posture rather than act_now/emergency. A key scoping caveat the raw CVSS does not capture: the description states the defect manifests on the s390 architecture, where the JIT relies on the verifier emitting explicit zero extension - on other architectures the practical impact is far smaller. The CVSS vector's local vector and low-privilege requirement are consistent with the exploitation model (loading a crafted eBPF program), but the input provides no CWE (N/A) and no attacker-controlled-trigger detail beyond the verifier-path race between a checkpoint and register use. Net: a genuine kernel correctness/memory-safety bug worth patching on the next cycle, but current real-world risk is tempered by architecture scoping, the privilege prerequisite for BPF loading, low EPSS, and absence of KEV/PoC. |
| Exploit ScenarioDerived | A local attacker able to load eBPF programs (e.g., with CAP_BPF/CAP_SYS_ADMIN, or where unprivileged BPF is enabled) crafts a program with two verification paths so that a verifier state checkpoint is hit on a path where a register's upper half is uninitialized, causing the verifier to omit the zext_dst marking. On s390 this lets the program inject an arbitrary value into the upper half of a 64-bit register, corrupting kernel state. No public exploit is referenced, so this remains a theoretical-but-plausible local escalation path. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 24, 2026
The BPF verifier's zero-extension tracking in the Linux kernel can lose track of a register's upper 32 bits across verifier state checkpoints, allowing a loaded eBPF program to leave an arbitrary value in the upper half of a register instead of the zero-extended value BPF semantics require. Exploitation requires the ability to load an eBPF program into the kernel - CAP_BPF/CAP_SYS_ADMIN or a system with unprivileged eBPF enabled - consistent with the assessed CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H vector, and the practical security impact is materially limited to s390, where the JIT depends on the verifier emitting explicit zero extension before 32-bit operations. No public exploit has been identified at time of analysis, EPSS is 0.15% (4th percentile), and the kernel fix is available upstream as commit 7ce090afbf725e25fff29caacce1eaf8459b1117; priority signals are largely concordant toward moderate, 'this week' handling rather than emergency response.
RemediationAI
Vendor-released patch: kernel commit 7ce090afbf725e25fff29caacce1eaf8459b1117 ('bpf: Infer zext_dst based on static register liveness analysis'), available from the stable tree at https://git.kernel.org/stable/c/7ce090afbf725e25fff29caacce1eaf8459b1117 - update to a kernel build that contains this commit (the corresponding stable release for your branch, or a distribution kernel that backports it). No fixed release version number beyond the commit identifier is given in the supplied data, so confirm the version mapping with your vendor or the stable branch changelog before upgrading. Until the patched kernel is deployed, note that reaching the flaw requires the ability to load an eBPF program, so limiting that surface - keeping CAP_BPF/CAP_SYS_ADMIN restricted to trusted workloads and, where the workload mix permits, setting kernel.unprivileged_bpf_disabled=1 to bar unprivileged program loads - reduces exposure, at the cost of breaking legitimate unprivileged BPF tooling and any workloads that depend on it. Vendor advisory tracking is at https://vuldb.com/vuln/424845 and https://nvd.nist.gov/vuln/detail/CVE-2026-98869. Given the local prerequisite, architecture dependency (s390) and 0.15% EPSS, treating this as 'this week' remediation rather than an emergency is consistent with the available signals.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
This is a correctness flaw in the in-kernel eBPF verifier's handling of 32-bit ALU operations. Per BPF semantics, an operation such as 'w1 += 1' must zero-extend the upper half of r1, and the s390 JIT relies on the verifier inserting an explicit zero extension to guarantee that. The verifier previously minimized these insertions by recording, per verifier state, a subreg_def field whenever an instruction defined only the low 32 bits, and then setting the instruction-auxiliary zext_dst flag via mark_insn_zext() when a whole-register read was verified; a later pass (bpf_opt_subreg_zext_lo32_rnd_hi32()) materialized the zero extensions. That mechanism depended on state-local bookkeeping plus the REG_LIVE_READ32/REG_LIVE_READ64 liveness flags and propagate_liveness() calling mark_insn_zext(). The referenced commit 107e16979905 ('bpf: disable and remove registers chain based liveness') removed that liveness step, making it possible for a register's upper half to be defined and used on one verification path, a checkpoint to be created in between, and a second path that reaches the same checkpoint without the upper half being initialized to therefore miss the zext_dst marking. The fix replaces the subreg_def logic with a static computation performed as part of bpf_compute_live_registers(): upper and lower register halves are tracked separately, and an instruction that defines a 32-bit subregister but not the full register is marked zext_dst when the upper half is live afterwards. The patch deliberately trades precision for a BPF subprogram call, presuming all 64 bits of parameter registers are used. The trigger is not further described in the available sources and no CWE identifier was assigned.
Know when the next one hits your stack
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Local eBPF-load access needed, so AV:L and PR:L; crafting a divergent-path program is reliable (AC:L); kernel register corruption yields high C/I/A within an unchanged scope.
Primary rating from Vendor (Linux).
CVSS VectorVendor: Linux
Lifecycle Timeline
4DescriptionCVE.org
In the Linux kernel, the following vulnerability has been resolved:
bpf: Infer zext_dst based on static register liveness analysis
As reported in the thread [1], the verifier's 32-bit operations zero extension logic is broken. This logic is responsible for correct semantics of 32-bit operations on s390 architecture.
According to BPF semantics, operation w1 += 1 is supposed to zero extend the upper half of the register r1. On s390 the JIT relies on the verifier emitting explicit zero extension before such operations.
The verifier attempts to minimize the amount of zero extensions inserted by tracking whether upper halves of the 64-bit registers are ever used. Previously such tracking worked as follows:
- bpf_reg_state->subreg_def field was set by do_check_insn()
for each operation defining lower but not the upper halves of the register.
- Whenever an operation reading the whole register was verified,
the verifier checked register's subreg_def and set bpf_insn_aux_data->zext_dst flag as true via a call to mark_insn_zext() function.
- After the verification was complete, a special pass
bpf_opt_subreg_zext_lo32_rnd_hi32() extended 32-bit operations with bpf_insn_aux_data->zext_dst set as true by adding explicit zero extension.
Note that the logic above relies on bpf_reg_state->subreg_def, which is a property of a current verifier state. Before the commit [2] two additional steps happened:
- The verifier tracked upper and lower register halves' liveness as
flags REG_LIVE_READ{32,64} in bpf_reg_state->live.
- The function propagate_liveness() called mark_insn_zext()
in order to transfer the knowledge about which registers have their upper halves alive (and thus might require zero extension).
The commit [2] removed the two steps described above, hence making possible a situation like below:
- The register's upper half is set and is used on some verification
path P1 and the register happens not to be marked as precise.
- The checkpoint C is created while processing some instruction
between register initialization and usage.
- On some other verification path P2 the register's upper half is not
initialized and that path ends hitting the checkpoint C.
- In such a case the register's initialization on path P2 would lack
zext_dst mark, making it possible for the program to inject an arbitrary value in the register's upper half.
This commit replaces subreg_def based logic with computing zext_dst statically, as a part of the bpf_compute_live_registers() analysis:
- The analysis now tracks usage of upper and lower halves of the
registers separately.
- If some instruction defines a 32-bit subregister, but not the whole
register, *and* the upper half of the register is alive after that instruction, the instruction is marked as zext_dst.
There is one notable drop in precision: whenever a BPF subprogram is called, all 64 bits of parameter registers are presumed to be used. The assumption is that such a drop in precision would not inflict a noticeable performance penalty.
[1] https://lore.kernel.org/bpf/CAGKGUv=sOuqQtA1Ub-5JXfA4FPosJFYKAQE4B79cK+P1erxqtg@mail.gmail.com/ [2] commit 107e16979905 ("bpf: disable and remove registers chain based liveness")
Executive ViewAI
A high-severity flaw in the Linux kernel's eBPF verifier, CVE-2026-98869, could allow a privileged local user to bypass security checks, potentially leading to full system compromise. The risk is concentrated on IBM Z (s390) systems, where the issue could enable privilege escalation and data integrity loss, affecting mainframe-dependent operations.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Code injection occurs when an application accepts user input and passes it directly into a language interpreter or evaluator without proper sanitization.
EUVD-2026-107288
GHSA-m2xx-ffwm-822c
NVD
CVE.org
EPSS
VulDB
Exploit-DB