libp2p / libp2p/rust-libp2p

RUSTSEC-2026-0118: NSEC3 closest-encloser proof validation enters unbounded loop on cross-zone responses

Open
#6,412 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Rust
Stars
5.6k
Forks
1.3k
Avg merge
8h 47m
Merged PRs (30d)
19

Description

NSEC3 closest-encloser proof validation enters unbounded loop on cross-zone responses

Details
Package hickory-proto
Version 0.25.2
URL https://github.com/hickory-dns/hickory-dns/security/advisories/GHSA-3v94-mw7p-v465
Date 2026-05-01
Unaffected versions <0.25.0-alpha.3,>=0.26.0-beta.1

The NSEC3 closest-encloser proof validation in hickory-proto's
DnssecDnsHandle walks from the QNAME up to the SOA owner name, building a
list of candidate encloser names. The iterator used assumes the
QNAME is a descendant of the SOA owner, terminating only when the current
candidate equals the SOA name. When the SOA in a response's authority section
is not an ancestor of the QNAME, the loop stalls at the DNS root and never
terminates, repeatedly calling Name::base_name() and pushing newly allocated
Name and hashed-name entries into the candidate Vec.

The bug is reachable by any caller of DnssecDnsHandle — including the
resolver, recursor, and client — when built with the dnssec-ring or
dnssec-aws-lc-rs feature and configured to perform DNSSEC validation. It is
triggered while validating a NoData or NXDomain response whose authority
section contains an SOA record from a zone other than an ancestor of the
QNAME, on a code path that requires NSEC3 closest-encloser proof. In practice
this can be reached through an insecure CNAME chain that crosses zone
boundaries into a DNSSEC-signed zone returning NoData, but the minimum
condition is just a mismatched SOA owner on a response requiring NSEC3
validation.

A debug_assert_ne!(name, Name::root()) guards the loop body, so debug builds
abort with a panic on the first iteration past the root. Release builds
compile the assertion out and run the loop unbounded, allocating until the
process exhausts available memory (OOM). A reachable upstream attacker who
can return such a response can therefore crash a debug-built validator or
exhaust memory on a release-built one.

The affected code was migrated from hickory-proto to hickory-net as part of
the 0.26.0 release. The hickory-proto 0.26.x release no longer offers
DnssecDnsHandle and so we recommend all affected users update to hickory-net
0.26.1 when the implementation of that type is required.

See advisory page for additional details.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

The report names hickory-proto's DnssecDnsHandle and the RUSTSEC-2026-0118 advisory, but no rust-libp2p file or test to change. First establish whether this repository uses the affected package and identify the appropriate dependency or implementation entry point; done requires a confirmed fix or upgrade that prevents the unbounded validation loop.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
networking, security
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
20/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.