Skip to main content

Linux Kernel CVE-2026-63825

| EUVDEUVD-2026-45491 CRITICAL
2026-07-19 Linux GHSA-xc4c-7263-hq9r
9.8
CVSS 3.1 · Vendor: Linux
Share

Severity by source

Vendor (Linux) PRIMARY
9.8 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
vuln.today AI
6.5 MEDIUM

Network-reachable via IPComp with no auth (AV:N/PR:N/UI:N), but a timing-dependent multi-CPU race on a non-default GCOV build makes AC:H; impact is primarily crash (A:H) with limited uncontrolled corruption (I:L), no disclosure (C:N).

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

Primary rating from Vendor (Linux).

CVSS VectorVendor: Linux

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

Lifecycle Timeline

5
Analysis Generated
Jul 20, 2026 - 15:44 vuln.today
CVSS changed
Jul 20, 2026 - 15:22 NVD
9.8 (CRITICAL)
Patch available
Jul 19, 2026 - 14:17 EUVD
CVE Published
Jul 19, 2026 - 12:02 cve.org
CRITICAL 9.8
CVE Published
Jul 19, 2026 - 12:02 cve.org
UNKNOWN (no severity yet)

DescriptionCVE.org

In the Linux kernel, the following vulnerability has been resolved:

gcov: use atomic counter updates to fix concurrent access crashes

GCC's GCOV instrumentation can merge global branch counters with loop induction variables as an optimization. In inflate_fast(), the inner copy loops get transformed so that the GCOV counter value is loaded multiple times to compute the loop base address, start index, and end bound. Since GCOV counters are global (not per-CPU), concurrent execution on different CPUs causes the counter to change between loads, producing inconsistent values and out-of-bounds memory writes.

The crash manifests during IPComp (IP Payload Compression) processing when inflate_fast() runs concurrently on multiple CPUs:

BUG: unable to handle page fault for address: ffffd0a3c0902ffa RIP: inflate_fast+1431 Call Trace: zlib_inflate __deflate_decompress crypto_comp_decompress ipcomp_decompress [xfrm_ipcomp] ipcomp_input [xfrm_ipcomp] xfrm_input

At the crash point, the compiler generated three loads from the same global GCOV counter (__gcov0.inflate_fast+216) to compute base, start, and end for an indexed loop. Another CPU modified the counter between loads, making the values inconsistent - the write went 3.4 MB past a 65 KB buffer.

Add -fprofile-update=prefer-atomic to CFLAGS_GCOV at the global level in the top-level Makefile, guarded by a try-run compile test. The test compiles a minimal program with and without -fprofile-update=prefer-atomic using the full KBUILD_CFLAGS, then compares undefined symbols in the resulting object files. If prefer-atomic introduces new undefined references (such as __atomic_fetch_add_8 on i386 or __aarch64_ldadd8_relax on arm64 with outline-atomics), the flag is not added -- the kernel does not link against libatomic.

On architectures where GCC inlines 64-bit atomic counter updates (x86_64, s390, ...) the test passes and the flag is enabled, preventing the compiler from merging counters with loop induction variables and fixing the observed concurrent-access crash.

On architectures where the flag would introduce libatomic dependencies, it is silently omitted and behaviour is no worse than before this patch.

Move the CFLAGS_GCOV block from its original position (before the arch Makefile include) to after the core KBUILD_CFLAGS assignments but before the scripts/Makefile.gcc-plugins include. This placement ensures the try-run test sees arch-specific flags (-m32, -march=, -mno-outline-atomics) while avoiding GCC plugin flags (-fplugin=) that would break the test on clean builds when plugin shared objects do not yet exist.

AnalysisAI

Out-of-bounds memory writes in the Linux kernel's gcov code-coverage instrumentation can corrupt memory and crash the system when inflate_fast() (zlib decompression) runs concurrently on multiple CPUs, most notably during IPComp/IPsec (xfrm_input) packet decompression. GCC merges the global GCOV branch counter with loop induction variables, so simultaneous execution reloads the shared counter mid-loop and computes an index that wrote ~3.4 MB past a 65 KB buffer. This only affects kernels built with GCOV profiling enabled; there is no public exploit identified at time of analysis and EPSS is very low (0.17%).

Technical ContextAI

The affected component is the kernel build's GCOV (GCC coverage) instrumentation, not zlib itself. When CONFIG_GCOV_KERNEL/GCOV profiling is compiled in, GCC inserts global branch counters (e.g. __gcov0.inflate_fast). As an optimization the compiler can fold a global counter into a hot loop's induction variable, emitting multiple loads of the same global to derive the loop base, start index, and end bound. Because GCOV counters are global rather than per-CPU, there is no synchronization: two CPUs executing the instrumented inflate_fast() concurrently race on the shared 64-bit counter, so the three loads observe inconsistent values and the loop indexes far outside the destination buffer. This is a classic data-race / concurrent-access class issue (no CWE assigned in the feed). The fix adds -fprofile-update=prefer-atomic to CFLAGS_GCOV (guarded by a try-run test so architectures lacking inlined 64-bit atomics, e.g. i386/arm64 outline-atomics, are skipped to avoid a libatomic dependency), forcing atomic counter updates on x86_64, s390, etc.

RemediationAI

Vendor-released patch: upgrade to Linux 6.18.38, 7.1.3, or later (7.2-rc1 in the development branch), which add -fprofile-update=prefer-atomic to CFLAGS_GCOV via the top-level Makefile try-run test; apply the corresponding stable commits from git.kernel.org (49d893b9, 5b959c1d, 56cb9b7d). Because the bug only manifests with coverage instrumentation, the most direct and no-cost compensating control is to build/run kernels with GCOV disabled (unset CONFIG_GCOV_KERNEL) - production and distro kernels already ship this way, so no action is needed for them; the trade-off is loss of kernel code-coverage data for developers. If you must run an instrumented kernel before patching, restrict or disable IPComp/IPsec compression (the observed trigger) to remove the concurrent inflate_fast() path, at the cost of losing payload compression on those tunnels. See https://nvd.nist.gov/vuln/detail/CVE-2026-63825 for references.

Vendor StatusVendor

SUSE

Severity: Important
Product Status
SUSE Linux Enterprise Desktop 15 SP7 Affected
SUSE Linux Enterprise Desktop 15 SP7 Affected
SUSE Linux Enterprise High Availability Extension 15 SP7 Affected
SUSE Linux Enterprise High Availability Extension 15 SP7 Affected
SUSE Linux Enterprise High Availability Extension 16.0 Affected

Share

CVE-2026-63825 vulnerability details – vuln.today

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