Commit Graph
11543 Commits
Author SHA1 Message Date
Ondřej SurýandMichał Kępień db083a2172 Add normal and slow task queues
Split the task manager queues into normal and slow task queues, so we
can move the tasks that blocks processing for a long time (like DNSSEC
validation) into the slow queue which doesn't block fast
operations (like responding from the cache).  This mitigates the whole
class of KeyTrap-like issues.
2024-02-22 13:22:01 +01:00
Mark AndrewsandMichał Kępień 8b7ecba988 Fail the DNSSEC validation on the first failure
Be more strict when encountering DNSSEC validation failures - fail on
the first failure.  This will break domains that have DNSSEC signing
keys with duplicate key ids, but this is something that's much easier
to fix on the authoritative side, so we are just going to be strict
on the resolver side where it is causing performance problems.
2024-02-22 13:22:01 +01:00
Ondřej SurýandMichał Kępień 418b379359 Fix case insensitive matching in isc_ht hash table implementation
The case insensitive matching in isc_ht was basically completely broken
as only the hashvalue computation was case insensitive, but the key
comparison was always case sensitive.

(cherry picked from commit c462d65b2f)
2024-02-22 12:00:47 +01:00
Mark AndrewsandMichał Kępień c6026cbbaa Apply various tweaks specific to BIND 9.11 2024-02-22 12:00:47 +01:00
Evan HuntandMichał Kępień bbbcaf8b2e fix another message parsing regression
The fix for CVE-2023-4408 introduced a regression in the message
parser, which could cause a crash if an rdata type that can only
occur in the question was found in another section.

(cherry picked from commit 510f1de8a6)
2024-02-22 12:00:47 +01:00
Evan HuntandMichał Kępień 98ab8c81cc fix a message parsing regression
the fix for CVE-2023-4408 introduced a regression in the message
parser, which could cause a crash if duplicate rdatasets were found
in the question section. this commit ensures that rdatasets are
correctly disassociated and freed when this occurs.

(cherry picked from commit 4c19d35614)
2024-02-22 12:00:47 +01:00
Matthijs MekkingandMichał Kępień 1296d37687 Fix windows build, remove external symbols
The functions dns_message_find and dns_message_movename have been
removed. Remove the symbols from libdns.def.in to fix the windows
build.

(cherry picked from commit c44965af33)
2024-02-22 12:00:47 +01:00
Ondřej SurýandMichał Kępień 2fc28056b3 Backport isc_ht API changes from BIND 9.18
To prevent allocating large hashtable in dns_message, we need to
backport the improvements to isc_ht API from BIND 9.18+ that includes
support for case insensitive keys and incremental rehashing of the
hashtables.

(cherry picked from commit a4baf32415)
2024-02-22 12:00:47 +01:00
Ondřej SurýandMichał Kępień 0ceed03ebe Use hashtable when parsing a message
When parsing messages use a hashtable instead of a linear search to reduce
the amount of work done in findname when there's more than one name in
the section.

There are two hashtables:

1) hashtable for owner names - that's constructed for each section when we
hit the second name in the section and destroyed right after parsing
that section;

2) per-name hashtable - for each name in the section, we construct a new
hashtable for that name if there are more than one rdataset for that
particular name.

(cherry picked from commit b8a9631754)
2024-02-22 12:00:47 +01:00
Ondřej Surý 8f62e95d3e Optimize cname_and_other_data to stop as earliest as possible
Stop the cname_and_other_data processing if we already know that the
result is true.  Also, we know that CNAME will be placed in the priority
headers, so we can stop looking for CNAME if we haven't found CNAME and
we are past the priority headers.

(cherry picked from commit 3f774c2a8a)
2024-02-08 09:47:58 +01:00
Ondřej Surý 23a4652346 Optimize the slabheader placement for certain RRTypes
Mark the infrastructure RRTypes as "priority" types and place them at
the beginning of the rdataslab header data graph.  The non-priority
types either go right after the priority types (if any).

(cherry picked from commit 3ac482be7f)
2024-02-08 09:46:19 +01:00
Ondřej Surý 08ac45897b Fix missing RRSIG for CNAME with different slabheader order
The cachedb was missing piece of code (already found in zonedb) that
would make lookups in the slabheaders to miss the RRSIGs for CNAME if
the order of CNAME and RRSIG(CNAME) was reversed in the node->data.

(cherry picked from commit 5070c7f5c7)
2024-02-08 09:45:13 +01:00
Mark AndrewsandMichał Kępień 639e5b671c Limit isccc_cc_fromwire recursion depth
Named and rndc do not need a lot of recursion so the depth is
set to 10.

(cherry picked from commit 820b0cceef)
2023-09-22 12:40:39 +02:00
Ondřej Surý 0b12907a1c Improve RBT overmem cache cleaning
When cache memory usage is over the configured cache size (overmem) and
we are cleaning unused entries, it might not be enough to clean just two
entries if the entries to be expired are smaller than the newly added
rdata.  This could be abused by an attacker to cause a remote Denial of
Service by possibly running out of the operating system memory.

Currently, the addrdataset() tries to do a single TTL-based cleaning
considering the serve-stale TTL and then optionally moves to overmem
cleaning if we are in that condition.  Then the overmem_purge() tries to
do another single TTL based cleaning from the TTL heap and then continue
with LRU-based cleaning up to 2 entries cleaned.

Squash the TTL-cleaning mechanism into single call from addrdataset(),
but ignore the serve-stale TTL if we are currently overmem.

Then instead of having a fixed number of entries to clean, pass the size
of newly added rdatasetheader to the overmem_purge() function and
cleanup at least the size of the newly added data.  This prevents the
cache going over the configured memory limit (`max-cache-size`).

Additionally, refactor the overmem_purge() function to reduce for-loop
nesting for readability.
2023-06-02 12:22:49 +02:00
Mark AndrewsandMichal Nowak 917d7fe753 Free ctx on invalid siglen 2022-12-21 16:42:23 +01:00
Mark AndrewsandMichal Nowak 4c369e802b Free eckey on siglen mismatch 2022-12-21 16:20:28 +01:00
Michał KępieńandMichal Nowak f7b9bb5518 Add tests for CVE-2022-2795
Add a test ensuring that the amount of work fctx_getaddresses() performs
for any encountered delegation is limited: delegate example.net to a set
of 1,000 name servers in the redirect.com zone, the names of which all
resolve to IP addresses that nothing listens on, and query for a name in
the example.net domain, checking the number of times the findname()
function gets executed in the process; fail if that count is excessively
large.

Since the size of the referral response sent by ans3 is about 20 kB, it
cannot be sent back over UDP (EMSGSIZE) on some operating systems in
their default configuration (e.g. FreeBSD - see the
net.inet.udp.maxdgram sysctl).  To enable reliable reproduction of
CVE-2022-2795 (retry patterns vary across BIND 9 versions) and avoid
false positives at the same time (thread scheduling - and therefore the
number of fetch context restarts - vary across operating systems and
across test runs), extend bin/tests/system/resolver/ans3/ans.pl so that
it also listens on TCP and make "ns1" in the "resolver" system test
always use TCP when communicating with "ans3".

Also add a test (foo.bar.sub.tld1/TXT) that ensures the new limitations
imposed on the resolution process by the mitigation for CVE-2022-2795 do
not prevent valid, glueless delegation chains from working properly.
2022-12-21 16:08:37 +01:00
Michał KępieńandMichal Nowak 9e2b882df8 Bound the amount of work performed for delegations
Limit the amount of database lookups that can be triggered in
fctx_getaddresses() (i.e. when determining the name server addresses to
query next) by setting a hard limit on the number of NS RRs processed
for any delegation encountered.  Without any limit in place, named can
be forced to perform large amounts of database lookups per each query
received, which severely impacts resolver performance.

The limit used (20) is an arbitrary value that is considered to be big
enough for any sane DNS delegation.
2022-12-21 16:08:37 +01:00
Tinderbox User 13959be49e prep 9.11.37 2022-03-07 09:17:17 +00:00
Petr ŠpačekandMichał Kępień d4b1efbcbd Avoid use of compound literals
Compound literals are not used in BIND 9.11, in order to ensure backward
compatibility with ancient compilers.  Rework the relevant parts of the
BIND 9.11 backport of the CVE-2021-25220 fix so that compound literals
are not used.
2022-03-03 13:33:00 +01:00
Mark AndrewsandMichał Kępień 42f8c538d3 Look for zones deeper than the current domain or forward name
When caching glue, we need to ensure that there is no closer
source of truth for the name. If the owner name for the glue
record would be answered by a locally configured zone, do not
cache.
2022-03-03 13:33:00 +01:00
Mark AndrewsandMichał Kępień 4a144fae16 Check cached names for possible "forward only" clause
When caching additional and glue data *not* from a forwarder, we must
check that there is no "forward only" clause covering the owner name
that would take precedence.  Such names would normally be allowed by
baliwick rules, but a "forward only" zone introduces a new baliwick
scope.
2022-03-03 13:33:00 +01:00
Mark AndrewsandMichał Kępień 590f8698fc Check that the forward declaration is unchanged and not overridden
If we are using a fowarder, in addition to checking that names to
be cached are subdomains of the forwarded namespace, we must also
check that there are no subsidiary forwarded namespaces which would
take precedence. To be safe, we don't cache any responses if the
forwarding configuration has changed since the query was sent.
2022-03-03 13:33:00 +01:00
Mark AndrewsandMichał Kępień e8df2802ac Add additional name checks when using a forwarder
When using a forwarder, check that the owner name of response
records are within the bailiwick of the forwarded name space.
2022-03-03 13:33:00 +01:00
Michal Nowak 0e585e88d3 Update copyrights to 2022
(cherry picked from commit befd654e)
2022-01-03 12:16:45 +01:00
Tinderbox UserandMichał Kępień 4b99ff0143 prep 9.11.36 2021-10-28 12:44:12 +02:00
Ondřej SurýandMichał Kępień b01862e8cd Enable lame response detection even with disabled lame cache
Previously, when lame cache would be disabled by setting lame-ttl to 0,
it would also disable lame answer detection.  In this commit, we enable
the lame response detection even when the lame cache is disabled.  This
enables stopping answer processing early rather than going through the
whole answer processing flow.
2021-10-28 12:44:12 +02:00
Tinderbox User bee1b09a24 prep 9.11.35 2021-08-10 22:00:23 +00:00
Tinderbox UserandMichal Nowak 84bf0d4f55 prep 9.11.34 2021-07-23 10:44:39 +02:00
Mark Andrews 5374630ca4 dns_rdata_tostruct() should reject rdata with DNS_RDATA_UPDATE set
(cherry picked from commit e97249e012)
2021-07-21 12:41:35 +10:00
Mark Andrews 45e5972808 Check opcode of messages returned by dns_request_getresponse
(cherry picked from commit ed4e00713f)
2021-07-21 12:41:35 +10:00
Ondřej Surý 8e30211636 Disable the PMTUD also for the IPv6 UDP sockets
Disable the PMTUD also on the IPv6 UDP sockets in addition to IPv4 UDP
sockets.
2021-06-24 17:26:47 +02:00
Tinderbox UserandMichał Kępień a6a4c5daac prep 9.11.33 2021-06-16 22:47:31 +02:00
Michal Nowak 57a3ae9d97 Fix argument with mismatched bound in isc_iterated_hash()
GCC 11 produced the following warning:

    iterated_hash.c:21:33: warning: argument 1 of type ‘unsigned char[20]’ with mismatched bound [-Warray-parameter=]
       21 | isc_iterated_hash(unsigned char out[ISC_SHA1_DIGESTLENGTH],
          |                   ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
    In file included from iterated_hash.c:18:
    ./include/isc/iterated_hash.h:33:37: note: previously declared as ‘unsigned char[155]’
       33 | int isc_iterated_hash(unsigned char out[NSEC3_MAX_HASH_LENGTH],
          |                       ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
2021-05-20 13:35:08 +02:00
Michal Nowak 7ceeaca0dc Fix arguments with mismatched bound in lib/isc/sha2.c
GCC 11 produced the following warnings:

    sha2.c:888:26: error: argument 1 of type ‘uint8_t[]’ {aka ‘unsigned char[]’} with mismatched bound [-Werror=array-parameter=]
      888 | isc_sha224_final(uint8_t digest[], isc_sha224_t *context) {
          |                  ~~~~~~~~^~~~~~~~
    In file included from sha2.c:58:
    ./include/isc/sha2.h:132:24: note: previously declared as ‘uint8_t[28]’ {aka ‘unsigned char[28]’}
      132 | void isc_sha224_final (uint8_t[ISC_SHA224_DIGESTLENGTH], isc_sha224_t *);
          |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    sha2.c:1151:26: error: argument 1 of type ‘uint8_t[]’ {aka ‘unsigned char[]’} with mismatched bound [-Werror=array-parameter=]
     1151 | isc_sha256_final(uint8_t digest[], isc_sha256_t *context) {
          |                  ~~~~~~~~^~~~~~~~
    In file included from sha2.c:58:
    ./include/isc/sha2.h:139:24: note: previously declared as ‘uint8_t[32]’ {aka ‘unsigned char[32]’}
      139 | void isc_sha256_final (uint8_t[ISC_SHA256_DIGESTLENGTH], isc_sha256_t *);
          |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    sha2.c:1514:31: error: argument 1 of type ‘uint8_t[]’ {aka ‘unsigned char[]’} with mismatched bound [-Werror=array-parameter=]
     1514 | void isc_sha512_final(uint8_t digest[], isc_sha512_t *context) {
          |                       ~~~~~~~~^~~~~~~~
    In file included from sha2.c:58:
    ./include/isc/sha2.h:153:24: note: previously declared as ‘uint8_t[64]’ {aka ‘unsigned char[64]’}
      153 | void isc_sha512_final (uint8_t[ISC_SHA512_DIGESTLENGTH], isc_sha512_t *);
          |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    sha2.c:1567:26: error: argument 1 of type ‘uint8_t[]’ {aka ‘unsigned char[]’} with mismatched bound [-Werror=array-parameter=]
     1567 | isc_sha384_final(uint8_t digest[], isc_sha384_t *context) {
          |                  ~~~~~~~~^~~~~~~~
    In file included from sha2.c:58:
    ./include/isc/sha2.h:146:24: note: previously declared as ‘uint8_t[48]’ {aka ‘unsigned char[48]’}
      146 | void isc_sha384_final (uint8_t[ISC_SHA384_DIGESTLENGTH], isc_sha384_t *);
          |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    sha2.c:1604:44: error: argument 2 of type ‘char[]’ with mismatched bound [-Werror=array-parameter=]
     1604 | isc_sha224_end(isc_sha224_t *context, char buffer[]) {
          |                                       ~~~~~^~~~~~~~
    In file included from sha2.c:58:
    ./include/isc/sha2.h:133:39: note: previously declared as ‘char[57]’
      133 | char *isc_sha224_end (isc_sha224_t *, char[ISC_SHA224_DIGESTSTRINGLENGTH]);
          |                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    sha2.c:1645:44: error: argument 2 of type ‘char[]’ with mismatched bound [-Werror=array-parameter=]
     1645 | isc_sha256_end(isc_sha256_t *context, char buffer[]) {
          |                                       ~~~~~^~~~~~~~
    In file included from sha2.c:58:
    ./include/isc/sha2.h:140:39: note: previously declared as ‘char[65]’
      140 | char *isc_sha256_end (isc_sha256_t *, char[ISC_SHA256_DIGESTSTRINGLENGTH]);
          |                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    sha2.c:1686:44: error: argument 2 of type ‘char[]’ with mismatched bound [-Werror=array-parameter=]
     1686 | isc_sha512_end(isc_sha512_t *context, char buffer[]) {
          |                                       ~~~~~^~~~~~~~
    In file included from sha2.c:58:
    ./include/isc/sha2.h:154:39: note: previously declared as ‘char[129]’
      154 | char *isc_sha512_end (isc_sha512_t *, char[ISC_SHA512_DIGESTSTRINGLENGTH]);
          |                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    sha2.c:1727:44: error: argument 2 of type ‘char[]’ with mismatched bound [-Werror=array-parameter=]
     1727 | isc_sha384_end(isc_sha384_t *context, char buffer[]) {
          |                                       ~~~~~^~~~~~~~
    In file included from sha2.c:58:
    ./include/isc/sha2.h:147:39: note: previously declared as ‘char[97]’
      147 | char *isc_sha384_end (isc_sha384_t *, char[ISC_SHA384_DIGESTSTRINGLENGTH]);
          |                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    cc1: all warnings being treated as errors
2021-05-20 12:55:14 +02:00
Tinderbox UserandMichał Kępień 82a83e41bf prep 9.11.32 2021-05-20 12:34:09 +02:00
Mark Andrews ff88e33cff Silence gcc-10-fanalyzer false positive
If 'state == ft_ordinary' then 'label' can't be NULL. Add
INSIST to reflect this.

(cherry picked from commit 29f1c1e677)
2021-05-18 16:46:07 +10:00
Mark Andrews baa40e47cd Silence gcc-10-fanalyzer false positive
Add REQUIRE(type == dns_rdatatype_nsec3 || firstp != NULL); so
that dereferences of *firstp is not flagged as a NULL pointer
dereference.

(cherry picked from commit 683ad6e4bd)
2021-05-18 15:48:32 +10:00
Matthijs Mekking 2c81206984 Sync dns results
Add missing DNS results from 9.16. We only care about
DNS_R_NSEC3ITERRANGE but better to sync and use the same numbers than
use a different number for this result code than what is used in 9.16.
2021-04-30 09:58:44 +02:00
Mark AndrewsandMatthijs Mekking 1647bc7dc4 Mark DNSSEC responses with NSEC3 records that exceed 150 as insecure
(cherry picked from commit af02bbcdd6)
2021-04-30 09:36:45 +02:00
Mark Andrews e4e4ff0e10 Update ZONEMD to match RFC 8976
* The location of the digest type field has changed to where the
  reserved field was.
* The reserved field is now called scheme and is where the digest
  type field was.
* Digest type 2 has been defined (SHA256).

(cherry picked from commit 8510ccaa54)
2021-04-30 11:31:05 +10:00
Mark Andrews 6e729ce890 Warn if there is excessive NSEC3 iterations
(cherry picked from commit c9f5f8a059)
2021-04-30 10:49:00 +10:00
Mark Andrews 91a7f94a66 Reduce nsec3 max iterations to 150
(manually picked from commit 29126500d2)
2021-04-30 10:49:00 +10:00
Tinderbox UserandMichał Kępień ab7ca7759c prep 9.11.30 2021-04-29 11:56:03 +02:00
Mark AndrewsandMichał Kępień d7011a55d3 Unload a zone if a transfer breaks its SOA record
If a zone transfer results in a zone not having any NS records, named
stops serving it because such a zone is broken.  Do the same if an
incoming zone transfer results in a zone lacking an SOA record at the
apex or containing more than one SOA record.
2021-04-29 11:56:03 +02:00
Mark AndrewsandMichał Kępień 0313ede6e1 Address inconsistencies in checking added RRsets
loading_addrdataset() rejects SOA RRsets which are not at top of zone.
addrdataset() should similarly reject such RRsets.
2021-04-29 11:56:03 +02:00
Mark AndrewsandMichał Kępień 4eff09c6b1 Check SOA owner names in zone transfers
An IXFR containing SOA records with owner names different than the
transferred zone's origin can result in named serving a version of that
zone without an SOA record at the apex.  This causes a RUNTIME_CHECK
assertion failure the next time such a zone is refreshed.  Fix by
immediately rejecting a zone transfer (either an incremental or
non-incremental one) upon detecting an SOA record not placed at the apex
of the transferred zone.
2021-04-29 11:56:03 +02:00
Michał Kępień 870701c336 Fix handling undefined GSS_SPNEGO_MECHANISM macro
BIND 9 attempts to look up GSSAPI OIDs for the Kerberos 5 and SPNEGO
mechanisms in the relevant header files provided by the Kerberos/GSSAPI
library used.  Due to the differences between various Kerberos/GSSAPI
implementations, if any of the expected preprocessor macros
(GSS_KRB5_MECHANISM, GSS_SPNEGO_MECHANISM) is not defined in the header
files provided by the library used, the code in lib/dns/gssapictx.c
defines its own version of each missing macro, so that BIND 9 can
attempt to use the relevant security mechanisms anyway.

Commit 7f08c756aa, which contains a
partial backport of the changes introduced in commit
978c7b2e89, left a block of code in the
lib/dns/include/dst/gssapi.h header which defines the
GSS_SPNEGO_MECHANISM preprocessor macro to NULL if it is not defined by
any header file provided by the Kerberos/GSSAPI library used.  This
causes the gss_add_oid_set_member() call in the mech_oid_set_create()
helper function to always return an error.  This in turn causes the
dst_gssapi_acquirecred() function to also always return an error, which
ultimately prevents any named instance whose configuration includes the
"tkey-gssapi-credential" option from starting.

Remove the offending conditional definition of the GSS_SPNEGO_MECHANISM
preprocessor macro from lib/dns/include/dst/gssapi.h, so that a proper
GSSAPI OID is assigned to that macro in lib/dns/gssapictx.c when the
Kerberos/GSSAPI library used does not define it.

(cherry picked from commit 648ef3a2b4)
2021-04-16 14:54:31 +02:00
Mark Andrews 25ba866b62 Make calling generic rdata methods consistent
add matching macros to pass arguments from called methods
to generic methods.  This will reduce the amount of work
required when extending methods.

Also cleanup unnecessary UNUSED declarations.

(cherry picked from commit a88d3963e2)
2021-04-13 01:53:26 +00:00
Michał Kępień dc1ed88776 Free resources when gss_accept_sec_context() fails
Even if a call to gss_accept_sec_context() fails, it might still cause a
GSS-API response token to be allocated and left for the caller to
release.  Make sure the token is released before an early return from
dst_gssapi_acceptctx().

(cherry picked from commit d954e152d9)
2021-04-08 11:04:21 +02:00