Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-41285-OpenBSD-v6daemons-go-brrr — One IPv6 ND option with length zero. One missing check. Daemon walks backward and lives in the loop. Reported to OpenBSD, fixed, CVE assigned. | Kitploit
Tools/GitHubGitHub/rat5ak/cve-2026-41285-openbsd-v6daemons-go-brrr
Vulnerability AnalysisExploitationFuzzingNetwork SecurityWireless Security
GitHubrat5ak/cve-2026-41285-openbsd-v6daemons-go-brrr

CVE-2026-41285-OpenBSD-v6daemons-go-brrr

One IPv6 ND option with length zero. One missing check. Daemon walks backward and lives in the loop. Reported to OpenBSD, fixed, CVE assigned.

View Repository
64 months agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-41285: One Packet Kills IPv6 on OpenBSD

One crafted ICMPv6 packet from the local network permanently hangs slaacd and/or rad. IPv6 SLAAC address autoconfiguration dies until someone manually restarts the daemon. No auth, no privileges, 18 bytes of ICMPv6 payload.

CVECVE-2026-41285
Bug classInfinite loop via integer underflow
Root causeND option parser does nd_opt_len * 8 - 2 without checking len==0
Componentsbin/slaacd/engine.c, usr.sbin/rad/engine.c
ImpactPermanent DoS of IPv6 SLAAC (slaacd) or RA service (rad)
RequiredAny device on the same L2 network segment
TestedOpenBSD 7.8 GENERIC amd64

The Bug

RFC 4861 §4.6 says ND options with length zero are invalid and must be silently discarded. The kernel's own nd6_options() in sys/netinet6/nd6.c does this correctly. But the raw ICMPv6 packet still gets delivered to userland sockets before that check matters.

slaacd and rad both parse ND options themselves. The loop looks like:

root@kitploit:~
while (len > 0) {
    // ...
    optlen = nd_opt->nd_opt_len * 8 - 2;  // nd_opt_len is uint8_t
    if (optlen > len)
        break;
    len += 2;
    // advance pointer by optlen... which is (uint32_t)-2 promoted from int
}

When nd_opt_len == 0: the expression 0 * 8 - 2 promotes to int → -2. The guard (-2 > len) is always false (signed comparison, len is positive). Then len += 2 and the pointer goes back by 2 bytes. Loop never advances. CPU pegs at 100%. Forever.

The kernel validated its own copy. The userland daemon got the raw original. Nobody told slaacd.

Impact

  • One packet → slaacd engine stuck in infinite loop at 100% CPU
  • All subsequent RAs ignored → no new SLAAC addresses configured
  • Existing addresses eventually expire (lifetime runs out, no renewal)
  • IPv6 connectivity degrades to dead on all interfaces managed by slaacd
  • Same attack against rad: one crafted RS kills RA service for the link
  • Recovery requires manual rcctl restart slaacd or reboot

PoC

root@kitploit:~
python3 poc/kill_slaacd.py <interface>

Requires scapy. Sends one Router Advertisement with a single ND option where nd_opt_len = 0. That's it. The option type doesn't matter (PoC uses type 200 / unknown).

For the full end-to-end proof (shows SLAAC working -> exploit -> SLAAC dead):

root@kitploit:~
python3 poc/prove_dos.py

Evidence

root@kitploit:~
── Before exploit ──
  SLAAC addresses: 2001:db8:1:0:df6f:edeb:6e3a:2640, ...
  Engine CPU: 0.0%

── After one packet ──
  Engine CPU: 23.1% → 43.3% (climbing)
  New RA with 2001:db8:2::/64 sent → no address configured
  slaacd is dead. IPv6 autoconf: DEAD.

Prior Art

Same attack surface as CVE-2022-27881 and CVE-2022-27882 (earlier slaacd infinite loops in engine.c, also ND option parsing). This is a new instance of the same class of bug - the previous fixes didn't cover all the parsing loops.

Fix

Check nd_opt_len == 0 before doing arithmetic on it. Break out of the loop. This is what the kernel already does in nd6_options():

root@kitploit:~
if (nd_opt->nd_opt_len == 0)
    break;  // or: goto bad;

Suggested patch for slaacd's parse_ra(), debug_log_ra(), and rad's RS parser - all three loops need the same one-line guard.

Timeline

  • 2026-04-12: Reported to [email protected] with PoC and patch
  • 2026-04-20: CVE-2026-41285 assigned by MITRE

Don't be stupid

This is a local-network DoS. If you're on the same L2 segment as an OpenBSD box running slaacd, one packet freezes its IPv6. Don't send it to networks you don't own. If you run OpenBSD, check for a patch or add the len==0 guard yourself.


Daniel Wade - GitHub · Twitter/X · Bluesky · nadsec.online

Download Tool