Overview
CVE-2026-72255High

A queued bridge packet could outlive its private routing data

Linux kernel · bridge netfilter · Published Sep 02, 2026

br_netfilter_rtable_init

AffectsUbuntu 26.04 · Linux 7.0.0-28 demo targetBridge netfilter with NFQUEUE

Artifactsexploit.mdpatch.diff

Summary

Bridge netfilter built a private routing object by filling in fields manually rather than using the normal initializer. The object therefore did not hold the bridge device alive when an NFQUEUE packet retained it.

The vulnerable construction dated to September 2014 and was fixed upstream in June 2026. The public exploit targeted Ubuntu 26.04 with Linux 7.0.0-28.

Why it mattered

A local attacker in a suitable network namespace could queue a bridge packet, delete the bridge, and then cause the queue to release or reinject the packet. Cleanup then touched routing data embedded in already-freed bridge memory.

The affected code has been fixed. The risk described here applies to unpatched kernels in the affected line, not automatically to every system using the named distribution today.

What went wrong

br_netfilter_rtable_init() did not call dst_init(), so the fake route lacked a device reference and teardown tracking. NFQUEUE could upgrade the packet’s route reference, but it pinned the enslaved port devices rather than the bridge master that owned this private route.

Exploit

Because the issue and its fixes are public, NebuSec’s validation code is included here for reproducibility. The preview starts at the program entry point and shows exactly 15 lines. Expanding it reveals the complete selected C file embedded in this page; build files, headers, helpers, and any additional sources remain in the linked CyberMeowfia directory.

Public exploit · patched target
CyberMeowfia snapshot4c1f0aa
Browse all files
Trigger and exploit entry point · 1205 linesOpen at main() ↗
trigger.c
int main(int argc, char **argv)
{
static const unsigned int pattern_length = sizeof("|/tmp/_nebusec") - 1;
static const unsigned int pattern_writes = sizeof("|/tmp/_nebusec");
(void)argc;
setvbuf(stdout, NULL, _IONBF, 0);
if (geteuid() == 0 && !strcmp(argv[0], "/tmp/_nebusec"))
return file_root_helper();
pin_cpu(0);
enter_unprivileged_user_net_mount_namespaces();
resolve_kernel_addresses();
start_cea_seeder();
for (pattern_index = 0; pattern_index < pattern_writes; pattern_index++) {

The selected file is the execution entry point. Build files, headers, leak helpers, and supporting sources remain in the linked CyberMeowfia directory.

Patch

Fixed upstream in June 2026. The corrected route initialization and lifetime rules keep bridge-owned routing data alive while queued packets can reference it. Apply the Ubuntu kernel update containing the June 2026 fix.

The safest check is the distribution’s own kernel changelog for CVE-2026-72255; version numbers alone can be misleading because vendors routinely backport security fixes without changing to the newest upstream kernel.

Find bugs in your code.

Before anyone else does.