notes-9.20.29.rst revision 1.1 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.29
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 - Prevent excessive CPU use validating crafted DNSSEC responses.
19 1.1 christos :cve:`2026-19668`
20 1.1 christos
21 1.1 christos A malicious authoritative server could serve a securely delegated zone
22 1.1 christos whose DS and DNSKEY records carried many distinct key tags but no valid
23 1.1 christos match, forcing a validating resolver into excessive key-tag matching
24 1.1 christos and high CPU use for every query. This work is now bounded by the
25 1.1 christos per-query validation limit (:any:`max-validations-per-fetch`).
26 1.1 christos
27 1.1 christos ISC would like to thank Zuyao Xu and Xiang Li of the All-in-One
28 1.1 christos Security and Privacy Laboratory, Nankai University, for bringing this
29 1.1 christos vulnerability to our attention. :gl:`#5349`
30 1.1 christos
31 1.1 christos - Require a TSIG on every message of incoming zone transfers.
32 1.1 christos :cve:`2026-19033`
33 1.1 christos
34 1.1 christos Previously, :iscman:`named` accepted TSIG-signed zone transfers in
35 1.1 christos which some messages were unsigned, and processed those messages
36 1.1 christos before the next signature could vouch for them. It now requires a
37 1.1 christos TSIG on every message of an incoming AXFR or IXFR; all modern
38 1.1 christos nameservers already sign every message, so no change is expected in
39 1.1 christos practice. :gl:`#6062`
40 1.1 christos
41 1.1 christos - Prevent a DNSSEC downgrade of secure delegations via unrelated NSEC3
42 1.1 christos records. :cve:`2026-77119`
43 1.1 christos
44 1.1 christos A validating resolver could be tricked into treating a secure
45 1.1 christos delegation as unsigned and accepting forged answers for names beneath
46 1.1 christos it, if an attacker could inject responses to its queries. Such forged
47 1.1 christos proofs are now rejected. :gl:`#6234`
48 1.1 christos
49 1.1 christos - Prevent forged DNSSEC-validated NXDOMAIN responses. :cve:`2026-19941`
50 1.1 christos
51 1.1 christos A validating resolver could accept a signed NSEC record from an
52 1.1 christos unrelated zone as proof that a wildcard did not exist. An on-path
53 1.1 christos attacker or malicious forwarder controlling a signed zone could
54 1.1 christos therefore forge an authenticated NXDOMAIN response for a name that
55 1.1 christos should resolve through a wildcard. The wildcard-denial and
56 1.1 christos name-nonexistence proofs are now required to be signed by the same
57 1.1 christos zone. :gl:`#6253`
58 1.1 christos
59 1.1 christos - DNS64 with :any:`break-dnssec` could cause an assertion failure.
60 1.1 christos :cve:`2026-19666`
61 1.1 christos
62 1.1 christos When a :any:`dns64` statement is configured with ``break-dnssec yes;``
63 1.1 christos and its ``exclude`` list matches some but not all of the addresses in
64 1.1 christos an AAAA RRset, :iscman:`named` removes the excluded addresses from the
65 1.1 christos answer instead of synthesizing new ones. If the answer being filtered
66 1.1 christos had been cached together with a proof that the queried name did not
67 1.1 christos exist which is what a wildcard match produces :iscman:`named`
68 1.1 christos terminated with an assertion failure.
69 1.1 christos
70 1.1 christos Only recursive resolvers are affected, and only when
71 1.1 christos ``break-dnssec yes;`` is in use; the answer has to come from the
72 1.1 christos cache, so a server that is only authoritative cannot reach this.
73 1.1 christos
74 1.1 christos ISC would like to thank Rintaro Kawasugi for bringing this
75 1.1 christos vulnerability to our attention. :gl:`#6301`
76 1.1 christos
77 1.1 christos - Reject oversized negative cache records. :cve:`2026-19667`
78 1.1 christos
79 1.1 christos A single crafted response from a server could make a resolver cache a
80 1.1 christos malformed negative entry and then terminate with an assertion failure
81 1.1 christos when reading it back. Only recursive resolvers are affected, on a
82 1.1 christos default configuration.
83 1.1 christos
84 1.1 christos ISC would like to thank Rintaro Kawasugi for bringing this
85 1.1 christos vulnerability to our attention. :gl:`#6302`
86 1.1 christos
87 1.1 christos - Prevent resolver crash with cached DNSSEC proofs. :cve:`2026-19662`
88 1.1 christos
89 1.1 christos Under certain timing conditions, concurrent recursive queries could
90 1.1 christos cause :iscman:`named` to crash when cached DNSSEC NOQNAME proof data
91 1.1 christos was replaced while still in use. Cached proof data is now retained
92 1.1 christos until all queries using it have completed.
93 1.1 christos
94 1.1 christos ISC would like to thank Samy Medjahed/Ap4sh for bringing this
95 1.1 christos vulnerability to our attention. :gl:`#6333`
96 1.1 christos
97 1.1 christos - Discard repeated SOA, CNAME, and DNAME records when parsing DNS
98 1.1 christos messages. :cve:`2026-75029`
99 1.1 christos
100 1.1 christos A DNS message could carry the same SOA, CNAME, or DNAME record many
101 1.1 christos times, and :iscman:`named` kept every copy while parsing it. With name
102 1.1 christos compression those copies took up far more memory internally than in
103 1.1 christos the message itself, and every later processing step had to handle all
104 1.1 christos of them. Only the first copy of such a record is now kept; identical
105 1.1 christos repeats are discarded. :gl:`#6335`
106 1.1 christos
107 1.1 christos - Fix an unauthenticated crash on HTTPS using SIG(0). :cve:`2026-77692`
108 1.1 christos
109 1.1 christos A specifically crafted HTTPS query using SIG(0) as authentication
110 1.1 christos could crash :iscman:`named` if the client closed the connection before
111 1.1 christos :iscman:`named` actually verified the signature. This is now fixed.
112 1.1 christos
113 1.1 christos ISC would like to thank Vitaly Simonovich for bringing this
114 1.1 christos vulnerability to our attention. :gl:`#6343`
115 1.1 christos
116 1.1 christos - Cached HTTPS/SVCB aliases could exhaust resolver CPU.
117 1.1 christos :cve:`2026-81736`
118 1.1 christos
119 1.1 christos A recursive resolver that had cached a large set of interlinked HTTPS
120 1.1 christos or SVCB records in alias form could be driven to do an excessive
121 1.1 christos amount of work assembling a single response, because it followed every
122 1.1 christos cached alias target when building the additional section. A client
123 1.1 christos permitted to use recursion, together with an attacker-controlled zone
124 1.1 christos used to plant the records, could repeat small queries to consume
125 1.1 christos enough CPU to delay or deny service to other clients. The amount of
126 1.1 christos additional processing done for one query is now bounded.
127 1.1 christos
128 1.1 christos ISC would like to thank Henrique Pereira for bringing this
129 1.1 christos vulnerability to our attention. :gl:`#6347`
130 1.1 christos
131 1.1 christos - Prevent TKEY queries from terminating :iscman:`named` without global
132 1.1 christos options. :cve:`2026-76163`
133 1.1 christos
134 1.1 christos The :iscman:`named` process could terminate unexpectedly when a remote
135 1.1 christos client sent a TKEY query and the configuration did not include a
136 1.1 christos global :namedconf:ref:`options` statement. This has been fixed.
137 1.1 christos
138 1.1 christos ISC would like to thank Owais Lone (thesecguy) for bringing this
139 1.1 christos vulnerability to our attention. :gl:`#6357`
140 1.1 christos
141 1.1 christos - Out-of-zone records in a zone database could be served as
142 1.1 christos authoritative. :cve:`2026-78301`
143 1.1 christos
144 1.1 christos When a zone database contained records for names outside the zone
145 1.1 christos such as a delegation above the zone apex, left behind by a secondary
146 1.1 christos that had accepted out-of-zone data from its primary the server could
147 1.1 christos treat them as authoritative and answer queries for names inside the
148 1.1 christos zone with that out-of-zone data instead of the zone's own. A server
149 1.1 christos that was also a resolver could follow such a delegation and cache the
150 1.1 christos answers of the server it named, affecting names outside the configured
151 1.1 christos zone. Zone database lookups are now confined to names at or below the
152 1.1 christos zone's origin.
153 1.1 christos
154 1.1 christos ISC would like to thank Henrique Pereira for bringing this
155 1.1 christos vulnerability to our attention. :gl:`#6361`
156 1.1 christos
157 1.1 christos - Fix crash on wildcard answers carrying both NSEC and NSEC3 proofs.
158 1.1 christos :cve:`2026-80274`
159 1.1 christos
160 1.1 christos When a wildcard answer arrived with both NSEC and NSEC3 records at the
161 1.1 christos name proving that the queried name did not exist, the resolver could
162 1.1 christos pick different records when caching the answer and when retrieving the
163 1.1 christos proof, depending on the order in which the authoritative server sent
164 1.1 christos them. This could terminate :iscman:`named` with an assertion failure,
165 1.1 christos fail the query with SERVFAIL, or serve a denial record other than the
166 1.1 christos one that had been verified. The resolver now caches and serves the
167 1.1 christos same denial record it accepted when the answer was received.
168 1.1 christos
169 1.1 christos ISC would like to thank hythyt for bringing this vulnerability to our
170 1.1 christos attention. :gl:`#6369`
171 1.1 christos
172 1.1 christos - Following HTTPS/SVCB aliases could leak resolver cache memory.
173 1.1 christos :cve:`2026-81563`
174 1.1 christos
175 1.1 christos When a recursive server answered a query for an HTTPS or SVCB record
176 1.1 christos in alias form and the alias target had more than 13 records, the
177 1.1 christos target records were pinned in the cache permanently instead of being
178 1.1 christos released once the answer was sent. A remote party who could make the
179 1.1 christos server follow such aliases to a steady stream of fresh names could
180 1.1 christos grow the cache beyond the configured :any:`max-cache-size` until the
181 1.1 christos server was unable to resolve unrelated names. The records are now
182 1.1 christos released correctly.
183 1.1 christos
184 1.1 christos ISC would like to thank Samy Medjahed/Ap4sh for bringing this
185 1.1 christos vulnerability to our attention. :gl:`#6374`
186 1.1 christos
187 1.1 christos Feature Changes
188 1.1 christos ~~~~~~~~~~~~~~~
189 1.1 christos
190 1.1 christos - Reject oversized and malformed DNSKEY records up front.
191 1.1 christos
192 1.1 christos Oversized RSA key material in a DNSKEY record was only rejected after
193 1.1 christos it had been converted, allocating memory proportional to the record
194 1.1 christos size. Such records are now rejected before conversion, as are Ed25519
195 1.1 christos and Ed448 keys with trailing bytes that were previously silently
196 1.1 christos ignored. :gl:`#4537`
197 1.1 christos
198 1.1 christos Bug Fixes
199 1.1 christos ~~~~~~~~~
200 1.1 christos
201 1.1 christos - Prevent a crash when using both :any:`dns64` and ``filter-a``.
202 1.1 christos
203 1.1 christos An assertion failure was possible when using both :any:`dns64` and the
204 1.1 christos ``filter-a`` plugin simultaneously; this has been fixed.
205 1.1 christos :gl:`#5979`
206 1.1 christos
207 1.1 christos - Stop passing UDP client addresses to :any:`update-policy` ``external``
208 1.1 christos helpers.
209 1.1 christos
210 1.1 christos Dynamic update rules of type ``external`` delegate the authorization
211 1.1 christos decision to an external helper daemon. The client address field in
212 1.1 christos the helper request is only meant to carry TCP client addresses, which
213 1.1 christos cannot easily be spoofed, but UDP client addresses were passed as
214 1.1 christos well, so the helper could base its decision on an untrustworthy
215 1.1 christos address. For updates arriving over UDP, the helper request no longer
216 1.1 christos includes a client address. :gl:`#6061`
217 1.1 christos
218 1.1 christos - Missing required NSEC3 for delegation not detected.
219 1.1 christos
220 1.1 christos A missing required NSEC3 record for an insecure delegation in a
221 1.1 christos non-opt-out range was not being detected. This has been fixed.
222 1.1 christos :gl:`#6063`
223 1.1 christos
224 1.1 christos - Tighten EUI48 and EUI64 text parsing.
225 1.1 christos
226 1.1 christos Malformed EUI48 and EUI64 records could be accepted. This has been
227 1.1 christos fixed. :gl:`#6082`
228 1.1 christos
229 1.1 christos - GeoIP ACL state could be stale or wrong after reload.
230 1.1 christos
231 1.1 christos Previously, :iscman:`named` cached GeoIP information after looking it
232 1.1 christos up, but the cached information was not invalidated when the GeoIP
233 1.1 christos database was reloaded, so it could continue to be used. Existing
234 1.1 christos cached GeoIP information is now invalidated as part of the reloading
235 1.1 christos process. :gl:`#6083`
236 1.1 christos
237 1.1 christos - Honor DNSSEC policy key tag ranges.
238 1.1 christos
239 1.1 christos When a :any:`dnssec-policy` configured a non-default ``tag-range``,
240 1.1 christos :iscman:`dnssec-keygen` and :iscman:`dnssec-ksr` could accept
241 1.1 christos generated keys outside that range. Both tools now honor the configured
242 1.1 christos minimum and maximum key tags. :gl:`#6091`
243 1.1 christos
244 1.1 christos - Fix a double free in :iscman:`mdig` when EDNS options are specified.
245 1.1 christos
246 1.1 christos The :iscman:`mdig` utility could terminate with a double free when
247 1.1 christos EDNS options were specified on the command line. This has been fixed.
248 1.1 christos :gl:`#6095`
249 1.1 christos
250 1.1 christos - Fix a crash when an IXFR falls back to AXFR with updates still
251 1.1 christos pending.
252 1.1 christos
253 1.1 christos When a secondary zone received an incremental transfer (IXFR) and the
254 1.1 christos primary then caused :iscman:`named` to fall back to a full transfer
255 1.1 christos (AXFR) while some of the already-received incremental changes were
256 1.1 christos still waiting to be applied, :iscman:`named` could later crash when
257 1.1 christos that transfer finished. The pending changes are now discarded
258 1.1 christos correctly before the AXFR retry. :gl:`#6114`
259 1.1 christos
260 1.1 christos - Fix DS requests to parental agents over TLS.
261 1.1 christos
262 1.1 christos TLS configuration for parental agents was being ignored when sending
263 1.1 christos DS requests. This has been fixed. :gl:`#6135`
264 1.1 christos
265 1.1 christos - Fix the :option:`rndc-confgen -q` (quiet) option.
266 1.1 christos
267 1.1 christos The command-line parsing in :iscman:`rndc-confgen` was broken, so
268 1.1 christos :option:`rndc-confgen -q` did not work. This has been fixed.
269 1.1 christos :gl:`#6187`
270 1.1 christos
271 1.1 christos - Enforce query ACLs for redirect zones and searched DLZs.
272 1.1 christos
273 1.1 christos Queries answered from redirect zones or searched DLZ databases did not
274 1.1 christos consistently honor :any:`allow-query` and :any:`allow-query-on`,
275 1.1 christos potentially exposing restricted DNS data to excluded clients or
276 1.1 christos through excluded listening addresses. These ACLs are now enforced
277 1.1 christos before redirect or DLZ data is returned. :gl:`#6251` :gl:`#6252`
278 1.1 christos
279 1.1 christos - Check ``asnum`` validity in GeoIP ACLs.
280 1.1 christos
281 1.1 christos The validity of autonomous system (AS) numbers is now checked at
282 1.1 christos configuration time when parsing GeoIP ACLs that use ``asnum``
283 1.1 christos elements.
284 1.1 christos
285 1.1 christos ``asnum`` values start with an optional case-insensitive ``AS``
286 1.1 christos prefix, followed only by decimal digits, with no spaces or other
287 1.1 christos extraneous characters. The value represented cannot exceed 2^32.
288 1.1 christos :gl:`#6255`
289 1.1 christos
290 1.1 christos - Fix a crash on :any:`remote-servers` lists that reference themselves.
291 1.1 christos
292 1.1 christos Since 9.21.16 and 9.20.17, a :any:`remote-servers`, :any:`primaries`,
293 1.1 christos ``masters``, or :any:`parental-agents` list that referenced itself,
294 1.1 christos directly or through another list, made :iscman:`named` crash on
295 1.1 christos startup or reconfiguration. Such references are again skipped and the
296 1.1 christos remaining entries in the list are used, as in earlier versions.
297 1.1 christos :gl:`#6287`
298 1.1 christos
299 1.1 christos - A record from outside a response policy zone could crash
300 1.1 christos :iscman:`named`.
301 1.1 christos
302 1.1 christos A response policy zone transferred from a primary can contain a record
303 1.1 christos whose name lies outside the zone. Such a record could terminate
304 1.1 christos :iscman:`named` with an assertion failure, both when it arrived and
305 1.1 christos again at every startup afterwards, because a secondary keeps it in its
306 1.1 christos own copy of the zone. Records like this are now rejected and logged;
307 1.1 christos previously one could also silently create a policy entry for an
308 1.1 christos unrelated name. :gl:`#6304`
309 1.1 christos
310 1.1 christos - Invalid :any:`key-store` configuration could abort the DNSSEC tools.
311 1.1 christos
312 1.1 christos An invalid :any:`key-store` block named ``key-directory`` in a
313 1.1 christos configuration file could abort the DNSSEC tools. This has been fixed.
314 1.1 christos :gl:`#6313`
315 1.1 christos
316 1.1 christos - NSEC signature set could bypass the secure-delegation check.
317 1.1 christos
318 1.1 christos When proving that a delegation was insecure, the validator bounded an
319 1.1 christos NSEC record's authority by the signer of whichever RRSIG happened to
320 1.1 christos come first in the record's signature set, rather than the signature
321 1.1 christos that actually verified. A grandparent NSEC padded with an extra,
322 1.1 christos unverifiable signature could therefore pass the check that kept such
323 1.1 christos proofs from reaching below a signed child zone. The validator now
324 1.1 christos requires every signature on the NSEC to name the same signer and
325 1.1 christos refuses proofs whose signature set is malformed or larger than
326 1.1 christos :any:`max-validations-per-fetch` allows. :gl:`#6321`
327 1.1 christos
328 1.1 christos - Fix a possible :iscman:`nsupdate` issue when using GSS-TSIG.
329 1.1 christos
330 1.1 christos The :iscman:`nsupdate` process could terminate unexpectedly when using
331 1.1 christos the GSS-TSIG mode executed with the :option:`nsupdate -g` option. This
332 1.1 christos has been fixed. :gl:`#6325`
333 1.1 christos
334 1.1 christos - Fix a crash with a single-element ``geoip`` sortlist.
335 1.1 christos
336 1.1 christos If :iscman:`named` was configured with a single-element
337 1.1 christos :any:`sortlist` containing a ``geoip`` ACL element, any matching query
338 1.1 christos triggered an assertion failure. This has been fixed. :gl:`#6342`
339 1.1 christos
340 1.1 christos - Prevent out-of-bailiwick CNAMEs from evicting cached records.
341 1.1 christos
342 1.1 christos A recursive resolver could remove valid cached records when a DNS
343 1.1 christos response contained an out-of-bailiwick CNAME with the same owner name.
344 1.1 christos Out-of-bailiwick data is now discarded before it can modify the cache.
345 1.1 christos :gl:`#6345`
346 1.1 christos
347 1.1 christos - Restore periodic cleanup of stale resolver address data.
348 1.1 christos
349 1.1 christos Stale resolver address data could remain cached until memory pressure
350 1.1 christos or an explicit flush. The cleanup interval has been corrected, so
351 1.1 christos stale entries are removed periodically again. :gl:`#6346`
352 1.1 christos
353 1.1 christos - Fix :iscman:`named-checkconf`/:iscman:`named` crash with malformed
354 1.1 christos key name.
355 1.1 christos
356 1.1 christos When a primary/remote-server key name was malformed,
357 1.1 christos :iscman:`named-checkconf` and :iscman:`named` were both crashing
358 1.1 christos (after warning about the invalid key name). This is now fixed.
359 1.1 christos :gl:`#6362`
360 1.1 christos
361 1.1 christos - Prevent resolver crashes while processing DNS over TCP.
362 1.1 christos
363 1.1 christos Recursive resolvers could terminate with an assertion failure while
364 1.1 christos processing DNS responses over TCP under sustained traffic. The failure
365 1.1 christos was observed on resolvers configured globally with ``forward only;``,
366 1.1 christos but the same transport path is also used by iterative resolution.
367 1.1 christos This has been fixed. :gl:`!12537`
368