Overview
CVE-2026-52912High

A queued bridge packet could outlive the bridge that owned it

Linux kernel · bridge netfilter · Published Aug 22, 2026

br_pass_frame_up

AffectsFedora 44 · Linux 6.19.10-300 demo targetBridge netfilter with NFQUEUE

Artifactsexploit.mdpatch.diff

Summary

A bridge packet sent to an NFQUEUE could keep a pointer to the bridge device without keeping that device alive. Deleting the bridge while the packet waited in userspace left the queued packet pointing at freed kernel memory.

The public exploit was validated on Fedora 44 with Linux 6.19.10-300, including SELinux and randomized kernel allocation caches. The issue was fixed upstream in May 2026.

Why it mattered

A local attacker with access to a network namespace could queue a bridge-local packet, remove the bridge, and then resume processing. That lifecycle gap could be turned from a crash into kernel memory reuse and local privilege escalation.

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_pass_frame_up() changed skb->dev to the bridge master before invoking netfilter. NFQUEUE retained references to the hook input device, but not to the different bridge device stored in the packet, so teardown was free to release it.

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
Exploit entry point · 1042 linesOpen at main() ↗
exploit.c
int main(int argc, char **argv)
{
if (argc == 2 && !strcmp(argv[1], "--worker"))
return worker_main();
setvbuf(stdout, NULL, _IONBF, 0);
drop_to_nobody_if_root();
for (int attempt = 1; attempt <= 3; attempt++) {
pid_t child = fork();
int status;
if (child < 0)
die("fork(worker)");
if (!child) {
execl("/proc/self/exe", "exploit", "--worker", NULL);
_exit(127);
}

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 May 2026. The fixed path preserves the device lifetime for queued packets. Distribution kernel updates are the primary remedy; where an update is delayed, avoiding bridge NFQUEUE rules in attacker-controlled namespaces removes the demonstrated path.

The safest check is the distribution’s own kernel changelog for CVE-2026-52912; 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.