notes-9.20.26.rst revision 1.1 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