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.29 13 ------------ 14 15 Security Fixes 16 ~~~~~~~~~~~~~~ 17 18 - [CVE-2026-19668] Prevent excessive CPU use validating crafted DNSSEC 19 responses. ``a0a61dba9e`` 20 21 A malicious authoritative server could serve a securely delegated zone 22 whose DS and DNSKEY records carry many distinct key tags but no valid 23 match, forcing a validating resolver into excessive key-tag matching 24 and high CPU use for every query. BIND now bounds this work with the 25 per-query validation limit (max-validations-per-fetch). :gl:`#5349` 26 27 - [CVE-2026-19033] Require a TSIG on every message of incoming zone 28 transfers. ``9404cd2b8c`` 29 30 BIND 9 used to accept TSIG-signed zone transfers in which some 31 messages were unsigned, and processed those messages before the next 32 signature could vouch for them. It now requires a TSIG on every 33 message of an incoming AXFR or IXFR; all modern nameserver already 34 sign every message, so no change is expected in practice. :gl:`#6062` 35 36 - [CVE-2026-77119] Prevent a DNSSEC downgrade of secure delegations via 37 unrelated NSEC3. ``3bed9c8e9e`` 38 39 A validating resolver could be tricked into treating a secure 40 delegation as unsigned and accepting forged answers for names beneath 41 it, if an attacker could inject responses to its queries. Such forged 42 proofs are now rejected. :gl:`#6234` 43 44 - [CVE-2026-19941] Prevent forged DNSSEC-validated NXDOMAIN responses. 45 ``a36bf58daf`` 46 47 A validating resolver could accept a signed NSEC record from an 48 unrelated zone as proof that a wildcard did not exist. An on-path 49 attacker or malicious forwarder controlling a signed zone could 50 therefore forge an authenticated NXDOMAIN response for a name that 51 should resolve through a wildcard. BIND now requires the 52 wildcard-denial and name-nonexistence proofs to be signed by the same 53 zone. :gl:`#6253` 54 55 - [CVE-2026-19666] DNS64 with break-dnssec could cause an assertion 56 failure. ``4cec4965c4`` 57 58 When a "dns64" statement is configured with "break-dnssec yes" and its 59 "exclude" list matches some but not all of the addresses in an AAAA 60 RRset, named removes the excluded addresses from the answer instead of 61 synthesizing new ones. If the answer being filtered had been cached 62 together with a proof that the queried name does not exist -- which is 63 what a wildcard match produces -- named terminated with an assertion 64 failure. 65 66 Only recursive resolvers are affected, and only when "break-dnssec 67 yes" is in use; the answer has to come from the cache, so a server 68 that is only authoritative cannot reach this. :gl:`#6301` 69 70 - [CVE-2026-19667] Reject negative cache records that do not fit in a 71 dns_rdata_t. ``dbf08c8581`` 72 73 A single crafted response from a server could make a resolver cache a 74 malformed negative entry and then terminate with an assertion failure 75 when reading it back. Only recursive resolvers are affected, on a 76 default configuration. :gl:`#6302` 77 78 - [CVE-2026-19662] Prevent resolver crash with cached DNSSEC proofs. 79 ``c884cc1ba0`` 80 81 Under certain timing conditions, concurrent recursive queries could 82 cause named to crash when cached DNSSEC NOQNAME proof data was 83 replaced while still in use. Cached proof data is now retained until 84 all queries using it have completed. :gl:`#6333` 85 86 - [CVE-2026-75029] Discard repeated SOA, CNAME, and DNAME records when 87 parsing DNS messages. ``0d630758c2`` 88 89 A DNS message could carry the same SOA, CNAME, or DNAME record many 90 times, and named kept every copy while parsing it. With name 91 compression those copies took up far more memory internally than in 92 the message itself, and every later processing step had to handle all 93 of them. named now keeps the first copy of such a record and discards 94 identical repeats. :gl:`#6335` 95 96 - [CVE-2026-77692] Fix an unauthenticated crash on HTTPS using SIG(0) 97 ``5a24401c5c`` 98 99 A specifically crafted HTTPS query using SIG(0) as authentication 100 could crash named if the client closes the connection before named 101 actually verifies the signature. This is now fixed. :gl:`#6343` 102 103 - [CVE-2026-81736] Cached HTTPS/SVCB aliases could exhaust resolver CPU. 104 ``20bbb1639a`` 105 106 A recursive resolver that had cached a large set of interlinked HTTPS 107 or SVCB records in alias form could be driven to do an excessive 108 amount of work assembling a single response, because it followed every 109 cached alias target when building the additional section. A client 110 permitted to use recursion, together with an attacker-controlled zone 111 used to plant the records, could repeat small queries to consume 112 enough CPU to delay or deny service to other clients. The amount of 113 additional processing done for one query is now bounded. :gl:`#6347` 114 115 - [CVE-2026-76163] Prevent TKEY queries from terminating named without 116 global options. ``7645138538`` 117 118 named could terminate unexpectedly when a remote client sent a TKEY 119 query if the configuration did not include a global options statement. 120 This has been fixed. 121 122 ISC thanks Owais Lone (thesecguy) for reporting the issue. :gl:`#6357` 123 124 - [CVE-2026-78301] Out-of-zone records in a zone database could be 125 served as authoritative. ``72a10c3a0b`` 126 127 When a zone database contained records for names outside the zone 128 such as a delegation above the zone apex, left behind by a secondary 129 that had accepted out-of-zone data from its primary the server could 130 treat them as authoritative and answer queries for names inside the 131 zone with that out-of-zone data instead of the zone's own. A server 132 that was also a resolver could follow such a delegation and cache the 133 answers of the server it named, affecting names outside the configured 134 zone. Zone database lookups are now confined to names at or below the 135 zone's origin. 136 137 ISC would like to thank Henrique Pereira for reporting the issue. 138 :gl:`#6361` 139 140 - [CVE-2026-80274] Crash on wildcard answers carrying both NSEC and 141 NSEC3 proofs. ``0e44451b1a`` 142 143 When a wildcard answer arrived with both NSEC and NSEC3 records at the 144 name proving that the queried name does not exist, the resolver could 145 pick different records when caching the answer and when retrieving the 146 proof, depending on the order in which the authoritative server sent 147 them. This could terminate named with an assertion failure, fail the 148 query with SERVFAIL, or serve a denial record other than the one that 149 had been verified. The resolver now caches and serves the same denial 150 record it accepted when the answer was received. 151 152 ISC would like to thank hythyt for reporting the issue. :gl:`#6369` 153 154 - [CVE-2026-81563] Following HTTPS/SVCB aliases could leak resolver 155 cache memory. ``3162df369e`` 156 157 When a recursive server answered a query for an HTTPS or SVCB record 158 in alias form and the alias target had more than 13 records, the 159 target records were pinned in the cache permanently instead of being 160 released once the answer was sent. A remote party who could make the 161 server follow such aliases to a steady stream of fresh names could 162 grow the cache beyond the configured max-cache-size until the server 163 was unable to resolve unrelated names. The records are now released 164 correctly. 165 166 ISC would like to thank Samy Medjahed/Ap4sh for reporting the issue. 167 :gl:`#6374` 168 169 New Features 170 ~~~~~~~~~~~~ 171 172 - Add an agent skill for the isc_job/isc_async/isc_work APIs. 173 ``fe32990b06`` 174 175 Documents when to use isc_job_run(), isc_async_run() or 176 isc_work_enqueue(), and the contract each one imposes. No functional 177 change. :gl:`!12561` 178 179 Removed Features 180 ~~~~~~~~~~~~~~~~ 181 182 - Remove unused closest encloser proof caching. ``abd8b5bfd8`` 183 184 BIND used to cache an NSEC3 closest encloser proof alongside positive 185 wildcard answers so that a resolver could re-send it when answering 186 from its cache. That stopped being used in BIND 9.9 (2011), when 187 positive wildcard responses were changed to omit that NSEC3 record 188 RFC 5155 requires only the next closer name proof and the closest 189 encloser came to be derived during validation instead. The caching 190 code has been unreachable ever since, so this removes it with no 191 change in behaviour. :gl:`#5803` :gl:`!12660` 192 193 Feature Changes 194 ~~~~~~~~~~~~~~~ 195 196 - Reject oversized and malformed DNSKEY records up front. ``6c22109924`` 197 198 Oversized RSA key material in a DNSKEY record was only rejected after 199 it had been converted, allocating memory proportional to the record 200 size. Such records are now rejected before conversion, as are Ed25519 201 and Ed448 keys with trailing bytes that were previously silently 202 ignored. :gl:`#4537` :gl:`!12560` 203 204 Bug Fixes 205 ~~~~~~~~~ 206 207 - Prevent a crash when using both dns64 and filter-a. ``bce5d10d18`` 208 209 An assertion failure was possible when using both `dns64` and the 210 `filter-a` plugin simultaneously; this has been fixed. :gl:`#5979` 211 :gl:`!12663` 212 213 - Fix update-policy grant external address passing. ``b1e955c326`` 214 215 Only TCP client addresses are supposed to be passed to an `external` 216 handler for the associated `update-policy` rule, but UDP client 217 addresses were also being passed. This could have caused the external 218 handler to return a result it otherwise wouldn't. This has been fixed. 219 :gl:`#6061` :gl:`!12555` 220 221 - Missing required NSEC3 for delegation not detected. ``e84ed2e9d7`` 222 223 A missing required NSEC3 record for an insecure delegation in a non 224 OPTOUT range was not being detected. This has been fixed. :gl:`#6063` 225 :gl:`!12611` 226 227 - Tighten EUI48 and EUI48 text parsing. ``ff50f2cdf1`` 228 229 Malformed EUI48 and EUI64 records could be accepted. This has been 230 fixed. :gl:`#6082` :gl:`!12521` 231 232 - GeoIP ACL state can be stale or wrong after reload. ``63baf425b3`` 233 234 `named` caches GeoIP information after looking it up, but the cached 235 information was not invalidated when the GeoIP database was reloaded, 236 so it could continue to be used. We now invalidate existing cached 237 GeoIP information as part of the reloading process. :gl:`#6083` 238 :gl:`!12662` 239 240 - Honor DNSSEC policy key tag ranges. ``b82e5834b7`` 241 242 When a DNSSEC policy configured a non-default tag-range, dnssec-keygen 243 and dnssec-ksr could accept generated keys outside that range. Both 244 tools now honor the configured minimum and maximum key tags. 245 :gl:`#6091` :gl:`!12549` 246 247 - Fix double free in mdig when EDNS options are specified. 248 ``af5bd0b0ff`` 249 250 When the default_query is cloned the EDNS options need to be cloned 251 rather than the pointer copied. The old behaviour results in a double 252 free of the options. This has been fixed. :gl:`#6095` :gl:`!12661` 253 254 - Fix a crash when an IXFR falls back to AXFR with updates still 255 pending. ``e34062bc7e`` 256 257 When a secondary zone received an incremental transfer (IXFR) and the 258 primary then caused named to fall back to a full transfer (AXFR) while 259 some of the already-received incremental changes were still waiting to 260 be applied, named could later crash when that transfer finished. The 261 pending changes are now discarded correctly before the AXFR retry. 262 :gl:`#6114` :gl:`!12624` 263 264 - Fix DS requests to parental agents over TLS. ``55830d30f6`` 265 266 TLS configuration for parental agents was being ignored when sending 267 DS requests. This has been fixed. :gl:`#6135` :gl:`!12613` 268 269 - Fix a crash when resolving names below a cached DNAME. ``b94e940f52`` 270 271 A recursive resolver could crash when it answered a query for a name 272 beneath a cached DNAME while that same DNAME record was concurrently 273 refreshed or evicted from the cache. :gl:`#6182` :gl:`!12593` 274 275 - Rndc-confgen `-q` (quiet) option is documented but doesn't work. 276 ``7e4a7ca1a7`` 277 278 The command line parsing in rndc-confgen was broken so `rndc-confgen 279 -q` did not work. This has been fixed. :gl:`#6187` :gl:`!12575` 280 281 - Enforce query ACLs for redirect zones and searched DLZs. 282 ``bc69876b2e`` 283 284 Queries answered from redirect zones or searched DLZ databases did not 285 consistently honor `allow-query` and `allow-query-on`, potentially 286 exposing restricted DNS data to excluded clients or through excluded 287 listening addresses. These ACLs are now enforced before redirect or 288 DLZ data is returned. :gl:`#6251`, #6252 :gl:`!12646` 289 290 - Check "asnum" validity in GeoIP ACLs. ``28c2bfdc7b`` 291 292 We now check the validity of autonomous system (AS) numbers when 293 parsing GeoIP ACLs that use `asnum` elements at configuration time. 294 295 `asnum` values start with an optional case-insensitive "AS" prefix, 296 followed only by decimal digits, with no spaces or other extraneous 297 characters. The value represented cannot exceed 2^32. :gl:`#6255` 298 :gl:`!12511` 299 300 - Prevent crashes while reporting DNSSEC signing statistics. 301 ``c190514f0a`` 302 303 Servers with zone-statistics full could terminate while reporting 304 DNSSEC signing statistics for a zone tracking adding more than four 305 signing keys. :gl:`#6256` :gl:`!12674` 306 307 - Fix various nits in the netmgr code. ``c28cdad51b`` 308 309 The MR consists of couple of small fixes and uncaught errors in the 310 Network Manager. :gl:`#6257` :gl:`!12576` 311 312 - Fix a crash on remote-servers lists that reference themselves. 313 ``aaae614f9d`` 314 315 Since 9.21.16 and 9.20.17, a remote-servers, primaries, masters, or 316 parental-agents list that referenced itself, directly or through 317 another list, made named crash on startup or reconfiguration. Such 318 references are again skipped and the remaining entries in the list are 319 used, as in earlier versions. :gl:`#6287` :gl:`!12604` 320 321 - A record from outside a response policy zone could stop named. 322 ``d135513b37`` 323 324 A response policy zone transferred from a primary can contain a record 325 whose name lies outside the zone. Such a record could stop named, both 326 when it arrived and again at every startup afterwards, because a 327 secondary keeps it in its own copy of the zone. Records like this are 328 now rejected and logged; previously one could also silently create a 329 policy entry for an unrelated name. :gl:`#6304` :gl:`!12543` 330 331 - "rndc flushtree ." failed to flush the cache. ``96e8b585ed`` 332 333 `rndc flushtree` flushes cache data below a specified name. If the 334 name specified is the DNS root, it should fully empty the cache, the 335 same as `rndc flush`. However, there was a bug causing the command, 336 in that case, to have no effect on the cache at all; this has been 337 fixed. :gl:`#6308` :gl:`!12582` 338 339 - Invalid key-store configuration could abort the DNSSEC tools. 340 ``1d796ab072`` 341 342 Invalid configured key-stores named "key-directory" in configuration 343 files could abort the DNSSEC tools. This has been fixed. :gl:`#6313` 344 :gl:`!12653` 345 346 - NSEC signature set could bypass the secure-delegation check. 347 ``c966177f6c`` 348 349 When proving that a delegation is insecure, the validator bounded an 350 NSEC record's authority by the signer of whichever RRSIG happened to 351 come first in the record's signature set, rather than the signature 352 that actually verified. A grandparent NSEC padded with an extra, 353 unverifiable signature could therefore pass the check that keeps such 354 proofs from reaching below a signed child zone. The validator now 355 requires every signature on the NSEC to name the same signer and 356 refuses proofs whose signature set is malformed or larger than 357 max-validations-per-fetch allows. :gl:`#6321` 358 359 - Fix a possible nsupdate issue when using GSS-TSIG. ``4ddcab2d3c`` 360 361 The :iscman:`nsupdate` process could terminate unexpectedly when using 362 the GSS-TSIG mode executed with the :option:`nsupdate -g` option. This 363 has been fixed. :gl:`#6325` :gl:`!12588` 364 365 - Fix isccc_alist_define error paths. ``af1349552a`` 366 367 If there is an out of memory error in isccc_alist_define a memory leak 368 (the sexpr holding the key name) or a double free (value) could occur. 369 This has been fixed. :gl:`#6329` :gl:`!12636` 370 371 - Check for empty 'endpoints' list. ``23f58af443`` 372 373 Configuring an `http` block with `endpoints {};` previously caused a 374 crash in `named`. This is now rejected earlier by the configuration 375 check. :gl:`#6330` :gl:`!12552` 376 377 - Named could crash with a single-element geoip sortlist. ``0e996a4d3b`` 378 379 If `named` was configured with a single-element sortlist containing a 380 `geoip` ACL element, any matching query triggered an assertion 381 failure. This has been fixed. :gl:`#6342` :gl:`!12583` 382 383 - Prevent out-of-bailiwick CNAMEs from evicting cached records. 384 ``cdedd4acd5`` 385 386 A recursive resolver could remove valid cached records when a DNS 387 response contained an out-of-bailiwick CNAME with the same owner name. 388 Out-of-bailiwick data is now discarded before it can modify the cache. 389 :gl:`#6345` :gl:`!12651` 390 391 - Restore periodic cleanup of stale resolver address data. 392 ``356f4013f8`` 393 394 Stale resolver address data could remain cached until memory pressure 395 or an explicit flush. Correct the cleanup interval so it is removed 396 periodically. :gl:`#6346` :gl:`!12589` 397 398 - Fix named-checkconf/named crash with malformed key name. 399 ``9f218f6aaf`` 400 401 When a primary/remote-server key name was malformed, named-checkconf 402 and named were both crashing (after warning about the invalid key 403 name). This is now fixed. :gl:`#6362` :gl:`!12639` 404 405 - Fix -Wformat-truncation warning in totext_in_wks() ``f97c2bea40`` 406 407 BIND 9 failed to build with GCC 16 at -O3: rendering a WKS record as 408 text triggered a -Wformat-truncation error, which is fatal in 409 developer builds. The port number is now printed with a 16-bit format 410 specifier, so the compiler can see it always fits the output buffer. 411 :gl:`!12542` 412 413 - Fix off-by-one errors caused by magic hardcoded values. ``726c6cb795`` 414 415 Fix off-by-one comparinson errors: "named -p http=" dropped the first 416 digit of the given port (for example, "http=8080" selected port 80) 417 and now uses the port as given, and "named-rrchecker -C" compared only 418 part of the "CLASS" prefix when filtering generic class names, which 419 was harmless in practice but is now corrected. :gl:`!12616` 420 421 - Hmac_verify() now accepts truncated HMACs only when requested. 422 ``c81b111496`` 423 424 The hmac_verify() function incorrectly compares only up to 425 'sig->length' bytes, but the signature and its length should not be 426 trusted, e.g. in case if it comes from a user query. 427 428 Don't accept signatures which length isn't equal to the expected 429 calculated HMAC length unless it is explicitly requested by the 430 caller, e.g. for truncated TSIG [1] support. 431 432 [1] https://datatracker.ietf.org/doc/html/rfc8945#name-tsig-truncation 433 -policy :gl:`!12629` 434 435 - Prevent resolver crashes while processing DNS over TCP. ``81b3b6d89f`` 436 437 Recursive resolvers could terminate with an assertion failure while 438 processing DNS responses over TCP under sustained traffic. The failure 439 was observed on resolvers configured globally with forward only; the 440 same transport path is also used by iterative resolution. This has 441 been fixed. :gl:`!12537` 442 443 444