Skip to main content

Linux Kernel EUVDEUVD-2026-107288

| CVE-2026-98869 HIGH
2026-10-21 Linux GHSA-m2xx-ffwm-822c
7.8
CVSS 3.1 · Vendor: Linux
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain low-privilege eBPF load access
  2. Delivery
    Craft program with divergent verifier paths
  3. Exploit
    Verifier omits zero-extension (zext_dst) marking
  4. Execution
    Inject arbitrary upper-half register value on s390
  5. Impact
    Corrupt 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

Linux patch: 0
Linux patch: 7.3
Linux 6.18
Linux 107e169799057bc6a379ddb625cbe1e51cfc7d72 <7ce090afbf725e25fff29caacce1eaf8459b1117

Affected Packages

euvd linux no fix

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

Vendor (Linux) PRIMARY 7.8 HIGH
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
vuln.today AI 7.8 HIGH

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.

3.1 AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
4.0 AV:L/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (Linux).

CVSS VectorVendor: Linux

Attack Vector
Local
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

Lifecycle Timeline

4
CVSS changed
Oct 24, 2026 - 14:22 NVD
7.8 (HIGH)
Patch available
Oct 21, 2026 - 16:02 EUVD
CVE Published
Oct 21, 2026 - 14:55 cve.org
HIGH 7.8
CVE Published
Oct 21, 2026 - 14:55 cve.org
UNKNOWN (no severity yet)

DescriptionCVE.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

Why It Matters

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.

Business Impact: Medium
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.2%
Top 96% exploitable
Prevalence
Low
Flaw manifests on s390 mainframe architecture; niche real-world footprint
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Defer
Exploitation· derived
None
System Exposure· derived
Small
Automatable· derived
No
Human Impact
Medium

Priority Score

39
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +39
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Code Injection CRITICAL

Code injection occurs when an application accepts user input and passes it directly into a language interpreter or evaluator without proper sanitization.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy