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