Home | History | Annotate | Line # | Download | only in notes
      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