Description
On the Zephyr ARM port, enabling the hardware FPU (CONFIG_FPU) forces the "Floating point ABI" choice, which defaults to CONFIG_FP_HARDABI. Both FP_HARDABI and FP_SOFTABI permit the compiler to emit hardware FP instructions in any function, even code that never uses floating-point types. However, the callee-saved FP registers (s16-s31 / d8-d15) are only saved and restored across a context switch when CONFIG_FPU_SHARING is enabled (arch/arm/core/cortex_m/swap_helper.S and arch/arm/core/cortex_a_r/swap_helper.S), and prior to this fix selecting an ABI did not enable FPU register sharing, which defaults off.

In a build that enables the FPU with the default ABI but leaves CONFIG_FPU_SHARING disabled, the kernel preserves no callee-saved FP register state across thread switches. The documented precondition for this "unshared" mode — that only a single thread ever executes FP instructions — is silently violated because the compiler may generate FP instructions in every thread.

Under CONFIG_USERSPACE, where threads are mutually isolated, this becomes an information-disclosure boundary crossing: a victim thread can leave secret-derived values in s16-s31, and a co-resident unprivileged thread can read those registers directly (FP register access is not privilege-gated), recovering data left behind by another thread. Without userspace the same defect causes cross-thread FP state corruption (a correctness fault). The leak is bounded to the 16 callee-saved single-precision registers and is opportunistic, so impact is low.

The fix makes FP_HARDABI and FP_SOFTABI select CONFIG_FPU_SHARING and tags every thread with K_FP_REGS at creation, so callee-saved FP state is always preserved across context switches whenever the compiler may emit FP instructions.
Published: 2026-08-11
Score: 3.6 Low
EPSS: n/a
KEV: No
Impact: n/a
Action: n/a
AI Analysis

Impact

Enabling the ARM hardware FPU in Zephyr without FPU register sharing causes the system to leave the 16 callee‑saved single‑precision registers (s16‑s31) in an inconsistent state during context switches. When a thread that uses floating‑point instructions finishes, the kernel does not save those register values, and a subsequent thread can read them. In a userspace configuration, the read is performed by an unrelated unprivileged thread, producing an information disclosure that is limited to the contents of those registers. The flaw corresponds to CWE-200 and, due to its confined scope and opportunistic nature, has a low impact rating. The vulnerability does not corrupt data or crash the system when userspace is disabled; it only leads to cross‑thread state corruption that can cause correctness faults.

Affected Systems

Any Zephyr RTOS build for ARM that has CONFIG_FPU enabled while CONFIG_FPU_SHARING remains disabled, using the default hard‑ABI floating‑point configuration. Older releases prior to the commit that introduces automatic FPU sharing are especially susceptible.

Risk and Exploitability

The CVSS score of 3.6 indicates a low severity risk. No EPSS value is available, and the vulnerability is not listed in the CISA KEV catalog, which suggests that exploitation is not widespread. The attack requires a local context where an attacker can run an unprivileged thread on the same hardware, and the attacker must know that the target thread has used FP instructions. Because the leakage is tied to the 16 callee‑saved registers, the amount of recoverable information is small and dependent on the victim’s use of floating‑point data. Consequently, the likelihood of exploitation is limited, although the knowledge of a code path that writes to these registers could allow a targeted attack.

Generated by OpenCVE AI on August 11, 2026 at 06:22 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Apply the Zephyr patch that turns on CONFIG_FPU_SHARING automatically when CONFIG_FPU is enabled or upgrade to a release that includes this fix.
  • Configure your build to set CONFIG_FPU_SHARING=y so that the kernel preserves all callee‑saved FP registers during context switches.
  • If a patch or upgrade is not feasible, disable CONFIG_FPU or avoid using any floating‑point instructions in user threads so that the unshared mode does not expose register contents.

Generated by OpenCVE AI on August 11, 2026 at 06:22 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Tue, 11 Aug 2026 06:45:00 +0000

Type Values Removed Values Added
First Time appeared Zephyrproject
Zephyrproject zephyr
Vendors & Products Zephyrproject
Zephyrproject zephyr

Tue, 11 Aug 2026 05:15:00 +0000

Type Values Removed Values Added
Description On the Zephyr ARM port, enabling the hardware FPU (CONFIG_FPU) forces the "Floating point ABI" choice, which defaults to CONFIG_FP_HARDABI. Both FP_HARDABI and FP_SOFTABI permit the compiler to emit hardware FP instructions in any function, even code that never uses floating-point types. However, the callee-saved FP registers (s16-s31 / d8-d15) are only saved and restored across a context switch when CONFIG_FPU_SHARING is enabled (arch/arm/core/cortex_m/swap_helper.S and arch/arm/core/cortex_a_r/swap_helper.S), and prior to this fix selecting an ABI did not enable FPU register sharing, which defaults off. In a build that enables the FPU with the default ABI but leaves CONFIG_FPU_SHARING disabled, the kernel preserves no callee-saved FP register state across thread switches. The documented precondition for this "unshared" mode — that only a single thread ever executes FP instructions — is silently violated because the compiler may generate FP instructions in every thread. Under CONFIG_USERSPACE, where threads are mutually isolated, this becomes an information-disclosure boundary crossing: a victim thread can leave secret-derived values in s16-s31, and a co-resident unprivileged thread can read those registers directly (FP register access is not privilege-gated), recovering data left behind by another thread. Without userspace the same defect causes cross-thread FP state corruption (a correctness fault). The leak is bounded to the 16 callee-saved single-precision registers and is opportunistic, so impact is low. The fix makes FP_HARDABI and FP_SOFTABI select CONFIG_FPU_SHARING and tags every thread with K_FP_REGS at creation, so callee-saved FP state is always preserved across context switches whenever the compiler may emit FP instructions.
Title Cross-thread FPU register leak on ARM when FPU enabled without register sharing
Weaknesses CWE-200
References
Metrics cvssV3_1

{'score': 3.6, 'vector': 'CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:N'}


Subscriptions

Zephyrproject Zephyr
cve-icon MITRE

Status: PUBLISHED

Assigner: zephyr

Published:

Updated: 2026-08-11T04:56:59.359Z

Reserved: 2026-06-11T14:04:09.251Z

Link: CVE-2026-11985

cve-icon Vulnrichment

No data.

cve-icon NVD

No data.

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-08-11T06:30:06Z

Weaknesses
  • CWE-200

    Exposure of Sensitive Information to an Unauthorized Actor