Summary

FieldDetail
CVE IDCVE-2026-81642
Also trackedCVE-2026-81634 and CVE-2026-85501 — the two other DNSSEC validator bugs closed by the same release; a distribution counts as fixed only once it carries all three
ComponentUnbound — the DNSSEC validator: DNSKEY digesting, RRset canonicalisation, and chain-of-trust validation
TypeHeap buffer overflow (CVE-2026-81642, CVE-2026-81634); algorithmic complexity / resource exhaustion (CVE-2026-85501)
CWECWE-122 Heap-based buffer overflow (both overflows); CWE-770 Allocation of resources without limits (ReTrap)
CVSSCVE-2026-81642: 9.1 critical (4.0) — AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:U/U:Red · CVE-2026-81634: 7.5 high (3.1) — AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H · CVE-2026-85501: 5.3 medium (3.1) — AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L. All three scored by NLnet Labs as CNA; NVD has published no score of its own
Public disclosure2026-09-16 — Unbound 1.26.1 release and the NLnet Labs advisories
Fixed upstreamUnbound 1.26.1, released 2026-09-16
Reported byYuqi Qiu and Xiang Li (Nankai University, AOSP Lab) for CVE-2026-81642; Vlatko Kosturjak (Marlink Cyber) for CVE-2026-81634; Zuyao Xu and Xiang Li (Nankai University, AOSP Lab), with a complementary report by Qifan Zhang (Palo Alto Networks), for CVE-2026-85501
KEV listedno
Public exploitnone known — CISA’s SSVC assessment on all three records exploitation none, and the CVSS 4.0 vector’s E:U says NLnet Labs has none to report either
EPSS0.0052 (43rd percentile) for CVE-2026-81642, scored 2026-09-16

All three bugs sit in the code a validating Unbound runs while checking DNSSEC data it fetched from the internet, and all three are reached through answers the resolver fetches: for CVE-2026-81642 and CVE-2026-85501 by making it look up a name in an attacker-controlled zone, for CVE-2026-81634 also by tampering with a response in flight. On a recursive resolver, a lookup is something any client can start, as can anything that makes a client resolve a name — a web page, an email, a log entry. No authentication is involved, and for CVE-2026-81634 the advisory is explicit that the overflow precedes any signature check.

CVE-2026-81642 is the serious one. When the validator digests a DNSKEY record to match it against the parent zone’s DS record, it decompresses the record’s owner name into the digest buffer. A DNSKEY whose owner name is a compression pointer into the record’s own RDATA makes that decompression overrun the buffer, and the bytes written are the attacker’s. NLnet Labs rates the outcome as denial of service and possible remote code execution. The fix checks the buffer’s capacity after decompression and before writing.

CVE-2026-81634 is in RRset canonicalisation — the routine that puts an RRset into the canonical form signatures are computed over. Its length check omitted the first owner name, so a 255-byte query name combined with a large TCP response overflows a heap buffer. Because canonicalisation runs before any signature is verified, a malicious nameserver or anyone who can tamper with a response in flight can trigger it without defeating DNSSEC. NLnet Labs scores it as denial of service only.

CVE-2026-85501 is the Unbound share of ReTrap, a family of algorithmic-complexity attacks on DNSSEC validators. Four variants apply: TagTrap floods the validator with mismatched DNSKEY, RRSIG, and DS records so that the (zone, algorithm, key tag) matching does far too much work; DelegationTrap forces the chain-of-trust walk to validate DNSKEY and DS records for deeply nested delegations; NsecTrap makes the resolver validate an excessive number of bogus NSEC records; and AdditionalTrap exploits Unbound’s former default of validating the ADDITIONAL section too. The effect is degradation of service — validator time spent on attacker-supplied records — for every client of the resolver.

ℹ️ Exposure follows DNSSEC validation. A resolver with validation enabled runs all of this code on every answer it validates; Debian’s and NixOS’s default configurations both enable it. Only a package carrying the upstream fixes closes the bugs — no configuration setting does.

Affected versions

VulnerableFixed
every release through 1.26.01.26.1 (2026-09-16)

Per the NLnet Labs advisories for CVE-2026-81642, CVE-2026-81634, and CVE-2026-85501, each of which lists “Unbound up to and including version 1.26.0” as affected. For operators building from source, NLnet Labs also publishes a patch per CVE against 1.26.0 — a minimal one (patch_<CVE>.diff) and one with the surrounding code improvements (patch_<CVE>_with.diff), linked from each advisory.

For CVE-2026-85501 the fix is a set of limits: at most 256 DNSKEY tag matches, at most 32 attempted DS operations and 32 attempted DNSKEY operations (configurable in 1.26.1 as val-hash-attempts and val-validation-attempts respectively), at most 8 NSEC or NSEC3 validations per message, and val-clean-additional now off by default so the ADDITIONAL section is no longer validated.

The same 1.26.1 release also closed six other CVEs, outside the DNSSEC validator and not tracked here — a distribution’s update for the three above will normally close these at the same time: CVE-2026-82717 (CNAME synthesis heap corruption), CVE-2026-77955 (ZONEMD verification bypass window), CVE-2026-78227 (use-after-free in the DoQ stream output buffer), CVE-2026-80225 (degradation of service from continuous queries on one TCP or DoT connection), CVE-2026-82720 (use-after-free in DoH stream cleanup), and CVE-2026-77860 (serve-expired bypassing wait-limit).

Distribution status

Fix status depends on the package version and on whether the maintainer backported the upstream patches. A distribution can carry the fixes as a -N Debian packaging revision, a patches/patch-* file (with a PKGREVISION bump) in pkgsrc, or a patch entry in the nixpkgs expression — so an older version string does not by itself mean vulnerable.

A row is Fixed once its package closes all three CVEs, at Unbound 1.26.1 or later or through backports of all three patches. A package that closes some of them but not all is marked Partial, naming the CVE still open.

Debian versions are the apt-installable value: the <suite>-security archive where it exists, since that is what hosts run and where a DSA fix lands first.

DistributionReleaseunboundFixed sinceStatus
Debiansid1.26.1-12026-09-16✅ Fixed
Debianforky (testing)1.26.0-2❌ Vulnerable — awaiting migration from sid
Debian13 (trixie)1.22.0-2+deb13u3❌ Vulnerable — open in the security tracker
Debian12 (bookworm)1.17.1-2+deb12u3❌ Vulnerable — open in the security tracker
pkgsrcpkgsrc-currentnet/unboundunbound-1.26.0nb1❌ Vulnerable — needs ≥ 1.26.1
pkgsrcpkgsrc-2026Q3net/unbound❔ Unverified — branch not yet cut
pkgsrcpkgsrc-2026Q2net/unboundunbound-1.25.1❌ Vulnerable — needs ≥ 1.26.1
NixOSnixos-unstable1.26.0❌ Vulnerable
NixOSnixos-unstable-small1.26.0❌ Vulnerable
NixOSnixos-26.051.26.0❌ Vulnerable
NixOSnixos-26.05-small1.26.0❌ Vulnerable
nixpkgsmaster branch1.26.0❌ Vulnerable
nixpkgsrelease-26.05 branch1.26.0❌ Vulnerable
nixpkgsnixpkgs-unstable1.26.0❌ Vulnerable — channel for non-NixOS Nix users

Debian

The Debian security tracker is the authoritative source for per-suite status; it carries a page per CVE (CVE-2026-81634, CVE-2026-85501) and the three agree suite for suite. sid took the upstream 1.26.1 release as 1.26.1-1, whose changelog names all nine CVEs of the release; forky inherits it through the normal testing migration. Trixie and bookworm each need a security upload backporting the patches onto their 1.22.0 and 1.17.1 bases, and both remain open in the tracker.

A default Debian install validates: the package ships /etc/unbound/unbound.conf.d/root-auto-trust-anchor-file.conf, which configures the root trust anchor, so an unpatched Debian resolver is exposed unless the operator removed that file.

pkgsrc

The pkgsrc tree (NetBSD’s package collection, also used on SmartOS, macOS via pkgin, and elsewhere) ships Unbound as net/unbound. pkgsrc-current is the rolling tip; the quarterly stable branches inherit fixes by cherry-pick, and pkgsrc-2026Q2 is the current one. pkgsrc-2026Q3 is expected around the end of September, and starts from whatever pkgsrc-current carries on the day it is cut — if the 1.26.1 update lands on pkgsrc-current first, the new branch is born fixed.

The identifier carries an nbN suffix when the package’s PKGREVISION is set. That revision bumps for many reasons besides security patches — recursive bumps for shared-library ABI changes, dependency and build-system tweaks — so an nbN suffix on its own says nothing about these CVEs. unbound-1.26.0nb1 on pkgsrc-current took its nb1 from a recursive abseil bump, not from a security patch.

Whether a pkgsrc host validates is up to its operator: the package ships no trust anchor configuration of its own.

NixOS

nixpkgs builds Unbound from a single expression, pkgs/by-name/un/unbound/package.nix; the unbound, unbound-full, and unbound-with-systemd attributes all take their version from it, so one row per channel covers every variant. A channel is fixed once its pinned version reaches 1.26.1 or the expression carries the three fixes as patches on the 1.26.0 base. The 1.26.0 bump reached master on 2026-08-07 and was backported to release-26.05 the next day, so the stable channels are as current as unstable here.

The NixOS services.unbound module enables the root trust anchor by default (enableRootTrustAnchor = true), so a NixOS resolver validates unless that option was turned off.

Each channel row’s Fixed since will be the date that channel actually publishes a release containing the fix, not the date this tracker notices it.

Flake users

A flake input like github:NixOS/nixpkgs/nixos-unstable resolves to the git branch of that name, not to the channel — but the channel bot advances the branch to exactly the revision the channel publishes, so an input following a channel name is answered by that channel’s row.

Two branches have no channel gating them and will carry the fix earlier — they are listed above as master and release-26.05:

  • github:NixOS/nixpkgs/master — the fix’s first appearance anywhere in nixpkgs, the moment it is merged.
  • github:NixOS/nixpkgs/release-26.05 — the ungated 26.05 branch, ahead of the nixos-26.05 channel by however long Hydra takes.

Their Fixed since will be the commit date of the version bump, not a channel release date: an ungated branch has the fix as soon as the commit lands. That also bounds every other row — no channel can be fixed before the branch it is cut from.

Detection

To check whether a running Unbound is on a fixed build:

unbound -V | head -1
  • 1.26.1 or later ⇒ fixed.
  • Anything older ⇒ vulnerable, unless the distribution packager has backported the upstream patches (see the per-distribution notes above).

To see whether the resolver validates at all — and so whether the validator code is reachable — check the running configuration for a trust anchor:

unbound-checkconf -o auto-trust-anchor-file

An empty result, together with no trust-anchor-file, trust-anchor, or trusted-keys-file setting, means validation is off and the bugs are not reached; conversely an anchor validates only while module-config still lists validator, which the default does. That is a statement about exposure, not a fix.

Debian

A Debian-side backport keeps the upstream version and bumps the packaging revision instead (the -N suffix on unstable, +debXuY on the stable suites). Query the installed package version:

dpkg-query -W -f='${Version}\n' unbound

Cross-reference the version against the Debian rows in Distribution status and, ultimately, against the Debian security tracker.

pkgsrc

Query the installed package:

pkg_info -e unbound

The output is unbound-<version> plus, if the Makefile sets PKGREVISION, the suffix nb<PKGREVISION> — for example unbound-1.26.0nb1. Cross-reference against the pkgsrc rows in the table above.

NixOS

The Unbound version in the system closure is the version = field in pkgs/by-name/un/unbound/package.nix at the channel revision the system was built from; there is no separate packaging-revision concept. Query the running build:

unbound -V | head -1

…and cross-reference against the per-channel rows in the table above.

Mitigation

There is no configuration workaround for the two heap overflows: the missing capacity checks are in code every validating resolver runs, and only a build carrying the upstream fixes closes them. Upgrade to a fixed Unbound as soon as your distribution carries one, or apply the per-CVE patches from the advisories to a 1.26.0 source build.

Until then:

  • val-clean-additional: no removes the AdditionalTrap variant of CVE-2026-85501 on an unpatched build — it is the setting 1.26.1 changed the default of. It does nothing for the other three ReTrap variants or for the overflows.
  • Limit who can ask. The trigger for all three is an answer the attacker shaped — usually by getting the resolver to look up a name in their zone — so a resolver that answers only its own networks (access-control) narrows the set of parties who can start one. It does not remove the risk: any client, and anything that makes a client resolve a name, still can, and an on-path attacker needs no client at all.
  • Watch for crashes. A validating resolver that restarts unexpectedly after the disclosure date is worth investigating rather than shrugging off.

Turning DNSSEC validation off would take the validator out of reach, at the cost of every protection it provides. Upstream does not offer it as a workaround, and neither does this tracker.

No exploit code has been published for any of the three. NLnet Labs' own threat metric (E:U, exploit maturity unreported) and CISA’s SSVC assessment (exploitation none) both record no known exploitation.

Verification log

Every verdict in the table above is backed by a checkable source. This log records the provenance — the advisory, repository index, or git reference that established each fact — so any row can be audited or reproduced. Most readers never need it.

Full verification log

Upstream

  • Release (via the [GitHub release page][release]):
    • Unbound 1.26.1 published 2026-09-16, signed by NLnet Labs.
    • Nine CVEs listed with one-line titles and reporter credits; the three tracked here are CVE-2026-81642, CVE-2026-81634, and CVE-2026-85501.
    • The nine GitHub advisory (GHSA) ids on the page are listed in ascending CVE order — not the order of the Bug Fixes list — and carry no patch links, so this tracker cites the NLnet Labs advisory texts and lists the three GHSA ids under References only.
  • NLnet Labs advisory texts (via the plain-text [CVE-2026-81642][adv-81642], [CVE-2026-81634][adv-81634], and [CVE-2026-85501][adv-85501] files):
    • Each names “Unbound up to and including version 1.26.0” as affected and 1.26.1 as fixed.
    • Each links a minimal and a _with patch against 1.26.0.
    • CVE-2026-81642: “a DNSKEY with an owner compression pointer to its own RDATA can overflow the digest buffer”; remote code execution “possible through attacker controlled data”; trigger is “controlling a malicious zone and querying a vulnerable Unbound”.
    • CVE-2026-81634: “a 255 length query name with a large TCP response”; the length check missed the first owner name; “canonicalisation happens before DNSSEC validation”.
    • CVE-2026-85501: the four ReTrap variants and the four limits 1.26.1 introduces, quoted in Affected versions above.
    • Credits as recorded in the Summary; the 85501 text credits Qifan Zhang “for a complimentary report”.
  • CNA records (via the CVE Services API, cveawg.mitre.org):
    • All three published 2026-09-16 by NLnet Labs; each record was last updated the same day, when CISA’s ADP container was added.
    • All three encode the affected range identically: version 0, lessThan 1.26.1 (semver).
    • CVE-2026-81642: CVSS 4.0 9.1, vector ending E:U/U:Red, CWE-122.
    • CVE-2026-81634: CVSS 3.1 7.5, CWE-122.
    • CVE-2026-85501: CVSS 3.1 5.3, CWE-770.
    • CISA ADP (SSVC) on all three: exploitation none, automatable yes; technical impact total for CVE-2026-81642, partial for the other two.
  • NVD (via the NVD 2.0 API — the web pages render only through JavaScript):
    • All three records present, published 2026-09-16, last modified the same day.
    • Each carries only the CNA’s score, sourced as sep@nlnetlabs.nl; NVD has assigned no score of its own — status Awaiting Analysis.
    • No CISA KEV entry on any of the three.
  • EPSS (via the FIRST API):
    • CVE-2026-81642 0.0052 (43rd percentile), CVE-2026-81634 0.0036 (29th), CVE-2026-85501 0.0031 (24th), all dated 2026-09-16.

Distributions

  • Debian (via the security tracker pages for [CVE-2026-81642][debian-81642], [CVE-2026-81634][debian-81634], and [CVE-2026-85501][debian-85501], and the 1.26.1-1 changelog on sources.debian.org):
    • sid: unbound 1.26.1-1, fixed on all three pages; the changelog lists all nine CVEs of the release.
    • sid Fixed since 2026-09-16, the first_seen of 1.26.1-1 on snapshot.debian.org.
    • forky: 1.26.0-2, vulnerable on all three pages.
    • trixie: trixie-security at 1.22.0-2+deb13u3, vulnerable on all three pages; no DSA yet.
    • bookworm: bookworm-security at 1.17.1-2+deb12u3, vulnerable on all three pages; no DSA yet. The main archive is one point-release revision ahead at 1.17.1-2+deb12u4, also vulnerable.
    • Default validation: debian/unbound.conf.d/root-auto-trust-anchor-file.conf in the 1.26.1-1 source sets auto-trust-anchor-file.
  • pkgsrc (via scripts/pkgsrc-versions against the local clone):
    • origin/trunk: net/unbound at DISTNAME=unbound-1.26.0, PKGREVISION=1, so unbound-1.26.0nb1; the revision came from a recursive abseil bump on 2026-08-26, the 1.26.0 update itself landed 2026-08-13.
    • origin/pkgsrc-2026Q2: unbound-1.25.1.
    • origin/pkgsrc-2026Q3: not in the clone — the branch has not been cut.
    • patches/ on trunk holds only patch-configure; no CVE patch on either branch.
  • NixOS / nixpkgs (via scripts/nixpkgs-versions against the local clone at each channel’s revision pointer, and git log on pkgs/by-name/un/unbound/package.nix):
    • All five channels pin 1.26.0; no CVE patch in the expression.
    • master: 1.26.0 since the bump commit 35bf5426 of 2026-08-07.
    • release-26.05: 1.26.0 since the backport 5465e2c8 of 2026-08-08.
    • Default validation: nixos/modules/services/networking/unbound.nix sets enableRootTrustAnchor to true by default.
  • NixOS security tracker ([tracker.security.nixos.org][nixos-sec]) — a JS-rendered application; linked for readers, not read by this tracker.

References

SourceURL
Unbound 1.26.1 releasehttps://github.com/NLnetLabs/unbound/releases/tag/release-1.26.1
NLnet Labs advisory — CVE-2026-81642https://nlnetlabs.nl/downloads/unbound/CVE-2026-81642.txt
NLnet Labs advisory — CVE-2026-81634https://nlnetlabs.nl/downloads/unbound/CVE-2026-81634.txt
NLnet Labs advisory — CVE-2026-85501https://nlnetlabs.nl/downloads/unbound/CVE-2026-85501.txt
GitHub advisory GHSA-xxc4-rpp8-3fw7 — CVE-2026-81642https://github.com/advisories/GHSA-xxc4-rpp8-3fw7
GitHub advisory GHSA-x9ff-rj4v-x6mq — CVE-2026-81634https://github.com/advisories/GHSA-x9ff-rj4v-x6mq
GitHub advisory GHSA-qwgf-hj58-8c2w — CVE-2026-85501https://github.com/advisories/GHSA-qwgf-hj58-8c2w
CVE-2026-81642 — MITRE CVE Recordhttps://www.cve.org/CVERecord?id=CVE-2026-81642
CVE-2026-81634 — MITRE CVE Recordhttps://www.cve.org/CVERecord?id=CVE-2026-81634
CVE-2026-85501 — MITRE CVE Recordhttps://www.cve.org/CVERecord?id=CVE-2026-85501
CVE-2026-81642 — NVD recordhttps://nvd.nist.gov/vuln/detail/CVE-2026-81642
CVE-2026-81634 — NVD recordhttps://nvd.nist.gov/vuln/detail/CVE-2026-81634
CVE-2026-85501 — NVD recordhttps://nvd.nist.gov/vuln/detail/CVE-2026-85501
CWE-122 — Heap-based Buffer Overflowhttps://cwe.mitre.org/data/definitions/122.html
CWE-770 — Allocation of Resources Without Limits or Throttlinghttps://cwe.mitre.org/data/definitions/770.html
Debian security tracker — CVE-2026-81642https://security-tracker.debian.org/tracker/CVE-2026-81642
Debian security tracker — CVE-2026-81634https://security-tracker.debian.org/tracker/CVE-2026-81634
Debian security tracker — CVE-2026-85501https://security-tracker.debian.org/tracker/CVE-2026-85501
pkgsrc — net/unbound Makefile (GitHub mirror)https://github.com/NetBSD/pkgsrc/blob/trunk/net/unbound/Makefile
NixOS security trackerhttps://tracker.security.nixos.org/
NixOS channel pointer — nixos-unstablehttps://channels.nixos.org/nixos-unstable/git-revision
NixOS channel pointer — nixos-unstable-smallhttps://channels.nixos.org/nixos-unstable-small/git-revision
NixOS channel pointer — nixos-26.05https://channels.nixos.org/nixos-26.05/git-revision
NixOS channel pointer — nixos-26.05-smallhttps://channels.nixos.org/nixos-26.05-small/git-revision
nixpkgs channel pointer — nixpkgs-unstablehttps://channels.nixos.org/nixpkgs-unstable/git-revision