« Volver al listado

CVE-2026-90302

Estado: RecibidaSin puntuar—

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

ocfs2: synchronize heartbeat callbacks with o2net teardown

Patch series "ocfs2: harden heartbeat teardown races".

This patch (of 2):

Heartbeat callbacks stay registered while configfs local-node teardown enters o2net_stop_listening(). A node-down event can still run through o2net_disconnect_node() and o2net_set_nn_state() while teardown is destroying o2net_wq, so the later queue/flush operations can hit a dead workqueue. KASAN has caught this as a slab-use-after-free in __queue_work() with the call chain:

queue_delayed_work_on o2net_set_nn_state o2net_disconnect_node o2net_hb_node_down_cb o2hb_run_event_list

Leer descripción completaMostrar menos

Keep heartbeat callbacks registered so quorum state still tracks node state, but stop them from driving o2net reconnect/disconnect work once local teardown starts. Mark the transport offline before destroying o2net_wq, wait for any in-flight heartbeat callback to finish, and delay bring-up replay until the new local node is published through o2nm_this_node().

The replay also has to stay serialized with heartbeat callback delivery. Otherwise a live-node snapshot can be copied, a real hb_down callback can install -ENOTCONN for a peer, and the stale replay can call o2net_hb_node_up() for that same peer and queue reconnect work even though heartbeat is already down.

The buggy scenario involves two paths, with each column showing the order within that path:

Detalles técnicos trazas, registros y código del informe original
This series fixes two OCFS2 heartbeat/o2net teardown races found by
KASAN.

KASAN slab-use-after-free in __queue_work+0x56/0xa90
Read of size 4
Call trace:
  dump_stack_lvl+0x66/0xa0
  print_report+0xce/0x630
  __queue_work+0x56/0xa90
  srso_alias_return_thunk+0x5/0xfbef5
  __virt_addr_valid+0x19f/0x330
  kasan_report+0xe0/0x110
  __queue_delayed_work+0x58/0x1e0
  queue_delayed_work_on+0xb4/0xc0
  o2net_set_nn_state+0x467/0x840
  o2net_disconnect_node+0x7b/0xe0
  o2net_hb_node_down_cb+0x54/0x60
  o2hb_run_event_list+0x236/0x2d0
  o2hb_check_slot+0xad4/0xbc0
  lock_release+0xc8/0x290
  o2hb_check_slot+0x9ea/0xbc0
  trace_hardirqs_on+0x18/0x130
  o2hb_do_disk_heartbeat+0x646/0xb30 (fs/ocfs2/cluster/heartbeat.c:1079)
  __lock_acquire+0x466/0x2260
  lockdep_hardirqs_on_prepare+0xea/0x1a0
  ktime_get_with_offset+0xe9/0x230
  o2hb_thread+0x14e/0x770
  kthread+0x1ad/0x1f0
  ret_from_fork+0x3c9/0x540
  __switch_to+0x2e9/0x730
  ret_from_fork_asm+0x1a/0x30
Allocated by task stack:
  kasan_save_stack+0x33/0x60
  kasan_save_track+0x14/0x30
  __kasan_kmalloc+0xaa/0xb0
  __kmalloc_noprof+0x292/0x760
  __alloc_workqueue+0x736/0xc60
  alloc_workqueue_noprof+0xb1/0x110
  o2net_start_listening+0xe5/0x430
  o2nm_node_local_store+0x184/0x310
  configfs_write_iter+0x18a/0x210
  vfs_write+0x469/0x810
  ksys_write+0xd2/0x170
  do_syscall_64+0x115/0x6a0 (arch/x86/entry/syscall_64.c:87)
  entry_SYSCALL_64_after_hwframe+0x77/0x7f
Freed by task stack:
  kasan_save_stack+0x33/0x60
  kasan_save_track+0x14/0x30
  kasan_save_free_info+0x3b/0x60
  __kasan_slab_free+0x5f/0x80
  kfree+0x313/0x590
  rcu_core+0x4f4/0x1320
  handle_softirqs+0x156/0x660

local-node teardown:                 heartbeat node-down callback:
1. configfs local-off enters         1. o2hb_run_event_list() invokes
   o2net_stop_listening().              o2net_hb_node_down_cb().
2. teardown heads for                2. the callback reaches
   destroy_workqueue(o2net_wq).         o2net_disconnect_node() and
                                        o2net_set_nn_state().
3. teardown destroys and NULLs       3. the callback flushes or queues
   o2net_wq.                            work through o2net_wq.

CVSS

NVD no ha asignado puntuación CVSS a esta CVE (habitual desde el cambio de política de abril de 2026).

Probabilidad de explotación (EPSS)

EPSS (Exploit Prediction Scoring System, de FIRST) estima la probabilidad de que una vulnerabilidad sea explotada en 30 días. Complementa a CVSS (impacto) y a CISA KEV (explotación confirmada).

Tecnologías afectadas (1)

⚠ Inferidas por IA a partir de la descripción — NVD aún no ha analizado esta CVE; no son CPE verificados.

Referencias

JSON original (NVD)

Mostrar
{
  "id": "CVE-2026-90302",
  "cveTags": [],
  "metrics": {},
  "affected": [
    {
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
      "affectedData": [
        {
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "product": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "98211489d4147e41b11703e4245846d60b3acce4",
              "lessThan": "7601db4c9d3bd9ab2482a863cb05204154d51ae8",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "98211489d4147e41b11703e4245846d60b3acce4",
              "lessThan": "fb61882e184ee5ca745806bc5b2a8483fa129bca",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "98211489d4147e41b11703e4245846d60b3acce4",
              "lessThan": "a03078a9a2a1c5e4a62f65d389c1f75f9898e21d",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "98211489d4147e41b11703e4245846d60b3acce4",
              "lessThan": "cbb4efc2f99d6a8dba09c96b10acad82da982cf9",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "98211489d4147e41b11703e4245846d60b3acce4",
              "lessThan": "8f96b78314cff0778a3466e49e5edbc1e459c95c",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "98211489d4147e41b11703e4245846d60b3acce4",
              "lessThan": "aee687a2fb36974dc37e4e0f5b03802067c6c4ec",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "98211489d4147e41b11703e4245846d60b3acce4",
              "lessThan": "073f51e39bed354452a057d38a4cc3952727c304",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "98211489d4147e41b11703e4245846d60b3acce4",
              "lessThan": "3e326f3bf16506873777444608e8b715aab74a7a",
              "versionType": "git"
            }
          ],
          "programFiles": [
            "fs/ocfs2/cluster/heartbeat.c",
            "fs/ocfs2/cluster/heartbeat.h",
            "fs/ocfs2/cluster/nodemanager.c",
            "fs/ocfs2/cluster/tcp.c",
            "fs/ocfs2/cluster/tcp.h"
          ],
          "defaultStatus": "unaffected"
        },
        {
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "product": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "2.6.16"
            },
            {
              "status": "unaffected",
              "version": "0",
              "lessThan": "2.6.16",
              "versionType": "semver"
            },
            {
              "status": "unaffected",
              "version": "5.10.270",
              "versionType": "semver",
              "lessThanOrEqual": "5.10.*"
            },
            {
              "status": "unaffected",
              "version": "5.15.221",
              "versionType": "semver",
              "lessThanOrEqual": "5.15.*"
            },
            {
              "status": "unaffected",
              "version": "6.1.188",
              "versionType": "semver",
              "lessThanOrEqual": "6.1.*"
            },
            {
              "status": "unaffected",
              "version": "6.6.157",
              "versionType": "semver",
              "lessThanOrEqual": "6.6.*"
            },
            {
              "status": "unaffected",
              "version": "6.12.110",
              "versionType": "semver",
              "lessThanOrEqual": "6.12.*"
            },
            {
              "status": "unaffected",
              "version": "6.18.52",
              "versionType": "semver",
              "lessThanOrEqual": "6.18.*"
            },
            {
              "status": "unaffected",
              "version": "7.2.6",
              "versionType": "semver",
              "lessThanOrEqual": "7.2.*"
            },
            {
              "status": "unaffected",
              "version": "7.3-rc1",
              "versionType": "original_commit_for_fix",
              "lessThanOrEqual": "*"
            }
          ],
          "programFiles": [
            "fs/ocfs2/cluster/heartbeat.c",
            "fs/ocfs2/cluster/heartbeat.h",
            "fs/ocfs2/cluster/nodemanager.c",
            "fs/ocfs2/cluster/tcp.c",
            "fs/ocfs2/cluster/tcp.h"
          ],
          "defaultStatus": "affected"
        }
      ]
    }
  ],
  "published": "2026-09-17T17:17:27.723",
  "references": [
    {
      "url": "https://git.kernel.org/stable/c/073f51e39bed354452a057d38a4cc3952727c304",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    },
    {
      "url": "https://git.kernel.org/stable/c/3e326f3bf16506873777444608e8b715aab74a7a",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    },
    {
      "url": "https://git.kernel.org/stable/c/7601db4c9d3bd9ab2482a863cb05204154d51ae8",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    },
    {
      "url": "https://git.kernel.org/stable/c/8f96b78314cff0778a3466e49e5edbc1e459c95c",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    },
    {
      "url": "https://git.kernel.org/stable/c/a03078a9a2a1c5e4a62f65d389c1f75f9898e21d",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    },
    {
      "url": "https://git.kernel.org/stable/c/aee687a2fb36974dc37e4e0f5b03802067c6c4ec",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    },
    {
      "url": "https://git.kernel.org/stable/c/cbb4efc2f99d6a8dba09c96b10acad82da982cf9",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    },
    {
      "url": "https://git.kernel.org/stable/c/fb61882e184ee5ca745806bc5b2a8483fa129bca",
      "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
    }
  ],
  "vulnStatus": "Received",
  "descriptions": [
    {
      "lang": "en",
      "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nocfs2: synchronize heartbeat callbacks with o2net teardown\n\nPatch series \"ocfs2: harden heartbeat teardown races\".\n\nThis series fixes two OCFS2 heartbeat/o2net teardown races found by\nKASAN.\n\n\nThis patch (of 2):\n\nHeartbeat callbacks stay registered while configfs local-node teardown\nenters o2net_stop_listening().  A node-down event can still run through\no2net_disconnect_node() and o2net_set_nn_state() while teardown is\ndestroying o2net_wq, so the later queue/flush operations can hit a dead\nworkqueue.  KASAN has caught this as a slab-use-after-free in\n__queue_work() with the call chain:\n\nKASAN slab-use-after-free in __queue_work+0x56/0xa90\nRead of size 4\nCall trace:\n  dump_stack_lvl+0x66/0xa0\n  print_report+0xce/0x630\n  __queue_work+0x56/0xa90\n  srso_alias_return_thunk+0x5/0xfbef5\n  __virt_addr_valid+0x19f/0x330\n  kasan_report+0xe0/0x110\n  __queue_delayed_work+0x58/0x1e0\n  queue_delayed_work_on+0xb4/0xc0\n  o2net_set_nn_state+0x467/0x840\n  o2net_disconnect_node+0x7b/0xe0\n  o2net_hb_node_down_cb+0x54/0x60\n  o2hb_run_event_list+0x236/0x2d0\n  o2hb_check_slot+0xad4/0xbc0\n  lock_release+0xc8/0x290\n  o2hb_check_slot+0x9ea/0xbc0\n  trace_hardirqs_on+0x18/0x130\n  o2hb_do_disk_heartbeat+0x646/0xb30 (fs/ocfs2/cluster/heartbeat.c:1079)\n  __lock_acquire+0x466/0x2260\n  lockdep_hardirqs_on_prepare+0xea/0x1a0\n  ktime_get_with_offset+0xe9/0x230\n  o2hb_thread+0x14e/0x770\n  kthread+0x1ad/0x1f0\n  ret_from_fork+0x3c9/0x540\n  __switch_to+0x2e9/0x730\n  ret_from_fork_asm+0x1a/0x30\nAllocated by task stack:\n  kasan_save_stack+0x33/0x60\n  kasan_save_track+0x14/0x30\n  __kasan_kmalloc+0xaa/0xb0\n  __kmalloc_noprof+0x292/0x760\n  __alloc_workqueue+0x736/0xc60\n  alloc_workqueue_noprof+0xb1/0x110\n  o2net_start_listening+0xe5/0x430\n  o2nm_node_local_store+0x184/0x310\n  configfs_write_iter+0x18a/0x210\n  vfs_write+0x469/0x810\n  ksys_write+0xd2/0x170\n  do_syscall_64+0x115/0x6a0 (arch/x86/entry/syscall_64.c:87)\n  entry_SYSCALL_64_after_hwframe+0x77/0x7f\nFreed by task stack:\n  kasan_save_stack+0x33/0x60\n  kasan_save_track+0x14/0x30\n  kasan_save_free_info+0x3b/0x60\n  __kasan_slab_free+0x5f/0x80\n  kfree+0x313/0x590\n  rcu_core+0x4f4/0x1320\n  handle_softirqs+0x156/0x660\n\nqueue_delayed_work_on\no2net_set_nn_state\no2net_disconnect_node\no2net_hb_node_down_cb\no2hb_run_event_list\n\nKeep heartbeat callbacks registered so quorum state still tracks node\nstate, but stop them from driving o2net reconnect/disconnect work once\nlocal teardown starts. Mark the transport offline before destroying\no2net_wq, wait for any in-flight heartbeat callback to finish, and delay\nbring-up replay until the new local node is published through\no2nm_this_node().\n\nThe replay also has to stay serialized with heartbeat callback delivery.\nOtherwise a live-node snapshot can be copied, a real hb_down callback\ncan install -ENOTCONN for a peer, and the stale replay can call\no2net_hb_node_up() for that same peer and queue reconnect work even\nthough heartbeat is already down.\n\nThe buggy scenario involves two paths, with each column showing the order\nwithin that path:\n\nlocal-node teardown:                 heartbeat node-down callback:\n1. configfs local-off enters         1. o2hb_run_event_list() invokes\n   o2net_stop_listening().              o2net_hb_node_down_cb().\n2. teardown heads for                2. the callback reaches\n   destroy_workqueue(o2net_wq).         o2net_disconnect_node() and\n                                        o2net_set_nn_state().\n3. teardown destroys and NULLs       3. the callback flushes or queues\n   o2net_wq.                            work through o2net_wq."
    }
  ],
  "lastModified": "2026-09-17T17:17:27.723",
  "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}