data built 2026-10-19T13:16:53Z

Look up another CVE · open CVE-2026-98398 in the interactive tracker

CVE-2026-98398

locking/lockdep: Invalidate stale class_cache entries for zapped classes

EPSS 0.2%

Published 2026-10-14 (4 days ago) by the Linux kernel CNA. Subsystem kernel/locking. Debian urgency: not yet assigned.

Debian does not build this code. The per-release build detail is under "Where it lives" below.

What to do, per Debian release

Debian's own status for CVE-2026-98398 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source

ReleaseStatus VersionWhat this means
Debian 12bookwormfixedDLA-4841-1 · 2026-10-17 · text6.1.190-1Update the kernel and reboot. DLA-4841-1 shipped the fix on 2026-10-17, in 6.1.190-1. A running kernel keeps the old code until the machine restarts.
Debian 13trixiefixed6.12.111-1Update the kernel and reboot. Fixed in 6.12.111-1. A running kernel keeps the old code until the machine restarts.
Debian 14forkyfixed7.2.7-1Update the kernel and reboot. Fixed in 7.2.7-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed7.2.7-1Update the kernel and reboot. Fixed in 7.2.7-1. A running kernel keeps the old code until the machine restarts.

The vulnerability

What the bug is

syzbot reported a lockdep splat hitting DEBUG_LOCKS_WARN_ON(1) in hlock_class() due to an invalid class_idx: WARNING: kernel/locking/lockdep.c:238 at __lock_acquire+0x382/0x2cf0 kernel/locking/lockdep.c:5203 Workqueue: wg-crypt-wg0 wg_packet_tx_worker RIP: 0010:hlock_class kernel/locking/lockdep.c:238 [inline] RIP: 0010:check_wait_context kernel/locking/lockdep.c:4870 [inline] RIP: 0010:__lock_acquire+0x389/0x2cf0 kernel/locking/lockdep.c:5203 Call Trace: <IRQ> lock_acquire+0x106/0x350 kernel/locking/lockdep.c:5886 _raw_spin_lock+0x2e/0x40 kernel/locking/spinlock.c:173 tcp_tsq_handler+0x29/0x200 net/ipv4/tcp_output.c:1291 tcp_tsq_workfn+0x384/0x410 net/ipv4/tcp_output.c:1325 ... When a lock class is zapped (e.g. during module unload or key unregistration), zap_class() clears the class's bit in lock_classes_in_use and removes it from the class hash table. However, existing lockdep_map instances embedded in data structures may still retain a pointer to the zapped class in their class_cache[] array. When __lock_acquire() subsequently runs on such a lock, it finds lock->class_cache[subclass] != NULL, skipping register_lock_class() and assigning hlock->class_idx to the index of the zapped class. When check_wait_context() or hlock_class() inspects the held_lock, it finds !test_bit(class_idx, lock_classes_in_use) and warns. Furthermore, if the zapped slot is subsequently re-allocated to an unrelated lock key, the stale class_cache entry would erroneously match the unrelated class (ABA issue). Add lock_class_cache_is_valid() to validate that the cached class is within lock_classes bounds, still allocated in lock_classes_in_use (using uninstrumented arch_test_bit() in __always_inline context so it is safe in noinstr contexts like match_held_lock()), and that class->key matches the expected subkey (taking lockdep_set_subclass() overrides into account). Also use READ_ONCE()/WRITE_ONCE() when accessing class_cache[]. If the entry is invalid or stale, fall back to register_lock_class() / look_up_lock_class().

Where it lives

The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.

kernel/locking/lockdep.c

What this is
LOCKING PRIMITIVESMAINTAINERS section matched on kernel/locking/ · linux-kernel@vger.kernel.org · Maintained
Kernel module
none to look for. The file would have gone into lockdep, and Debian does not compile it into that module, so finding lockdep in lsmod would say nothing about this CVE.

Check it on the machine

grep -w CONFIG_LOCKDEP /boot/config-$(uname -r)

Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.

Show whether Debian builds this, per release

Debian does not build this code. In 4 releases below, every kernel flavour Debian publishes has the switch off, so the vulnerable file is compiled into no kernel binary Debian ships.

  • bookworm, trixie, forky, sidn
n
not enabled on any flavour - this release does not build the code
Build switch
CONFIG_LOCKDEP

From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages

Signals

Published
2026-10-14 (4 days ago)source
CVSS
no vector published, unrated
Attack vector
not published
EPSS
0.21%, higher than 11.1% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
not yet assignedsource
Subsystem
kernel/locking

Upstream fixes

The versions the CNA records as introducing and fixing this, and the commit for each. source

IntroducedFixed inCommit
5.15.15.222f8a1281ab82d
5.16.1.1891c9d664e2e06
5.16.6.1586bc345f6d81e
5.16.12.111f63c86e9d267
5.16.18.53c7acfb04c7e2
5.17.2.7baa320fbb2f9
5.17.302c6be7d675b

Debian advisories

AdvisoryDateShipped toDebian
DLA-4841-12026-10-17bookworm 6.1.190-1tracker

Why the CNA scored it this way

The kernel CNA published no CVSS vector and no reasoning for CVE-2026-98398, which is why it is shown as unrated rather than given an invented score. 6,405 of the 20,413 CVEs here carry reasoning; this is not one of them.