GHSA-83hf-93m4-rgwq: Hickory recursor Hickory DNS's Record Cache Accepts Vulnerability

HIGH
CWE-706 CWE-345
Published
Advisory Summary

GHSA-83hf-93m4-rgwq is a HIGH hickory dns's record cache accepts vulnerability (CWE-706: Use of Incorrectly-Resolved Name or Reference) affecting Hickory recursor libraries in the crates.io ecosystem. The issue involves hickory dns's record cache accepts authority-section ns from sibling zone via parent-pool zone-context elevation. Remediation is available by upgrading affected packages to version 0.26.0.

GHSA-83hf-93m4-rgwq at a Glance

CVE Identifier N/A
GHSA Identifier GHSA-83hf-93m4-rgwq
Severity HIGH
CVSS v3.1 Base Score N/A
CWE Classification CWE-706: Use of Incorrectly-Resolved Name or Reference
Affected Product Hickory recursor
Package Ecosystem crates.io
Published Date
Last Updated

How to Fix GHSA-83hf-93m4-rgwq

To remediate this vulnerability, upgrade all affected Hickory recursor dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

hickory-recursor fixed: Latest secure release
Upgrade hickory-recursor to Latest secure release
hickory-recursor fixed: 0.26.0
Upgrade hickory-recursor to 0.26.0
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for hickory-recursor

How to Check if You Are Affected

To determine whether your application is affected by GHSA-83hf-93m4-rgwq, inspect your project dependencies for Hickory recursor:

inspect dependencies for hickory-recursor

Analyze the terminal output to locate any version of Hickory recursor in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 0.26.0), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-706: Use of Incorrectly-Resolved Name or Reference, where the product uses a name or reference to access a resource, but the name/reference resolves to a resource that is outside of the intended control sphere. In Hickory recursor, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

# Summary The Hickory DNS project's experimental `hickory-recursor` crate's record cache (`DnsLru`) stores records from DNS responses keyed by each record's own (name, type), not by the query that triggered the response. `cache_response()` in `crates/recursor/src/lib.rs` chains `ANSWER`, `AUTHORITY`, and `ADDITIONAL` sections into one record iterator before insertion. The bailiwick filter it applies uses the zone context of the NS pool that serviced the lookup, not the zone being queried. This creates a cross-zone poisoning path. When Hickory builds the NS pool for `attacker.poc.` it uses the parent `poc.` `NS` pool (`ns.zone() = "poc."`). If the `poc.` nameserver under the attacker's control includes in its response's `AUTHORITY` section a record for a sibling zone like `victim.poc. NS ns.evil.poc.`, the bailiwick check `is_subzone("poc.", "victim.poc.")` passes (`victim.poc.` is a subdomain of `poc.`). The record is stored under `(victim.poc., NS)` in the shared cache. Subsequently, any client querying a name in `victim.poc`. causes Hickory to build its NS pool from the poisoned cache entry, routing queries to the attacker's nameserver (`ns.evil.poc.`) rather than to the legitimate nameserver for `victim.poc.`. The legitimate `NS` for that zone receives zero queries. This issue is fixed in `hickory-resolver` 0.26.0 with the `recursor` feature through an architectural change to response-level caching: responses are stored keyed by the originating query `(name, type)`. A response to `(attacker.poc. NS)` is stored only under that key and cannot affect the `(victim.poc., NS)` cache entry. Hickory DNS believes this issue has been present in all published versions of the experimental `hickory-recursor` crate, which has now been folded into the `hickory-resolver` crate under the non-default `recursor` feature flag. The `hickory-recursor` crate will not receive any updates going forward and all users should migrate to `hickory-resolver` with the `recursor` feature. Users of the `hickory-dns` binary configured with the opt-in `recursor` feature and a configuration acting as a recursive resolver should update to 0.26.0+. ### Reporter Qifan Zhang, Palo Alto Networks

GHSA-83hf-93m4-rgwq Affected Hickory recursor Versions

2 component(s)
Fixed Versions:
0.26.0
Product / Package Ecosystem Affected Versions Fixed Version
hickory-recursor
crates.io
0.1
All 1 versions
0.1
None specified
hickory-recursor
crates.io
≥ 0.24.0
< 0.26.0
0.26.0

References

Frequently Asked Questions

What is GHSA-83hf-93m4-rgwq?
GHSA-83hf-93m4-rgwq is a security vulnerability in Hickory recursor involving Hickory DNS's Record Cache Accepts AUTHORITY-Section NS from Sibling Zone via Parent-Pool Zone-Context Elevation under CWE-706: Use of Incorrectly-Resolved Name or Reference.
Which Hickory recursor versions are affected?
Affected versions include releases prior to 0.26.0 across affected packages: hickory-recursor.
What version fixes GHSA-83hf-93m4-rgwq?
Upgrading to 0.26.0 (or the latest patched release for your respective branch) resolves the vulnerability.
Is hickory-recursor affected?
Yes, hickory-recursor is affected in releases prior to Latest secure release, 0.26.0. Upgrade your dependency to Latest secure release, 0.26.0 or later.
What CWE is associated with GHSA-83hf-93m4-rgwq?
GHSA-83hf-93m4-rgwq is classified under CWE-706: Use of Incorrectly-Resolved Name or Reference (The product uses a name or reference to access a resource, but the name/reference resolves to a resource that is outside of the intended control sphere.).
How can I check crates.io dependencies for GHSA-83hf-93m4-rgwq?
Run the dependency tree command: 'inspect dependencies for hickory-recursor'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-83hf-93m4-rgwq",
  "modified" : "2026-04-30T18:10:58Z",
  "published" : "2026-04-30T18:10:58Z",
  "aliases" : [ ],
  "summary" : "Hickory DNS's Record Cache Accepts AUTHORITY-Section NS from Sibling Zone via Parent-Pool Zone-Context Elevation",
  "details" : "# Summary\n\nThe Hickory DNS project's experimental `hickory-recursor` crate's record cache (`DnsLru`) stores records from DNS responses keyed by each record's own (name, type), not by the query that triggered the response. `cache_response()` in `crates/recursor/src/lib.rs` chains `ANSWER`, `AUTHORITY`, and `ADDITIONAL` sections into one record iterator before insertion. The bailiwick filter it applies uses the zone context of the NS pool that serviced the lookup, not the zone being queried.\n\nThis creates a cross-zone poisoning path. When Hickory builds the NS pool for `attacker.poc.` it uses the parent `poc.` `NS` pool (`ns.zone() = \"poc.\"`). If the `poc.` nameserver under the attacker's control includes in its response's `AUTHORITY` section a record for a sibling zone like `victim.poc. NS ns.evil.poc.`, the bailiwick check `is_subzone(\"poc.\", \"victim.poc.\")` passes (`victim.poc.` is a subdomain of `poc.`). The record is stored under `(victim.poc., NS)` in the shared cache.\n\nSubsequently, any client querying a name in `victim.poc`. causes Hickory to build its NS pool from the poisoned cache entry, routing queries to the attacker's nameserver (`ns.evil.poc.`) rather than to the legitimate nameserver for `victim.poc.`. The legitimate `NS` for that zone receives zero queries.\n\nThis issue is fixed in `hickory-resolver` 0.26.0 with the `recursor` feature through an architectural change to response-level caching: responses are stored keyed by the originating query `(name, type)`. A response to `(attacker.poc. NS)` is stored only under that key and cannot affect the `(victim.poc., NS)` cache entry.\n\nHickory DNS believes this issue has been present in all published versions of the experimental `hickory-recursor` crate, which has now been folded into the `hickory-resolver` crate under the non-default `recursor` feature flag. The `hickory-recursor` crate will not receive any updates going forward and all users should migrate to `hickory-resolver` with the `recursor` feature.\n\nUsers of the `hickory-dns` binary configured with the opt-in `recursor` feature and a configuration acting as a recursive resolver should update to 0.26.0+.\n\n### Reporter \n\nQifan Zhang, Palo Alto Networks",
  "severity" : [ {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "crates.io",
      "name" : "hickory-recursor"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0.24.0"
      }, {
        "fixed" : "0.26.0"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 0.25.2"
    }
  }, {
    "package" : {
      "ecosystem" : "crates.io",
      "name" : "hickory-recursor"
    },
    "versions" : [ "0.1" ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/hickory-dns/hickory-dns/security/advisories/GHSA-83hf-93m4-rgwq"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/hickory-dns/hickory-dns"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-345", "CWE-706" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-04-30T18:10:58Z",
    "nvd_published_at" : null
  }
}