notes-9.20.26.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.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