Skip to main content
CVE Vulnerability Database
Vulnerability Database/CVE-2026-68438

CVE-2026-68438: Linux Kernel Race Condition Vulnerability

CVE-2026-68438 is a race condition vulnerability in the Linux kernel's SMP call function that can cause system lockups when multiple CPUs access the same CSD concurrently. This article covers technical details, impact, and mitigations.

Published:

CVE-2026-68438 Overview

CVE-2026-68438 is a race condition in the Linux kernel's symmetric multiprocessing (SMP) subsystem. The flaw affects the smp_call_function_single() code path when CSD (Call Single Data) lock debugging is enabled. Multiple CPUs can concurrently prepare the same destination CPU's CSD structure, because the existing csd_lock() implementation uses a non-atomic read-modify-write to set CSD_FLAG_LOCK. Concurrent senders can enqueue the same llist node, producing a self-referential node->next pointer. The target CPU then loops indefinitely while walking call_single_queue, blocking subsequent synchronous work such as TLB shootdowns.

Critical Impact

The race can leave a CPU stuck traversing call_single_queue, causing soft-lockup warnings, stalled TLB shootdowns, and potential kernel panics on affected systems.

Affected Products

  • Linux kernel builds that include commit b0473dcd4b1d ("smp: Improve smp_call_function_single() CSD-lock diagnostics")
  • Kernel configurations with CSD lock debugging enabled (CONFIG_CSD_LOCK_WAIT_DEBUG)
  • Downstream distributions carrying the affected SMP code path

Discovery Timeline

  • 2026-08-12 - CVE-2026-68438 published to NVD
  • 2026-08-12 - Last updated in NVD database

Technical Details for CVE-2026-68438

Vulnerability Analysis

The Linux kernel uses smp_call_function_single() to run a callback on a specific remote CPU. Each request is described by a call_single_data_t (CSD) that holds the callback pointer, argument, and a flag word. A prior improvement, commit b0473dcd4b1d, changed the async no-wait path so that CSD lock debugging routes requests through the destination CPU's csd_data rather than caller-owned storage. That change improved diagnostics but broke the previous single-writer invariant that made csd_lock() safe.

With debugging enabled, multiple sender CPUs can now target the same per-CPU CSD simultaneously. csd_lock() waits for CSD_FLAG_LOCK to clear, then sets the bit using a non-atomic operation. Two senders can each observe the unlocked state, both set the flag, both overwrite the callback fields, and both attempt to enqueue the same llist node onto call_single_queue.

Root Cause

The root cause is an atomicity violation [CWE-Race Condition]. The lock acquisition performs a check followed by a separate write, without atomic compare-and-swap semantics. When the same destination CSD is shared by multiple remote senders, the non-atomic acquisition permits duplicate insertion of an llist node. Re-adding a node that is already the queue head causes node->next to reference itself, creating a cycle in the singly linked list.

Attack Vector

The defect is a reliability and denial-of-service condition triggered by concurrent kernel workloads that generate cross-CPU calls under a debug kernel. It is not a remote network attack vector. Exploitation requires the ability to induce concurrent smp_call_function_single() traffic targeting the same CPU on a kernel built with CSD lock debugging enabled. Successful triggering results in a hung CPU, stalled TLB shootdowns, soft-lockup warnings, or a panic.

The upstream fix retains the single csd_lock() implementation but acquires CSD_FLAG_LOCK with try_cmpxchg_acquire() when CSD lock debugging is enabled. This restores atomic ownership in the only configuration where the CSD can be shared by multiple senders while preserving the non-debug fast path. See the kernel commit 282d220bae5f and kernel commit 35551efb155e for the patch details.

Detection Methods for CVE-2026-68438

Indicators of Compromise

  • Kernel soft-lockup messages referencing smp_call_function_single, flush_smp_call_function_queue, or csd_lock_wait in dmesg and /var/log/messages.
  • CSD-lock diagnostic warnings identifying a stuck destination CPU with pending callbacks.
  • Stalled TLB shootdown warnings correlated with hung tasks on a single CPU.

Detection Strategies

  • Audit kernel build configuration for CONFIG_CSD_LOCK_WAIT_DEBUG=y on production hosts.
  • Correlate soft-lockup and hung-task events with concurrent workloads that heavily use smp_call_function_single() such as TLB flushes, perf events, and IPI-driven RCU work.
  • Compare running kernel versions against the fixed commits listed in the vendor advisory to identify unpatched systems.

Monitoring Recommendations

  • Ship dmesg, journald, and /var/log/messages to a centralized log platform and alert on soft lockup, csd:, and rcu_sched detected stalls patterns.
  • Track host uptime and unexpected reboots that follow kernel panic conditions.
  • Monitor node_exporter or equivalent metrics for sustained per-CPU stalls that align with CSD-lock timeouts.

How to Mitigate CVE-2026-68438

Immediate Actions Required

  • Inventory Linux hosts and identify kernels containing commit b0473dcd4b1d without the fix commits 282d220bae5f or 35551efb155e.
  • Apply the stable kernel update from your distribution vendor once available.
  • On unpatched debug kernels, disable CONFIG_CSD_LOCK_WAIT_DEBUG in the build configuration to eliminate the shared-CSD code path.

Patch Information

The upstream fix converts CSD lock acquisition to try_cmpxchg_acquire() when CSD-lock debugging is compiled in, restoring atomic ownership of CSD_FLAG_LOCK. Reference the mainline commits at git.kernel.org 282d220bae5f and git.kernel.org 35551efb155e. Apply the corresponding stable-tree backport for your kernel line.

Workarounds

  • Rebuild the kernel without CONFIG_CSD_LOCK_WAIT_DEBUG to bypass the affected shared-CSD path.
  • Restrict use of debug-enabled kernels to non-production environments until the patch is deployed.
  • Where feasible, reduce workloads that generate concurrent cross-CPU calls on the same target CPU while awaiting patch rollout.
bash
# Verify whether the running kernel enables CSD lock debugging
zgrep CONFIG_CSD_LOCK_WAIT_DEBUG /proc/config.gz 2>/dev/null || \
  grep CONFIG_CSD_LOCK_WAIT_DEBUG /boot/config-$(uname -r)

# Search kernel logs for CSD-lock and soft-lockup indicators
dmesg -T | grep -E 'csd:|soft lockup|smp_call_function'
journalctl -k --since "7 days ago" | grep -E 'csd:|soft lockup'

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Default Legacy - Prefooter | Experience the World’s Most Advanced Cybersecurity Platform

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.