CVE-2026-89494 Overview
CVE-2026-89494 is a Linux kernel vulnerability in the Oracle Cluster File System 2 (OCFS2) distributed lock manager (DLM). The dlm_mig_lockres_handler function trusts several fields of a peer-supplied dlm_migratable_lockres structure without validation when handling a DLM_MIG_LOCKRES message. Any node in the DLM domain can send a crafted message that triggers both an out-of-bounds read leading to a BUG_ON panic and a heap out-of-bounds write into a fixed 32-byte o2dlm_lockname slab object.
Critical Impact
Any node in an OCFS2 cluster domain can panic peer nodes or corrupt kernel heap memory through unvalidated num_locks and lockname_len fields in DLM migration messages.
Affected Products
- Linux kernel with OCFS2 distributed lock manager enabled
- Distributions shipping vulnerable OCFS2 kernel modules across multiple stable branches
- Cluster deployments using OCFS2 shared storage on Linux
Discovery Timeline
- 2026-09-11 - CVE-2026-89494 published to the National Vulnerability Database
- 2026-09-14 - Last updated in NVD database
Technical Details for CVE-2026-89494
Vulnerability Analysis
The defect lives in the OCFS2 DLM recovery path, specifically dlm_mig_lockres_handler and its downstream callers dlm_process_recovery_data() and dlm_init_lockres(). A DLM_MIG_LOCKRES message carries a dlm_migratable_lockres header followed by a variable array of migratable_lock entries. The receiving node copies the message into a kmalloc(data_len) buffer and then walks mres->ml[0..num_locks) using the sender's declared count.
Because the receiver never verifies that data_len is large enough to contain num_locks entries, dlm_process_recovery_data() reads past the allocation. This out-of-bounds read terminates in a BUG_ON panic, taking the node offline. Separately, dlm_init_lockres() copies lockname_len bytes into a fixed 32-byte slab-allocated o2dlm_lockname object, producing a heap out-of-bounds write when the attacker sets lockname_len above DLM_LOCKID_NAME_MAX.
The not-joined error path compounds the issue by printing mres->lockname using %.*s with the attacker-controlled lockname_len, leaking adjacent kernel memory to logs.
Root Cause
The sending side bounds num_locks by DLM_MAX_MIGRATABLE_LOCKS and lockname_len by DLM_LOCKID_NAME_MAX, but the receiver treats these limits as trusted. No length validation occurs between dlm_grab() and the first use of the fields, so a malicious or corrupted peer can drive kernel code past allocation boundaries.
Attack Vector
Exploitation requires the ability to send DLM protocol traffic into the cluster domain, which any joined node can do. An attacker who compromises a single cluster member, or who reaches the DLM network with a spoofed peer, can send a crafted DLM_MIG_LOCKRES message. The result is either a remote kernel panic on the target node, denying service to shared OCFS2 storage, or an out-of-bounds heap write that may be leveraged for further memory corruption. No user interaction is required and the attack targets the kernel directly.
The vulnerability is documented in the upstream Linux kernel fixes, including Kernel Patch c/0e999d56917f and Kernel Patch c/b54e03d9b369.
Detection Methods for CVE-2026-89494
Indicators of Compromise
- Unexpected kernel BUG_ON panics on OCFS2 cluster nodes with stack traces referencing dlm_process_recovery_data or dlm_mig_lockres_handler.
- Slab corruption reports (KASAN, slub_debug) implicating the o2dlm_lockname cache.
- Kernel log entries printing garbled lockname strings from the DLM not-joined error path.
- Unexplained cluster node evictions or DLM recovery storms following inbound O2CB network activity.
Detection Strategies
- Enable KASAN or slub_debug=FZP on test kernels to surface out-of-bounds writes in the o2dlm_lockname cache before production impact.
- Correlate kernel panic telemetry across cluster nodes to distinguish coordinated exploitation from isolated hardware faults.
- Monitor O2CB DLM port traffic (default TCP 7777) for peers sending oversized messages relative to declared lock counts.
Monitoring Recommendations
- Ship kernel ring buffer logs to a centralized data lake and alert on BUG:, KASAN, or dlm_ stack traces from OCFS2 nodes.
- Track cluster membership changes and DLM recovery events for anomalous frequency indicative of node-level denial of service.
- Baseline inter-node DLM traffic volume and flag deviations that coincide with node crashes.
How to Mitigate CVE-2026-89494
Immediate Actions Required
- Apply the upstream kernel patches from the stable tree to all OCFS2 cluster members and reboot into the patched kernel.
- Restrict the O2CB heartbeat and DLM network to a dedicated, isolated cluster interconnect not reachable from general workloads.
- Audit which hosts are joined to each DLM domain and remove nodes that do not require shared OCFS2 access.
- Enforce strict host-based firewall rules limiting DLM port exposure to known cluster peers only.
Patch Information
Upstream Linux stable branches received fixes that validate lockname_len against DLM_LOCKID_NAME_MAX, num_locks against DLM_MAX_MIGRATABLE_LOCKS, and confirm the message payload is large enough for the declared lock entries before any use. Relevant commits include Kernel Patch c/4a5798253212, Kernel Patch c/50c4cc9183e, Kernel Patch c/77686fa5bba1, Kernel Patch c/a8facb1670b4, Kernel Patch c/dce05b17db86, and Kernel Patch c/f33041906885.
Workarounds
- Unload the ocfs2_dlm and ocfs2 modules on systems that do not require OCFS2 shared filesystems.
- Segment the cluster interconnect onto a private VLAN or VPC with peer allowlisting to prevent untrusted DLM peers from joining.
- Where OCFS2 must run unpatched, reduce blast radius by minimizing the number of nodes in each DLM domain.
# Verify OCFS2 modules are not loaded on hosts that do not need them
lsmod | grep -E 'ocfs2|o2cb|o2net'
# Blacklist the modules where OCFS2 is not required
cat >/etc/modprobe.d/blacklist-ocfs2.conf <<'EOF'
blacklist ocfs2
blacklist ocfs2_dlm
blacklist ocfs2_dlmfs
blacklist ocfs2_nodemanager
blacklist ocfs2_stack_o2cb
EOF
# Restrict the O2CB DLM port to known cluster peers only
iptables -A INPUT -p tcp --dport 7777 -s <cluster_peer_cidr> -j ACCEPT
iptables -A INPUT -p tcp --dport 7777 -j DROP
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

