1 1.1 christos .. Copyright (C) Internet Systems Consortium, Inc. ("ISC") 2 1.1 christos .. 3 1.1 christos .. SPDX-License-Identifier: MPL-2.0 4 1.1 christos .. 5 1.1 christos .. This Source Code Form is subject to the terms of the Mozilla Public 6 1.1 christos .. License, v. 2.0. If a copy of the MPL was not distributed with this 7 1.1 christos .. file, you can obtain one at https://mozilla.org/MPL/2.0/. 8 1.1 christos .. 9 1.1 christos .. See the COPYRIGHT file distributed with this work for additional 10 1.1 christos .. information regarding copyright ownership. 11 1.1 christos 12 1.1 christos Notes for BIND 9.20.26 13 1.1 christos ---------------------- 14 1.1 christos 15 1.1 christos Security Fixes 16 1.1 christos ~~~~~~~~~~~~~~ 17 1.1 christos 18 1.1 christos - Correct verification of NSEC3 signer name. :cve:`2026-10723` 19 1.1 christos 20 1.1 christos Previously, :iscman:`named` accepted child-zone NSEC3 records where 21 1.1 christos the first label equaled the hash of the parent zone as valid 22 1.1 christos parent-zone closest encloser proofs. This has been fixed. 23 1.1 christos 24 1.1 christos ISC would like to thank Qifan Zhang of Palo Alto Networks for bringing 25 1.1 christos this vulnerability to our attention. :gl:`#5874` 26 1.1 christos 27 1.1 christos - Malformed DNSKEY records could trigger an assertion. :cve:`2026-10822` 28 1.1 christos 29 1.1 christos Previously, ``dns_name_fromwire()`` did not honor the record boundary 30 1.1 christos when reading names from the wire, allowing malformed records to be 31 1.1 christos accepted when they should not have been. In particular, malformed 32 1.1 christos DNSKEY records could trigger an assertion failure when being printed. 33 1.1 christos This has been fixed. :gl:`#6004` 34 1.1 christos 35 1.1 christos - Fix handling of RPZ CNAME expansion that returns too-long name. 36 1.1 christos :cve:`2026-11331` 37 1.1 christos 38 1.1 christos Previously, if the expansion of a wildcard CNAME RPZ policy resulted 39 1.1 christos in a name that exceeded the length limit, a self-referential CNAME and 40 1.1 christos the original address record were returned, allowing the policy to be 41 1.1 christos bypassed. In branches up to 9.20 this also left query processing in an 42 1.1 christos inconsistent state, which could trigger an assertion failure. 43 1.1 christos :iscman:`named` now returns a YXDOMAIN response, without the address. 44 1.1 christos 45 1.1 christos ISC would like to thank Laith Mash'al (0xmshal) for bringing this 46 1.1 christos vulnerability to our attention. :gl:`#5856` 47 1.1 christos 48 1.1 christos - Prevent excessive validation work from crafted negative responses. 49 1.1 christos :cve:`2026-11605` 50 1.1 christos 51 1.1 christos Previously, a validating resolver could be made to perform a large 52 1.1 christos amount of DNSSEC validation work in response to a single answer, 53 1.1 christos consuming excessive CPU. A malicious authoritative server could 54 1.1 christos trigger this by returning a signed negative answer (NXDOMAIN or 55 1.1 christos NODATA) padded with many denial-of-existence proof records, which the 56 1.1 christos resolver continued to verify beyond its per-query validation limit. It 57 1.1 christos now enforces that limit on negative answers and returns SERVFAIL once 58 1.1 christos the limit is reached. :gl:`#4463` 59 1.1 christos 60 1.1 christos - Prevent cache exhaustion under sustained attack. :cve:`2026-11622` 61 1.1 christos 62 1.1 christos Cache memory could become exhausted with expired entries whose memory 63 1.1 christos was not released, due to a sustained attack on the same DNS name that 64 1.1 christos prevented the cleanup. This has been fixed. :gl:`#4760` 65 1.1 christos 66 1.1 christos - Stop accepting invalid signed wildcard records. :cve:`2026-11721` 67 1.1 christos 68 1.1 christos Signed wildcard responses in which the Labels field in the RRSIG 69 1.1 christos record was less than the number of labels in the Signer Name field 70 1.1 christos were being incorrectly accepted. This in turn broke 71 1.1 christos :namedconf:ref:`synth-from-dnssec`, which depends on such records 72 1.1 christos being correctly validated. This has been fixed. 73 1.1 christos 74 1.1 christos ISC would like to thank Qifan Zhang of Palo Alto Networks for bringing 75 1.1 christos this vulnerability to our attention. :gl:`#5871` 76 1.1 christos 77 1.1 christos - Do not assert for some specific CNAME and DNAME queries. 78 1.1 christos :cve:`2026-12617` 79 1.1 christos 80 1.1 christos A bug in the resolver's handling of certain cached DNAME and CNAME 81 1.1 christos responses could cause :iscman:`named` to trigger an assertion failure 82 1.1 christos and exit. An attacker controlling a domain name and the authoritative 83 1.1 christos DNS server it was hosted on could exploit this behavior to cause a 84 1.1 christos denial-of-service. This has been fixed. 85 1.1 christos 86 1.1 christos ISC would like to thank Qifan Zhang of Palo Alto Networks for bringing 87 1.1 christos this vulnerability to our attention. :gl:`#5946` 88 1.1 christos 89 1.1 christos - Prevent crash from malformed NSEC/NSEC3 response. :cve:`2026-13204` 90 1.1 christos 91 1.1 christos An assertion could be triggered by an improperly signed NOQNAME proof. 92 1.1 christos This has been fixed. 93 1.1 christos 94 1.1 christos ISC would like to thank Qifan Zhang of Palo Alto Networks for bringing 95 1.1 christos this vulnerability to our attention. :gl:`#5985` 96 1.1 christos 97 1.1 christos - Fix DNSSEC validation bypass via out-of-zone NSEC Next Field. 98 1.1 christos :cve:`2026-13321` 99 1.1 christos 100 1.1 christos Previously, a malicious zone with out-of-zone NSEC next-owner names 101 1.1 christos could cause a DNSSEC-validating resolver to cache such a record and, 102 1.1 christos if :namedconf:ref:`synth-from-dnssec` was enabled, to generate 103 1.1 christos negative answers for any zone that was covered by the range. This has 104 1.1 christos been fixed. 105 1.1 christos 106 1.1 christos ISC would like to thank Qifan Zhang of Palo Alto Networks for bringing 107 1.1 christos this vulnerability to our attention. :gl:`#5873` 108 1.1 christos 109 1.1 christos - Reclaim memory promptly when DNSSEC validations are canceled. 110 1.1 christos 111 1.1 christos When a resolver is flooded with queries that require DNSSEC validation 112 1.1 christos - for example during a random-subdomain attack - many of those 113 1.1 christos validations are canceled before they complete. Previously, a canceled 114 1.1 christos validation still kept its place in the internal work queue and held 115 1.1 christos the associated response in memory until that queued work eventually 116 1.1 christos ran, so memory could climb sharply under sustained load. The internal 117 1.1 christos work queue is now dropped as soon as the validation is canceled, 118 1.1 christos releasing the memory it was holding. :gl:`#4760` 119 1.1 christos 120 1.1 christos Removed Features 121 1.1 christos ~~~~~~~~~~~~~~~~ 122 1.1 christos 123 1.1 christos - Remove the secondary validator in ``query.c``. 124 1.1 christos 125 1.1 christos Previously, when the additional section of a response was being 126 1.1 christos populated, if cached data was found with pending trust, it would be 127 1.1 christos opportunistically validated. The code implementing this validation was 128 1.1 christos not quite formally correct. Rather than fixing it, the code has been 129 1.1 christos removed: RRsets with pending trust are now omitted from responses. 130 1.1 christos :gl:`#5966` :gl:`#5968` :gl:`#5972` 131 1.1 christos 132 1.1 christos Bug Fixes 133 1.1 christos ~~~~~~~~~ 134 1.1 christos 135 1.1 christos - Fix a bug in DNS UPDATE processing with 136 1.1 christos :namedconf:ref:`inline-signing` enabled. 137 1.1 christos 138 1.1 christos In rare cases the :iscman:`named` process could terminate unexpectedly 139 1.1 christos when processing authorized DNS UPDATE messages in quick succession 140 1.1 christos that were updating a zone with :namedconf:ref:`inline-signing` 141 1.1 christos enabled. This has been fixed. :gl:`#5816` 142 1.1 christos 143 1.1 christos - Properly detect private records before copying. 144 1.1 christos 145 1.1 christos Previously, an assertion was triggered when trying to copy a private 146 1.1 christos record to a buffer for modification. :iscman:`named` now extends the 147 1.1 christos private type detection and copies the contents after rejecting invalid 148 1.1 christos private records. :gl:`#5857` 149 1.1 christos 150 1.1 christos - Tighten referral DS acceptance. 151 1.1 christos 152 1.1 christos Previously, :iscman:`named` accepted DS records for sibling zones when 153 1.1 christos it shouldn't have. This has been fixed. :gl:`#5870` 154 1.1 christos 155 1.1 christos - Don't synthesize negative responses with pending NSEC. 156 1.1 christos 157 1.1 christos If an NSEC record has not yet been validated and is cached with trust 158 1.1 christos pending, :iscman:`named` no longer uses it to synthesize negative 159 1.1 christos responses. :gl:`#5872` :gl:`#5887` :gl:`#5977` 160 1.1 christos 161 1.1 christos - Check that an NSEC signer is at or above the name to be validated. 162 1.1 christos 163 1.1 christos A check has been added to ensure that an NSEC record being used as a 164 1.1 christos proof of nonexistence for a given name is not signed by a name lower 165 1.1 christos in the DNS hierarchy than the one in question. :gl:`#5876` 166 1.1 christos 167 1.1 christos - Don't evict DNSSEC-validated cache data on a CD=1 NXDOMAIN. 168 1.1 christos 169 1.1 christos When a client sent a query with the checking-disabled (CD) bit set and 170 1.1 christos the answer was NXDOMAIN, the resolver cached that unvalidated negative 171 1.1 christos response and discarded any DNSSEC-validated records it already held 172 1.1 christos for the same name, even though the validated data was more 173 1.1 christos trustworthy. A single such response - including a forged one - could 174 1.1 christos flush validated records from the cache and force the resolver to fetch 175 1.1 christos them again. The resolver now checks the trust level of the existing 176 1.1 christos data first and leaves the cache unchanged when it is already 177 1.1 christos validated. :gl:`#5877` 178 1.1 christos 179 1.1 christos - Fix a :namedconf:ref:`deny-answer-aliases` configuration bypass issue. 180 1.1 christos 181 1.1 christos It was possible to use a maliciously crafted authoritative zone to 182 1.1 christos make a :iscman:`named` resolver synthesize a DNAME "alias" that should 183 1.1 christos have been rejected by the configured :any:`deny-answer-aliases` 184 1.1 christos option. This has been fixed. :gl:`#5930` 185 1.1 christos 186 1.1 christos - Reject external referrals from forwarders. 187 1.1 christos 188 1.1 christos Under a ``forward first;`` policy in a forwarding zone, 189 1.1 christos :iscman:`named` could accept NS records above the forward zone apex 190 1.1 christos from negative responses. This has been fixed. :gl:`#5937` 191 1.1 christos 192 1.1 christos - Fix a zone transfer over TLS (XoT) issue when using the opportunistic 193 1.1 christos TLS mode. 194 1.1 christos 195 1.1 christos The :iscman:`named` process, running as a secondary DNS server and 196 1.1 christos configured to transfer a zone from a primary server using an encrypted 197 1.1 christos XoT transport in opportunistic TLS mode (i.e. without peer 198 1.1 christos certificate/hostname validation), could terminate unexpectedly when 199 1.1 christos the TLS ALPN negotiation with the primary server was unsuccessful. 200 1.1 christos This has been fixed. :gl:`#5957` 201 1.1 christos 202 1.1 christos - Unvalidated opt-out NSEC3 could be accepted in insecurity proof. 203 1.1 christos 204 1.1 christos When determining whether an insecure delegation was legitimate, NSEC3 205 1.1 christos opt-out records which had not yet passed validation could be used. 206 1.1 christos This has been fixed. :gl:`#5970` 207 1.1 christos 208 1.1 christos - Check wildcard signer and NOQNAME signer match. 209 1.1 christos 210 1.1 christos A positive wildcard answer, and the NSEC3 proof that the requested 211 1.1 christos name doesn't exist in the zone, must both be from the same zone. 212 1.1 christos Otherwise, an NSEC3 from an ancestor zone could be used to interfere 213 1.1 christos with validation. 214 1.1 christos 215 1.1 christos :iscman:`named` now retrieves the signer name from a wildcard 216 1.1 christos response's signature. An NSEC3 record cannot be used as a NOQNAME 217 1.1 christos proof for the wildcard unless it exactly matches the name one level 218 1.1 christos above the NSEC3. :gl:`#5971` 219 1.1 christos 220 1.1 christos - Fix CNAME resolution failure caused by a cached SERVFAIL response. 221 1.1 christos 222 1.1 christos Under certain circumstances, a cached SERVFAIL response could 223 1.1 christos incorrectly prevent successful resolution of a CNAME target. This 224 1.1 christos could cause resolution failures to persist until the cached SERVFAIL 225 1.1 christos entry expired, even when the CNAME target itself was otherwise 226 1.1 christos resolvable. This has been fixed. :gl:`#5983` 227 1.1 christos 228 1.1 christos - Reject unsupported RSA DNSKEY shapes during DNSSEC validation. 229 1.1 christos 230 1.1 christos An authoritative server publishing an RSA DNSKEY with an unusually 231 1.1 christos large modulus or an exotic public exponent could make each DNSSEC 232 1.1 christos signature check on a validating recursive resolver noticeably more 233 1.1 christos expensive than for a normally sized key. Such DNSKEYs are now treated 234 1.1 christos as invalid. :gl:`#6008` 235 1.1 christos 236 1.1 christos - Fix a bug in GeoIP2 string matching. 237 1.1 christos 238 1.1 christos When using GeoIP2 ACLs (see :any:`acl`), :iscman:`named` could 239 1.1 christos incorrectly match a name using a sub-string instead of the full name 240 1.1 christos match. This has been fixed. :gl:`#6019` 241 1.1 christos 242 1.1 christos - Fix DNS-over-HTTPS (DoH) quota configuration issue. 243 1.1 christos 244 1.1 christos The :any:`http-listener-clients` and 245 1.1 christos :any:`http-streams-per-connection` configuration options could be 246 1.1 christos truncated to smaller values (or to ``0``, which means unlimited) when 247 1.1 christos very large configuration values in excess of ``65535`` were used. It 248 1.1 christos is very unlikely that such large values were used in production, and 249 1.1 christos the default values for the affected options are ``300`` and ``100``, 250 1.1 christos respectively. This has been fixed. :gl:`#6021` 251 1.1 christos 252 1.1 christos - Truncated reply to a TSIG query no longer stalls the resolver. 253 1.1 christos 254 1.1 christos When an upstream server returned a truncated reply to a query that 255 1.1 christos :iscman:`named` had signed with TSIG, the resolver could keep waiting 256 1.1 christos for a follow-up UDP packet that never arrived, stalling the query 257 1.1 christos until it hit the :namedconf:ref:`resolver-query-timeout` and the 258 1.1 christos client received no answer. :iscman:`named` now treats any reply it 259 1.1 christos cannot authenticate as an immediate failure and returns SERVFAIL right 260 1.1 christos away as a defense in depth. :gl:`#6028` 261 1.1 christos 262 1.1 christos - Ignore updates removing DNSKEY RRset with class ANY. 263 1.1 christos 264 1.1 christos When a dynamic update is received that removes the DNSKEY (or CDNSKEY, 265 1.1 christos or CDS) RRset, :iscman:`named` now removes all records except the ones 266 1.1 christos that are in use for signing the zone. :gl:`#6045` 267 1.1 christos 268 1.1 christos - Ignore 0-byte reads in the TCP read callback. 269 1.1 christos 270 1.1 christos Callbacks for libuv stream reads do not signal zero-length reads as a 271 1.1 christos failure signal but rather as EAGAIN/EWOULDBLOCK. This could trigger an 272 1.1 christos assertion when a zero-length read was pushed onto a PROXYv2 endpoint 273 1.1 christos that had not yet processed the headers, as it expected a non-NULL 274 1.1 christos region of positive length. :gl:`#6140` 275 1.1 christos 276 1.1 christos - Only print per-zone glue stats when :namedconf:ref:`zone-statistics` 277 1.1 christos is set to ``full``. 278 1.1 christos 279 1.1 christos The code printing query statistics was ignoring the 280 1.1 christos :namedconf:ref:`zone-statistics` option. This has been fixed. 281 1.1 christos :gl:`#6164` 282 1.1 christos 283 1.1 christos - CDS/CDNSKEY records were not removed when re-configuring the server. 284 1.1 christos 285 1.1 christos When on an :option:`rndc reconfig` the DNSSEC policy changes such that 286 1.1 christos it changes the expected CDNSKEY and/or CDS records in the zone, the 287 1.1 christos RRset should be updated accordingly. This did not happen when removing 288 1.1 christos digests from the configuration, or setting ``cdnskey no;``. This has 289 1.1 christos been fixed. :gl:`#6166` 290 1.1 christos 291 1.1 christos - Fix a crash when querying an empty non-terminal in a wildcard zone in 292 1.1 christos RBTDB. 293 1.1 christos 294 1.1 christos A query for an empty non-terminal in a wildcard zone served from the 295 1.1 christos RBT zone database could abort :iscman:`named` with an assertion 296 1.1 christos failure. It now returns the correct NODATA answer. :gl:`#6170` 297 1.1 christos 298 1.1 christos - Stop reusing outgoing TCP connections the peer has already closed. 299 1.1 christos 300 1.1 christos Previously, :iscman:`named` could hand a new query to an idle 301 1.1 christos forwarder/upstream TCP or TLS connection that the peer had already 302 1.1 christos closed, causing the query to fail (and CLOSE-WAIT sockets to pile up). 303 1.1 christos Idle reused connections are now watched, so a close is noticed and the 304 1.1 christos connection is dropped instead of reused. A new 305 1.1 christos :namedconf:ref:`tcp-reuse-timeout` option controls how long an idle 306 1.1 christos outgoing connection is kept open for reuse (default 5 seconds). 307 1.1 christos :gl:`#6171` 308 1.1 christos 309 1.1 christos - Fix DNSSEC validation failures for names under an apex DNAME. 310 1.1 christos 311 1.1 christos DNSSEC validation could fail with SERVFAIL for names covered by a 312 1.1 christos DNAME at the apex of a signed zone, unless the zone's keys were 313 1.1 christos already validated in the cache. This regression was introduced by the 314 1.1 christos recent fix for resolver stalls on CNAME responses to DS queries, and 315 1.1 christos has now been addressed. :gl:`#6176` 316