{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-97611","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2026-09-24T16:01:01.158Z","datePublished":"2026-09-25T10:22:20.827Z","dateUpdated":"2026-10-03T11:00:13.021Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-10-03T11:00:13.021Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nnet: openvswitch: fix use-after-free of the flow table mask array\n\ntbl_mask_array_realloc() retires the old mask_array before it stops being\nreachable:\n\n\told = ovsl_dereference(tbl->mask_array);\n\tif (old) {\n\t\t...\n\t\tcall_rcu(&old->rcu, mask_array_rcu_cb);\n\t}\n\n\trcu_assign_pointer(tbl->mask_array, new);\n\ncall_rcu() only waits for read-side critical sections already in flight.\ntbl->mask_array still points at old between the call_rcu() and the\nrcu_assign_pointer(), so a reader entering ovs_flow_tbl_lookup_stats() in\nthat window picks up old in a fresh critical section that the pending\ngrace period does not cover.\n\ntbl_mask_array_realloc() runs in process context under ovs_mutex, so the\nwindow is preemptible and can outlast the grace period. Then\nmask_array_rcu_cb() frees old before the swap runs:\n\n  BUG: KASAN: slab-use-after-free in flow_lookup.constprop.0+0x2bf/0x2f0\n  Read of size 8 at addr ffff888020b3e018 by task poc/741\n   flow_lookup.constprop.0+0x2bf/0x2f0\n   ovs_flow_tbl_lookup_stats+0x4a3/0x5c0\n   ovs_dp_process_packet+0x19c/0x710\n   ovs_vport_receive+0x243/0x390\n   internal_dev_xmit+0x81/0x170\n  Freed by task 728:\n   kfree+0x16a/0x4e0\n   rcu_core+0x853/0x1030\n\nPublish the new array before retiring the old one. The kfree_rcu() that\ncall_rcu() replaced ran after the swap."}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:L - Both sides of the race are driven locally: tbl_mask_array_realloc() runs from OVS_FLOW_CMD_NEW/DEL generic-netlink requests (flow insert/remove growing or shrinking the mask array), and the reader is ovs_flow_tbl_lookup_stats() fed by the attacker's own packets via internal_dev_xmit. No remote protocol carries data that causes the bug.\nAC:L - The attacker controls both sides, looping flow add/delete to trigger reallocs while transmitting on the datapath's internal port so lookups run. Failed attempts are harmless, the preemptible window can outlast a grace period, and the reporter's KASAN trace shows a PoC hit it.\nPR:L - The OVS datapath, vport and flow genl ops are GENL_UNS_ADMIN_PERM with netnsok=true, so CAP_NET_ADMIN in a user namespace (unshare -Urn) is enough to create a datapath, add flows and send packets through it.\nUI:N - No victim action is needed; the attacker creates the datapath, drives mask-array reallocation and generates the lookup traffic entirely by themselves.\nS:U - The impact stays within the kernel's own security authority, as ordinary kernel memory corruption leading to local privilege escalation; no VM or hardware boundary is crossed.\nC:H - flow_lookup() reads the freed struct mask_array (max, masks[] pointers) and dereferences masks[i] as sw_flow_mask. If the slab is reclaimed with attacker data, that gives controlled-pointer reads of kernel memory.\nI:H - On a flow hit, flow_lookup() does stats->usage_cntrs[index]++ through ma->masks_usage_stats taken from the freed mask_array, so a reclaimed object yields an attacker-steered kernel memory increment (write primitive).\nA:H - The slab use-after-free in flow_lookup() during ovs_dp_process_packet crashes the kernel (KASAN-reported); with a reclaimed object, wild pointer dereferences cause an oops or panic."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["net/openvswitch/flow_table.c"],"versions":[{"version":"eac87c413bf9794c14d488998a5265ea5b32f04e","lessThan":"4c98b492e9ed63f9ca3e23566d9a6a4f235944f4","status":"affected","versionType":"git"},{"version":"eac87c413bf9794c14d488998a5265ea5b32f04e","lessThan":"4016ead17acd75312c066ecd47c4b7f0a81ceaa2","status":"affected","versionType":"git"},{"version":"eac87c413bf9794c14d488998a5265ea5b32f04e","lessThan":"017dbbf0d6c319a487f68e22f56d91fc787d5525","status":"affected","versionType":"git"},{"version":"eac87c413bf9794c14d488998a5265ea5b32f04e","lessThan":"76678217cdabc41e3c74c23b45b62086ffb8fe7a","status":"affected","versionType":"git"},{"version":"eac87c413bf9794c14d488998a5265ea5b32f04e","lessThan":"cd982e11684def5d4a9fcfd5354de09032828414","status":"affected","versionType":"git"},{"version":"eac87c413bf9794c14d488998a5265ea5b32f04e","lessThan":"a0d18d21d48a551f82ee344e50efb8a682161489","status":"affected","versionType":"git"},{"version":"eac87c413bf9794c14d488998a5265ea5b32f04e","lessThan":"035e9c3722067648a99010711d0ce81f42572ef4","status":"affected","versionType":"git"},{"version":"eac87c413bf9794c14d488998a5265ea5b32f04e","lessThan":"ba4ba11ed6eb8972c69070417fc27b48deb002e8","status":"affected","versionType":"git"}]},{"product":"Linux","vendor":"Linux","defaultStatus":"affected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["net/openvswitch/flow_table.c"],"versions":[{"version":"5.9","status":"affected"},{"version":"0","lessThan":"5.9","status":"unaffected","versionType":"semver"},{"version":"5.10.271","lessThanOrEqual":"5.10.*","status":"unaffected","versionType":"semver"},{"version":"5.15.222","lessThanOrEqual":"5.15.*","status":"unaffected","versionType":"semver"},{"version":"6.1.189","lessThanOrEqual":"6.1.*","status":"unaffected","versionType":"semver"},{"version":"6.6.158","lessThanOrEqual":"6.6.*","status":"unaffected","versionType":"semver"},{"version":"6.12.111","lessThanOrEqual":"6.12.*","status":"unaffected","versionType":"semver"},{"version":"6.18.53","lessThanOrEqual":"6.18.*","status":"unaffected","versionType":"semver"},{"version":"7.2.7","lessThanOrEqual":"7.2.*","status":"unaffected","versionType":"semver"},{"version":"7.3-rc3","lessThanOrEqual":"*","status":"unaffected","versionType":"original_commit_for_fix"}]}],"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.9","versionEndExcluding":"5.10.271"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.9","versionEndExcluding":"5.15.222"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.9","versionEndExcluding":"6.1.189"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.9","versionEndExcluding":"6.6.158"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.9","versionEndExcluding":"6.12.111"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.9","versionEndExcluding":"6.18.53"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.9","versionEndExcluding":"7.2.7"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.9","versionEndExcluding":"7.3-rc3"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/4c98b492e9ed63f9ca3e23566d9a6a4f235944f4"},{"url":"https://git.kernel.org/stable/c/4016ead17acd75312c066ecd47c4b7f0a81ceaa2"},{"url":"https://git.kernel.org/stable/c/017dbbf0d6c319a487f68e22f56d91fc787d5525"},{"url":"https://git.kernel.org/stable/c/76678217cdabc41e3c74c23b45b62086ffb8fe7a"},{"url":"https://git.kernel.org/stable/c/cd982e11684def5d4a9fcfd5354de09032828414"},{"url":"https://git.kernel.org/stable/c/a0d18d21d48a551f82ee344e50efb8a682161489"},{"url":"https://git.kernel.org/stable/c/035e9c3722067648a99010711d0ce81f42572ef4"},{"url":"https://git.kernel.org/stable/c/ba4ba11ed6eb8972c69070417fc27b48deb002e8"}],"title":"net: openvswitch: fix use-after-free of the flow table mask array","x_generator":{"engine":"bippy-1.2.0"}}}}