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 BIND 9.20.23 13 ------------ 14 15 Security Fixes 16 ~~~~~~~~~~~~~~ 17 18 - Fix outgoing zone transfers' quota issue. ``1006b044b7`` 19 20 Unauthorized clients could consume outgoing zone transfers quota and 21 block authorized zone transfer clients. This has been fixed. 22 :gl:`#3589` 23 24 - [CVE-2026-3592] Limit resolver server list size. ``c3f3879560`` 25 26 When resolving a domain with many nameservers that share overlapping 27 IP addresses (e.g., 10 NS records all pointing at the same set of 28 addresses), BIND could previously waste time querying duplicate 29 addresses and build up excessively large server lists. Deduplicate 30 addresses in the resolver's server list so that each unique IP is only 31 queried once per resolution attempt, regardless of how many NS records 32 point to it and cap the number of addresses stored per nameserver name 33 to 6 (combined A and AAAA), preventing memory and CPU overhead from 34 domains with unusually large NS/glue sets. :gl:`#5641` 35 36 - [CVE-2026-3039] Fix GSS-API resource leak. ``92d5c60855`` 37 38 Fixed a memory leak where each GSS-API TKEY negotiation leaked a 39 security context inside the GSS library. An unauthenticated attacker 40 could exhaust server memory by sending repeated TKEY queries to a 41 server with tkey-gssapi-keytab configured. The leaked memory was 42 allocated by the GSS library, bypassing BIND's memory accounting. 43 44 Multi-round GSS-API negotiation (GSS_S_CONTINUE_NEEDED) is now 45 rejected, as BIND never supported it correctly and Kerberos/SPNEGO 46 completes in a single round. 47 48 Also implemented missing RFC 3645 requirement: the client now verifies 49 that mutual authentication and integrity flags are granted by the 50 GSS-API mechanism (Section 3.1.1). :gl:`#5752` 51 52 - [CVE-2026-5950] Avoid unbounded recursion loop. ``568be408bc`` 53 54 A bug during bad server handling could cause the resolver to enter an 55 infinite loop, continuously sending queries to an upstream server with 56 no exit condition, until the resolver query timeout was hit. This has 57 been fixed. 58 59 ISC would like to thank Billy Baraja (BielraX) for bringing this issue 60 to our attention. :gl:`#5804` 61 62 - [CVE-2026-5947] Fix crash in resolver when SIG(0)-signed responses are 63 received under load. ``9831f41894`` 64 65 A resolver could crash when handling a SIG(0)-signed response if the 66 matching client query was cancelled while signature verification was 67 still in progress for example, when the recursive-clients quota was 68 exhausted. This has been fixed. :gl:`#5819` 69 70 - [CVE-2026-3593] Add system test for HTTP/2 SETTINGS frame flood. 71 ``3be272e26d`` 72 73 A use-after-free vulnerability in the DNS-over-HTTPS implementation 74 could cause named to crash when a client sends a flood of HTTP/2 75 SETTINGS frames while a DoH response is being written. This affects 76 servers with DoH (DNS-over-HTTPS) enabled. 77 78 ISC would like to thank Naresh Kandula Parmar (Nottiboy) for reporting 79 this. 80 81 For: #5755 82 83 - [CVE-2026-5946] Disable recursion, UPDATE, and NOTIFY for non-IN 84 views. ``014be8be87`` 85 86 Recursion, dynamic updates (UPDATE), and zone change notifications 87 (NOTIFY) are now disabled for views with a class other than IN (such 88 as CHAOS or HESIOD); authoritative service for non-IN zones (e.g. 89 version.bind in class CHAOS) continues to work as before. Servers 90 configured with recursion yes in a non-IN view will log a warning at 91 startup, and named-checkconf flags the same condition. UPDATE and 92 NOTIFY messages that specify the meta-classes ANY or NONE in the 93 question section are now rejected with FORMERR. 94 95 This addresses a set of closely related security issues collectively 96 identified as CVE-2026-5946. ISC would like to thank Mcsky23 for 97 bringing these issues to our attention. 98 99 Removed Features 100 ~~~~~~~~~~~~~~~~ 101 102 - Remove obsolete KEY record EXTENDED flag deprecated by RFC 3445. 103 ``99c226576a`` 104 105 KEY resource records originally defined EXTENDED flag that was removed 106 by RFC 3445 back in 2002. BIND still carried code to parse and emit 107 it, including the additional two-octet flags field that followed when 108 the EXTENDED bit was set. That handling has been removed and the 109 affected bit positions are now reserved. 110 111 Dropping the extended-flags handling also eliminates a possible crash 112 that could be reached when signing a zone containing an invalid key. 113 :gl:`#5900` 114 115 Partial backport of MR !11961 :gl:`!11962` 116 117 Feature Changes 118 ~~~~~~~~~~~~~~~ 119 120 - Revert isdelegation() to return boolean value again. ``6d89bfdf03`` 121 122 :gl:`#5838` :gl:`!11802` 123 124 - Fix CPU spikes and slow queries when cache approaches memory limit. 125 ``e21ae6358a`` 126 127 When the cache grew close to the configured max-cache-size, every 128 subsequent entry triggered all worker threads to run cache cleanup at 129 once, causing CPU spikes and a drop in query throughput. Cleanup is 130 now spread probabilistically across inserts as memory approaches the 131 limit, so the work is distributed evenly instead of piling up at the 132 threshold. 133 134 - Fix off by one error in dnssec-ksr sign. ``819df0d19e`` 135 136 If the inception time of the signature is exactly equal to the 137 inactive time of the key, add the signature. :gl:`!11795` 138 139 Bug Fixes 140 ~~~~~~~~~ 141 142 - Check validator name when adding EDE text. ``b6c3390aea`` 143 144 When a validator is being shut down, the associated name `val->name` 145 is set to NULL. This could cause a crash if a worker thread 146 subsequently added an EDE code with `val->name` in the extra text. 147 148 `validator_addede()` now checks whether the name is NULL before trying 149 to add it to the extra text. :gl:`#5613` :gl:`!11977` 150 151 - Use the zone file's basename as origin in DNSSEC tools. ``097c14da45`` 152 153 In `dnssec-signzone` and `dnssec-verify`, when the zone origin is not 154 specified using the `-o` parameter, the default behavior is to try to 155 sign using the zone's file name as the origin. So, for example, 156 `dnssec-signzone -S example.com` will work, so long as the file name 157 matches the zone name. 158 159 This now also works if the zone is in a different directory. For 160 example, `dnssec-signzone -S zones/example.com` will set the origin 161 value to `example.com`. :gl:`#5678` :gl:`!11784` 162 163 - Fix a possible race condition during zone transfers. ``a48b287d9f`` 164 165 The :iscman:`named` process could terminate unexpectedly when 166 processing an IXFR message during a zone transfer. This has been 167 fixed. :gl:`#5767` :gl:`!11799` 168 169 - Make BIND9 compatible with OpenSSL 4. ``8242105d5d`` 170 171 OPENSSL_cleanup() in OpenSSL 4 doesn't free the memory, and that is 172 not compatible with BIND 9's memory leak detection code. Don't use 173 custom allocation/deallocation functions for OpenSSL's internal memory 174 management. 175 176 See https://github.com/openssl/openssl/pull/29721 :gl:`#5808` 177 :gl:`!11896` 178 179 - Fix named crash when processing SIG records in dynamic updates. 180 ``9e34ef0f7e`` 181 182 Previously, :iscman:`named` could abort if a client sent a dynamic 183 update containing a SIG record (the legacy signature type) to a zone 184 configured with an update-policy. The function `dns_db_findrdataset` 185 had an incorrect requirements prerequisite that prevented SIG records 186 being looked up, which was triggered as part of processing an UPDATE 187 request and could be triggered remotely by any client permitted to 188 send updates. This has been fixed by ensuring that SIG records are 189 handled consistently with RRSIG records during update processing. 190 :gl:`#5818` :gl:`!11876` 191 192 - Fix crash in resolver when SIG(0)-signed responses are received under 193 load. ``bbe0b9b8f6`` 194 195 A resolver could crash when handling a SIG(0)-signed response if the 196 matching client query was cancelled while signature verification was 197 still in progress for example, when the recursive-clients quota was 198 exhausted. This has been fixed. :gl:`#5819` 199 200 - Fix zone verification of NSEC3 signed zones. ``de4a9b4fa6`` 201 202 Previously, when computing the compressed bitmap during verification 203 of an NSEC3-signed zone, an undersized buffer was used that resulted 204 in an out-of-bounds write if there were too many active windows in the 205 bitmap. This impacted mirror zones which are NSEC3-signed, 206 `dnssec-signzone` and `dnssec-verifyzone`. This has been fixed. 207 :gl:`#5834` :gl:`!11833` 208 209 - Prevent a crash when using both dns64 and filter-aaaa. ``ddcacbc5a8`` 210 211 An assertion failure could be triggered if both `dns64` and the 212 `filter-aaaa` plugin were in use simultaneously. This happened if the 213 plugin triggered a second recursion process, which then attempted to 214 store DNS64 state information in a pointer that had already been set 215 by the original recursion process. This has been fixed. :gl:`#5854` 216 :gl:`!11967` 217 218 - Remove unnecessary dns_name_free call. ``35d94fffb0`` 219 220 When processing a catalog zone member's primaries definition and there 221 is a TXT record containing an invalid name TSIG key name, 222 dns_name_free was incorrectly called triggering an assertion. This has 223 been fixed. :gl:`#5858` :gl:`!11848` 224 225 - Tidy up the cleanup path in check_signer() ``cf517f73d5`` 226 227 When check_signer() processed a DNSKEY whose public-key data could not 228 be parsed, the early return on the parse error skipped the cleanup of 229 the cloned signature rdataset. In every code path that currently 230 reaches this function the cloned rdataset holds no resources, so no 231 memory was actually leaked, but the cleanup is restructured so the 232 parse and the iteration cannot diverge again. :gl:`#5869` :gl:`!11957` 233 234 - Prevent malicious DNSSEC zones from exhausting validator CPU. 235 ``c425827743`` 236 237 A DNSSEC-signed zone could publish a DNSKEY with an unusually large 238 RSA public exponent and force any validator resolving names in that 239 zone to spend disproportionate CPU verifying signatures. The 240 validator now rejects such DNSKEYs, matching the limit already applied 241 to keys read from files or HSMs. :gl:`#5881` :gl:`!11923` 242 243 - Fix inverted gethostname() check in rndc status. ``5ede4a87eb`` 244 245 The replacement of named_os_gethostname() with raw gethostname() 246 inverted the success check: the "localhost" fallback runs on success, 247 and on failure the uninitialized hostname buffer is read by 248 snprintf(), leaking stack memory via the rndc status reply. 249 :gl:`#5889` :gl:`!11881` 250 251 - Fix rndc-confgen aborting on HMAC-SHA-384/512 keys above 512 bits. 252 ``7e1eace6cd`` 253 254 `rndc-confgen -A hmac-sha384` and `-A hmac-sha512` documented a `-b` 255 range of 1..1024, but any value above 512 aborted on hardened builds 256 instead of producing a key. The full advertised range now works. 257 :gl:`#5903` :gl:`!11910` 258 259 - Prevent crafted queries from degrading RRL performance. ``bf4cdca7e9`` 260 261 With response rate limiting enabled, an attacker sending queries from 262 many spoofed source addresses could steer entries into the same slot 263 of the internal rate-limit table and slow down query processing on the 264 affected server. The table now uses a per-process keyed hash so the 265 placement of entries cannot be predicted or influenced from the 266 network. :gl:`#5906` :gl:`!11952` 267 268 - Fix swapped arguments in redirect2() single-label branch. 269 ``3728b405ea`` 270 271 On a recursive resolver with nxdomain-redirect configured, an NXDOMAIN 272 result for a query whose qname is the root could corrupt the view's 273 nxdomain-redirect target, after which the redirect feature stopped 274 working for every subsequent query in that view until named was 275 restarted. :gl:`#5908` :gl:`!11913` 276 277 - Free per-command rndc state when response serialisation fails. 278 ``070b394f53`` 279 280 When isccc_cc_towire failed while building an rndc reply, 281 control_respond returned without releasing the per-command request, 282 response, HMAC secret copy, and text buffer. They were eventually 283 freed when the connection closed, but until then the HMAC key copy 284 stayed in named's memory. The failure path now goes through the same 285 cleanup label as every other error. :gl:`#5913` :gl:`!11919` 286 287 - Prevent rare named crash when notifies are cancelled. ``49509dcbae`` 288 289 Under heavy load, named could occasionally crash when a queued 290 outbound notify or zone refresh was cancelled at the moment it was 291 being sent for example, while a zone was being reloaded or removed. 292 The race that caused the crash is now prevented. :gl:`#5915` 293 :gl:`!11922` 294 295 - Stop delv from aborting on a malformed query name. ``ca8315bb4d`` 296 297 delv aborts with SIGABRT instead of exiting cleanly when given a query 298 name that fails wire-format conversion (e.g. a label longer than 63 299 octets). After this change delv prints the parse error and exits with 300 a normal failure code. :gl:`#5916` :gl:`!11927` 301 302 - Fix a crash when reconfiguring while an NTA is being rechecked. 303 ``971ca4df1a`` 304 305 When named was reconfigured or shut down while a negative trust anchor 306 was being rechecked against authoritative servers, the in-flight 307 recheck could outlive the view that owned it and cause `named` to 308 crash. This has been fixed. :gl:`#5938` :gl:`!11966` 309 310 - Fix a bug in allow-query/allow-transfer catalog zone custom 311 properties. ``e962fd459e`` 312 313 The :iscman:`named` process could terminate unexpectedly when 314 processing a catalog zone with an invalid ``allow-query`` or 315 ``allow-transfer`` custom property (i.e. having a non-APL type) 316 coexisting with the valid property. This has been fixed. :gl:`#5941` 317 :gl:`!11975` 318 319 - Fix a stack use-after-free in qpzone. ``ddea991c07`` 320 321 In previous_closest_nsec(), a new qpreader was opened to search the 322 NSEC tree. It was possible for that to be used to update a QP iterator 323 object owned by the caller, and then be destroyed when the function 324 returned. 325 326 This has been addressed by having the caller open the NSEC qpreader 327 instead. :gl:`#5942` :gl:`!11956` 328 329 - Fix a memory leak issue in the catalog zones. ``5fcb6d8809`` 330 331 The :iscman:`named` process could leak small amounts of memory when 332 processing a catalog zone entry which had defined custom primary 333 servers with TSIG keys using both the regular ``primaries`` custom 334 property syntax and the legacy alternative syntax (``masters``) at the 335 same time. This has been fixed. :gl:`#5943` :gl:`!11973` 336 337 - Fix suppressed missing-glue check in named-checkzone. ``dc5eb3fe25`` 338 339 named-checkzone and named-checkconf -z silently skipped the 340 missing-glue check for any NS name that had already triggered an 341 extra-AAAA-glue warning, so zones missing required A glue could pass 342 validation and be deployed with broken delegations. :gl:`!11905` 343 344 - Implement seamless outgoing TCP connection reuse. ``eb117e16b9`` 345 346 The resolver can and will reuse outgoing TCP connections to the same 347 host, as recommended by RFC 7766. This prevents a whole class of 348 attacks that abuse the fact that establishing a TCP connection is 349 expensive and it is fairly easy to deplete the outgoing TCP ports by 350 putting them into TIME_WAIT state. 351 352 The number of pipelined queries per connection is capped at 256 to 353 limit the impact of a connection drop. :gl:`!11846` 354 355 - Pass empty string instead of NULL to ns_client_dumpmessage() 356 ``24cdf8c096`` 357 358 Pass "" instead of NULL to ns_client_dumpmessage() to get the log 359 message printed. 360 361 - Reject record sets too large to serve in DNS. ``933a8de056`` 362 363 When BIND was asked to store a record set whose total size exceeds 364 what fits in a DNS message, it would allocate memory and build the 365 structure, then fail later at response time. Such oversized record 366 sets are now rejected at the time of storage with an error, avoiding 367 wasted work on data that can never be served. :gl:`!11964` 368 369 370