Overview
CVE-2026-74581High

A suppressed IPv6 route could be reused after it was freed

Linux kernel · IPv6 routing · Published Aug 19, 2026

fib6_rule_suppress

  • Fixed
  • Use-after-free
  • Namespace required
AffectsDebian 13 · Linux 6.12.101Fixed in Debian Linux 6.12.103

Artifactsexploit.mdpatch.diff

Summary

Linux could release an IPv6 route that a policy rule had suppressed, but accidentally leave the result pointing at that route. A later caller could then use the stale pointer after the route was freed.

The public exploit was validated against Debian 13 with Linux 6.12.101. The relevant Debian update is already available, so this page documents the former risk rather than announcing a currently unpatched issue.

Why it mattered

A local attacker able to administer a network namespace could arrange the policy rules and route lookups needed to disturb route reference counts. In the worst case, that stale reference could become kernel memory corruption 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

The suppression path called ip6_rt_put_flags() to drop the route, but did not clear res->rt6. When rule lookup later returned “not found,” a wrapper ignored that status and handed the non-null, already-released pointer to its caller.

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 · 1092 linesOpen at main() ↗
exploit.c
int main(int argc, char **argv)
{
int fd, udp_fd, success = 0, stale_results = 0;
int *target_udp_fds;
pid_t watcher;
unsigned int index;
unsigned int count = argc > 1 && argv[1][0] != '-' ?
strtoul(argv[1], NULL, 0) : 128;
unsigned int spray_pages = argc > 2 ? strtoul(argv[2], NULL, 0) : 4096;
unsigned int padding_count = argc > 3 ? strtoul(argv[3], NULL, 0) : 0;
int hold_on_hit = argc > 4 && strtoul(argv[4], NULL, 0);
unsigned int churn_count = argc > 5 ? strtoul(argv[5], NULL, 0) : 1024;
unsigned int changed_slots = 0;
struct in6_addr destination, padding_destination;
struct page_spray spray;

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 and backported to Debian Linux 6.12.103. The fix makes the suppressed result unusable after its reference is released. Debian carried the correction into kernel 6.12.103; systems on that version or a later vendor-fixed kernel do not need a workaround.

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