]> git.ipfire.org Git - thirdparty/bind9.git/log
thirdparty/bind9.git
5 weeks agodns_rdataset_addnoqname() could find unsigned NSEC/NSEC3
Evan Hunt [Thu, 14 May 2026 03:45:57 +0000 (20:45 -0700)] 
dns_rdataset_addnoqname() could find unsigned NSEC/NSEC3

The dns_rdatalist addnoqname() implementation searches for the first
NSEC or NSEC3 record in a message, then for the first RRSIG covering
that type in the same message.  Previously, if no RRSIG for the type was
found, the function accepted the unsigned record. Now, it will instead
continue searching until an NSEC or NSEC3 that does have a matching
signature is found.

When this function is called from validated() in resolver.c, a
non-success return code is now treated as an error instead of triggering
an assertion failure.

Fixes: isc-projects/bind9#5985
5 weeks ago[CVE-2026-10723] sec: usr: Correct verification of NSEC3 signer name
Evan Hunt [Thu, 2 Jul 2026 05:51:01 +0000 (05:51 +0000)] 
[CVE-2026-10723] sec: usr: Correct verification of NSEC3 signer name

BIND 9 accepted child-zone NSEC3 records where the first label equals the hash of the parent zone as valid parent-zone closest encloser proofs. This has been fixed.

ISC thanks Qifan Zhang of Palo Alto Networks for reporting the issue.

Closes isc-projects/bind9#5874

Merge branch '5874-confidential-nsec3-apex-hash-bypass' into 'security-main'

See merge request isc-private/bind9!1082

5 weeks agochange dns_nsec_requiredtypespresent to dns_nsec_is_legal
Aydın Mercan [Tue, 12 May 2026 11:54:09 +0000 (14:54 +0300)] 
change dns_nsec_requiredtypespresent to dns_nsec_is_legal

Change `dns_nsec_requiredtypespresent` to `dns_nsec_is_legal` as a
function for checking multiple NSEC validity rules.

Currently we now additionally check for out-of-zone NSEC entries.

5 weeks agoMove the dnssec_findnoqname_mismatch test into dnssec_py
Evan Hunt [Thu, 2 Jul 2026 01:49:18 +0000 (18:49 -0700)] 
Move the dnssec_findnoqname_mismatch test into dnssec_py

Instead of adding a new separate test for this, we can add it
as a module in the dnssec_py test.

5 weeks agofix: dev: Avoid needless queries when the DNSSEC validation limit is reached
Ondřej Surý [Wed, 1 Jul 2026 11:28:01 +0000 (13:28 +0200)] 
fix: dev:  Avoid needless queries when the DNSSEC validation limit is reached

A validating resolver could send one needless upstream query after
reaching its per-fetch DNSSEC validation limit. It now stops
immediately.

Merge branch 'ondrej/validator-quota-terminal-trust-chain' into 'security-main'

See merge request isc-private/bind9!1075

5 weeks agoUpdate reproducer #5874
Matthijs Mekking [Thu, 4 Jun 2026 14:12:50 +0000 (16:12 +0200)] 
Update reproducer #5874

Update the llm generated reproducer:
- Move server.py into ans1/ans.py
- Remove unnecessary named.conf configuration options
- Add comments describing the steps (copied from GL issue)
- Rename system test

5 weeks agoReject out-of-zone NSEC next owner names
Aydın Mercan [Thu, 7 May 2026 15:59:20 +0000 (18:59 +0300)] 
Reject out-of-zone NSEC next owner names

When verifying DNSSEC records, make sure that a next owner name of
an NSEC record is a subdomain of the signer field.

This follows the specification RFC 4034, section 4.1.1:

 Owner names of RRsets for which the given zone is not authoritative
 (such as glue records) MUST NOT be listed in the Next Domain Name
 unless at least one authoritative RRset exists at the same owner
 name.

While the above paragraph is intended for glue records, it also
applies to out-of-zone data.

5 weeks agoUpdate reproducer #5985
Matthijs Mekking [Mon, 15 Jun 2026 12:55:29 +0000 (14:55 +0200)] 
Update reproducer #5985

Update the llm generated reproducer:
- Move server.py into ans/ans1.py
- Remove unncessary named.conf configuration options
- Add comments describing the steps
- Rename system test

5 weeks agosec: usr: Reclaim memory promptly when DNSSEC validations are canceled
Ondřej Surý [Wed, 1 Jul 2026 10:59:21 +0000 (12:59 +0200)] 
sec: usr: Reclaim memory promptly when DNSSEC validations are canceled

When a resolver is flooded with queries that require DNSSEC
validation — for example during a random-subdomain attack —
many of those validations are canceled before they complete.
Previously a canceled validation still kept its place in the
internal work queue and held the associated response in memory
until that queued work eventually ran, so memory could climb
sharply under sustained load. The canceled work is now dropped
as soon as the validation is canceled, releasing the memory it
was holding.

Merge branch '4760-cancel-dns_validator-jobs-early' into 'security-main'

See merge request isc-private/bind9!1092

5 weeks agoMake the per-fetch validation quota terminal in sub-validations
Ondřej Surý [Tue, 23 Jun 2026 05:03:43 +0000 (07:03 +0200)] 
Make the per-fetch validation quota terminal in sub-validations

Negative-proof validation stops once the per-fetch validation quota is
exhausted, but the DNSKEY, DS and CNAME sub-validator callbacks did
not — they re-fetched the record or relabelled the quota as a broken
chain. Treat ISC_R_QUOTA as terminal in all three, as
validator_callback_nsec already does.

5 weeks agoReproducer for #5874 NSEC3 impersonation
Alessio Podda [Wed, 3 Jun 2026 08:42:43 +0000 (10:42 +0200)] 
Reproducer for #5874 NSEC3 impersonation

LLM generated.

5 weeks agoAdd system test for out-of-zone nsec dnssec bypass
Aydın Mercan [Wed, 6 May 2026 13:54:57 +0000 (16:54 +0300)] 
Add system test for out-of-zone nsec dnssec bypass

A malicious zone with out-of-zone NSEC entries can get a DNSSEC
validating resolver's cache to cover the victim zone for non-existence
and prevent nameserver queries without DNSSEC failure.

Test for this case with an `evil.test` zone that tries to cover the
`victim.test` zone.

5 weeks agoReproducer for #5985 addnoqname mismatch
Alessio Podda [Fri, 12 Jun 2026 09:16:01 +0000 (11:16 +0200)] 
Reproducer for #5985 addnoqname mismatch

LLM generated.

5 weeks agochg: dev: Follow-up of disambiguate `query_cname()` and `query_dname()` usage
Colin Vidal [Wed, 1 Jul 2026 09:56:41 +0000 (11:56 +0200)] 
chg: dev: Follow-up of disambiguate `query_cname()` and `query_dname()` usage

Previous commit "Disambiguate `query_cname()` and `query_dname()` usage"
was harmless but also useless, as it was checking `qctx->result` which
is always set to `ISC_R_SUCCESS` when `qctx` is initialized. The intent
was to check `qctx->fresp->result` (which is the result provided by the
resolver). But this was also wrong (this is actually the case we do
expect `query_cname()`/`query_dname()` to be called, to follow the
chain).

The actual invarant that needs to be checked is if the qtype is CNAME
then we do not follow the chain, so we can't call `query_cname()`. This
invariant has been added.

If the qtype is DNAME, it's more complex, because a DNAME can be found
from a local zone or cache and the chain can be locally followed. In
which case, calling `query_dname()` is legit, as soon as the qname is a
subname of the DNAME target. This invariant is already checked.

Merge branch 'colin/follow-up-disambiguate-query_cname_dname' into 'security-main'

See merge request isc-private/bind9!1089

5 weeks agoCancel the offloaded verification job when canceling a validator
Ondřej Surý [Fri, 12 Jun 2026 15:37:16 +0000 (17:37 +0200)] 
Cancel the offloaded verification job when canceling a validator

The offloaded jobs were fire-and-forget: dns_validator_cancel() could
only raise a flag and wait for the queued crypto to get its turn, so
under a random-subdomain attack canceled validations piled up in the
worker queues, pinning memory.  Keep the isc_work handle and cancel it:
a still-queued job never runs its crypto and unwinds on dequeue; a
running one is unaffected.

5 weeks agoCheck NSEC3 signer matches the owning zone
Evan Hunt [Thu, 21 May 2026 21:41:55 +0000 (14:41 -0700)] 
Check NSEC3 signer matches the owning zone

When validating NSEC3 records, reject any signature whose signer field
does not match the zone owning the NSEC3.

This ensures that a child zone cannot impersonate its parent and forge
NXDOMAIN responses for sibling domains.

Fixes: isc-projects/bind9#5874
5 weeks agofix: nil: Add missing dumpnode call in dnssec-signzone
Mark Andrews [Wed, 1 Jul 2026 08:19:36 +0000 (18:19 +1000)] 
fix: nil: Add missing dumpnode call in dnssec-signzone

When the out of zone name was skipped, to prevent it being signed,
dumpnode was not being called to preserve the contents of the node.

This call was missing from "[CVE-2026-11721] sec: usr: Invalid
signed wildcard records were being accepted"

Merge branch '5871-confidential-followup' into 'security-main'

See merge request isc-private/bind9!1081

5 weeks agoConvert some chain shell-based system tests in python
Colin Vidal [Wed, 1 Jul 2026 08:59:01 +0000 (10:59 +0200)] 
Convert some chain shell-based system tests in python

Rewriting a couple of shell-based chain system test into python. Those
tests exercise the dname resolution of either an authoritative or
resolver without extra queries (it is self resolver either because the
target is in an authoritative zone or in the same authoritative answer).

Also add an extra test checking the same mechanism, this time, from the
resolver cache (no resolver involed).

Those highlight the fact that `query_dname()` can be called in situation
where the query type is DNAME, and even though, it needs to be resolved.

5 weeks agochg: dev: Disambiguate `query_cname()` and `query_dname()` usage
Colin Vidal [Wed, 24 Jun 2026 06:40:52 +0000 (08:40 +0200)] 
chg: dev: Disambiguate `query_cname()` and `query_dname()` usage

Make explicit the fact that `query_cname()` and `query_dname()` must be
called only from a context where the resolver is answering a question
which is _not_ respectively `CNAME` or `DNAME`.

Merge branch 'colin/explicit-dname-cname-libns-query-usage' into 'security-main'

See merge request isc-private/bind9!1077

5 weeks agoTest dnssec-signzone -D and out-of-zone records
Mark Andrews [Wed, 1 Jul 2026 00:28:39 +0000 (10:28 +1000)] 
Test dnssec-signzone -D and out-of-zone records

If dnssec-only (-D) records are present out-of-zone they should
be emitted but not be signed by dnssec-signzone.

5 weeks agoFollow-up of disambiguate `query_cname()` and `query_dname()` usage
Colin Vidal [Wed, 1 Jul 2026 08:58:41 +0000 (10:58 +0200)] 
Follow-up of disambiguate `query_cname()` and `query_dname()` usage

Previous commit "Disambiguate `query_cname()` and `query_dname()` usage"
was harmless but also useless, as it was checking `qctx->result` which
is always set to `ISC_R_SUCCESS` when `qctx` is initialized. The intent
was to check `qctx->fresp->result` (which is the result provided by the
resolver). But this was also wrong (this is actually the case we do
expect `query_cname()`/`query_dname()` to be called, to follow the
chain).

The actual invarant that needs to be checked is if the qtype is CNAME
then we do not follow the chain, so we can't call `query_cname()`. This
invariant has been added.

If the qtype is DNAME, it's more complex, because a DNAME can be found
from a local zone or cache and the chain can be locally followed. In
which case, calling `query_dname()` is legit, as soon as the qname is a
subname of the DNAME target. This invariant is already checked.

5 weeks ago[CVE-2026-11605] sec: usr: Prevent excessive validation work from crafted negative...
Ondřej Surý [Tue, 23 Jun 2026 05:05:01 +0000 (07:05 +0200)] 
[CVE-2026-11605] sec: usr: Prevent excessive validation work from crafted negative responses

A validating resolver could be made to perform a large amount of DNSSEC
validation work in response to a single answer, consuming excessive CPU. A
malicious authoritative server triggers this by returning a signed negative
answer (NXDOMAIN or NODATA) padded with many denial-of-existence proof
records, which the resolver continued to verify beyond its per-query
validation limit. It now enforces that limit on negative answers and returns
SERVFAIL once the limit is reached.

Closes: https://gitlab.isc.org/isc-projects/bind9/-/work_items/4463
Merge branch '4463-limit-the-number-of-negative-validations' into 'security-main'

See merge request isc-private/bind9!1057

5 weeks agoDisambiguate `query_cname()` and `query_dname()` usage
Colin Vidal [Mon, 22 Jun 2026 11:27:09 +0000 (13:27 +0200)] 
Disambiguate `query_cname()` and `query_dname()` usage

Make explicit the fact that `query_cname()` and `query_dname()` must be
called only from a context where the resolver is answering a question
which is _not_ respectively `CNAME` or `DNAME`.

5 weeks agoAdd missing dumpnode call in dnssec-signzone
Mark Andrews [Wed, 24 Jun 2026 23:45:57 +0000 (09:45 +1000)] 
Add missing dumpnode call in dnssec-signzone

When the out of zone name was skipped, to prevent it being signed,
dumpnode was not being called to preserve the contents of the node.

5 weeks ago[CVE-2026-11721] sec: usr: Invalid signed wildcard records were being accepted
Mark Andrews [Mon, 22 Jun 2026 11:27:01 +0000 (21:27 +1000)] 
[CVE-2026-11721] sec: usr: Invalid signed wildcard records were being accepted

Signed wildcard responses in which the Labels field in the `RRSIG` record was less than the number of labels in the Signer Name field were being incorrectly accepted. This in turn broke `synth-from-dnssec`, which depends on such records being correctly validated. This has been fixed.

ISC thanks Qifan Zhang of Palo Alto Networks for bringing this issue to our attention.

Closes https://gitlab.isc.org/isc-projects/bind9/-/issues/5871

Merge branch '5871-confidential-check-rrsig-labels-vs-signer' into 'security-main'

See merge request isc-private/bind9!991

5 weeks agoCover excessive NSEC3 proofs
Ondřej Surý [Sun, 7 Jun 2026 08:19:44 +0000 (10:19 +0200)] 
Cover excessive NSEC3 proofs

Add a system test for NXDOMAIN responses stuffed with NSEC3 proof RRsets,
expecting SERVFAIL once the per-fetch validation quota is reached.

Assisted-by: OpenAI:GPT-5
5 weeks ago[CVE-2026-10822] sec: usr: Malformed DNSKEY records could trigger an assertion
Mark Andrews [Mon, 15 Jun 2026 01:29:54 +0000 (11:29 +1000)] 
[CVE-2026-10822] sec: usr: Malformed DNSKEY records could trigger an assertion

Previously, `dns_name_fromwire()` did not honor the record boundary when reading names from the wire, allowing malformed records to be accepted when they should not have been. In particular, malformed DNSKEY records could trigger an assertion failure when being printed. This has been fixed.

Closes: https://gitlab.isc.org/isc-projects/bind9/-/issues/6004
Merge branch '6004-confidential-issue' into 'security-main'

See merge request isc-private/bind9!1040

5 weeks agoAdd dnssec_py/tests_rrsig_labels_signer: reject Labels underflow
Nicki Křížek [Wed, 15 Apr 2026 17:05:23 +0000 (17:05 +0000)] 
Add dnssec_py/tests_rrsig_labels_signer: reject Labels underflow

Tests that BIND rejects RRSIGs where Labels < (signer_labels - 1), the
underflow condition described in the fix to lib/dns/dnssec.c.

A crafted authoritative server (ans4) serves the zone
attacker.rrsig-labels-signer. with synthetically constructed responses:
an A record covered by an RRSIG whose Labels=1 was produced by signing
*.rrsig-labels-signer. with a key whose signer name sits two labels
deeper (attacker.rrsig-labels-signer., 3 non-root labels). On unfixed
BIND, the resolver accepts the signature and caches the wildcard with
SECURE rank, enabling a synth-from-dnssec cache-poisoning attack on
subsequent queries.

The test verifies two properties: the poison query returns SERVFAIL
(DNS_R_SIGINVALID), and a follow-up victim query is not answered from
the poisoned wildcard cache.

Assisted-by: Claude:claude-opus-4-8
5 weeks agoLimit DNSSEC denial proof validation per fetch
Ondřej Surý [Sun, 7 Jun 2026 08:19:44 +0000 (10:19 +0200)] 
Limit DNSSEC denial proof validation per fetch

Negative response validation reuses the per-fetch validation counters,
but NSEC/NSEC3 subvalidator quota failures were not terminal. The
parent validator logged the child failure and resumed validate_nx(),
so a response stuffed with many denial proof RRsets could keep driving
more validation work and still eventually validate.

Treat ISC_R_QUOTA from an NSEC/NSEC3 subvalidator as terminal and
propagate the quota reason to the parent validator. This lets the
existing fctx->nvalidations and fctx->nfails limits stop excessive
negative proof validation without a separate resolver-side pre-scan.

5 weeks ago[CVE-2026-11331] sec: usr: Fix handling of rpz CNAME expansion that returns name...
Mark Andrews [Fri, 12 Jun 2026 05:48:37 +0000 (15:48 +1000)] 
[CVE-2026-11331] sec: usr: Fix handling of rpz CNAME expansion that returns name too long

Previously, if the expansion of a wildcard CNAME RPZ policy resulted in a name that exceeded the length limit, a self referential CNAME and the original address record were returned, allowing the policy to be bypassed.  In branches up to 9.20, this also left query processing in an inconsistent state which could trigger an assertion failure.  We now return a YXDOMAIN response, without the address.

ISC would like to thank Laith Mash'al (0xmshal) for bringing this issue to our attention.

Closes https://gitlab.isc.org/isc-projects/bind9/-/issues/5856

Merge branch '5856-confidential-rpz-cname-nametoolong' into 'security-main'

See merge request isc-private/bind9!984

5 weeks agoPOC for PRIVATEDNS DNSKEY overrun not being detected
Mark Andrews [Thu, 4 Jun 2026 23:18:30 +0000 (09:18 +1000)] 
POC for PRIVATEDNS DNSKEY overrun not being detected

Construct a DNS message where a PRIVATEDNS DNSKEY identifier
overruns the record boundary by 3 byte so that the label ends
at the end of the compression pointer for the next record. The
next type is less than 256 so the next octet is 00 terminating
the identifier name.  The transfered zone is then written to
disk using master-format text triggering the assertion when the
truncated identier is discovered.

Note this test will produce a false result in versions of
BIND that do not check the PRIVATEDNS identifier as it looks
for the error message when the transfer is aborted.

5 weeks agoTest RRSIG record parsing
Mark Andrews [Tue, 14 Apr 2026 03:46:22 +0000 (13:46 +1000)] 
Test RRSIG record parsing

In particular test that labels and signer fields are consistent.

5 weeks agoProperly handle rpz name to long wildcard expansion
Mark Andrews [Fri, 10 Apr 2026 00:26:14 +0000 (10:26 +1000)] 
Properly handle rpz name to long wildcard expansion

Previously a self referential CNAME and the original address
record were returned.  We now return a YXDOMAIN response.

5 weeks agoTest dst_algorithm_fromdata
Mark Andrews [Tue, 2 Jun 2026 05:00:40 +0000 (15:00 +1000)] 
Test dst_algorithm_fromdata

Test PRIVATEDNS and PRIVATEOID.  The PRIVATEDNS is an unknown
name.  The PRIVATEOID entries are the two test oids.

5 weeks agoInvalid signed wildcard records were being accepted
Mark Andrews [Tue, 14 Apr 2026 02:24:33 +0000 (12:24 +1000)] 
Invalid signed wildcard records were being accepted

An RRSIG whose Labels field indicates fewer labels than its signer
name requires was being accepted.  When such a record covers a
wildcard, the validator reconstructs a wildcard owner name above the
signer's zone and caches it as secure.  RFC 8198 cache synthesis
(synth-from-dnssec) then serves that forged wildcard for unrelated
names, poisoning the cache.

These records are now rejected, both when an RRSIG is parsed and when
its signature is verified.

5 weeks agoCheck rpz name too long wildcard CNAME expansion handling
Mark Andrews [Fri, 10 Apr 2026 00:24:40 +0000 (10:24 +1000)] 
Check rpz name too long wildcard CNAME expansion handling

5 weeks agoCheck that a short PRIVATEDNS record is rejected
Mark Andrews [Tue, 19 May 2026 02:03:23 +0000 (12:03 +1000)] 
Check that a short PRIVATEDNS record is rejected

A bug in dns_name_fromwire meant that short PRIVATEDNS key
records where being accepted.  Test that this is no longer
the case.

5 weeks agoDon't sign out of zone records in dnssec-signzone
Mark Andrews [Tue, 14 Apr 2026 05:14:06 +0000 (15:14 +1000)] 
Don't sign out of zone records in dnssec-signzone

dnssec-signzone was signing extraneous records that were not within
the namespace of the zone.  This no longer occurs.

5 weeks agoFix TTL extraction from A/AAAA record
Mark Andrews [Fri, 10 Apr 2026 00:24:06 +0000 (10:24 +1000)] 
Fix TTL extraction from A/AAAA record

5 weeks agoMake it clearer that decompression is not allowed here
Mark Andrews [Tue, 19 May 2026 01:24:01 +0000 (11:24 +1000)] 
Make it clearer that decompression is not allowed here

For DNSKEY and RRSIG as per RFC 4034, A.1.1. Private Algorithm Types

For KEY, SIG as per RFC 2535 3.2 The KEY Algorithm Number Specification,
which only allowed local domain compression which itself is no
longer allowed.

Other key types inherit from these or the general proscription that
compression is not allow in new types.

5 weeks agoFix dns_name_fromwire to honour the active region
Mark Andrews [Tue, 19 May 2026 01:12:46 +0000 (11:12 +1000)] 
Fix dns_name_fromwire to honour the active region

dns_name_fromwire was not honouring the source buffer's active
region when reading names from the wire.  This allowed malformed
records to be accepted when they shouldn't have been.  This has
been corrected.

5 weeks agoFix dst_algorithm_fromdata to set the active range
Mark Andrews [Tue, 19 May 2026 05:14:06 +0000 (15:14 +1000)] 
Fix dst_algorithm_fromdata to set the active range

When the buffer to check extract the PRIVATEDNS name was constructed
isc_buffer_setactive was not called.  This is now needed as
dns_name_fromwire is being corrected to check the active region.

5 weeks agoFix the yaml query zone name code in dnstap-read
Mark Andrews [Tue, 19 May 2026 05:00:17 +0000 (15:00 +1000)] 
Fix the yaml query zone name code in dnstap-read

When the buffer to read the query zone name was constructed
isc_buffer_setactive was not called.  This is now needed as
dns_name_fromwire is being corrected to check the active region.

5 weeks agoFix EDNS Report Channel checking code
Mark Andrews [Tue, 19 May 2026 01:09:02 +0000 (11:09 +1000)] 
Fix EDNS Report Channel checking code

When the buffer to check the Report Channel domain was constructed
isc_buffer_setactive was not called.  This is now needed as
dns_name_fromwire is being corrected to check the active region.

5 weeks agoCheck that dns_name_fromwire honours the active region
Mark Andrews [Tue, 19 May 2026 00:44:04 +0000 (10:44 +1000)] 
Check that dns_name_fromwire honours the active region

When reading DNS records from the wire the active region of the
source buffer is set to the end of the current record. dns_name_fromwire
should fail if it attempts to read past this setting.

5 weeks agofix: dev: Print the full OID in PRIVATEOID key comments
Ondřej Surý [Thu, 9 Jul 2026 14:23:53 +0000 (16:23 +0200)] 
fix: dev: Print the full OID in PRIVATEOID key comments

The OID in the "; alg = ..." comment of a PRIVATEOID key was truncated to sixteen characters.

Closes #6092

Merge branch '6092-fix-PRIVATEOID-output' into 'main'

See merge request isc-projects/bind9!12377

5 weeks agoPrint the full OID in PRIVATEOID key comments
Ondřej Surý [Thu, 9 Jul 2026 13:06:31 +0000 (15:06 +0200)] 
Print the full OID in PRIVATEOID key comments

The OID printed in the "; alg = ..." comment of a PRIVATEOID KEY,
DNSKEY, CDNSKEY or RKEY record was truncated to sixteen characters:
1.2.840.113549.1.1.11 came out as 1.2.840.113549.1.  Only the comment
was ever affected, never the record itself.

5 weeks agofix: dev: Fix a crash when resolving names below a cached DNAME
Ondřej Surý [Thu, 9 Jul 2026 13:55:19 +0000 (15:55 +0200)] 
fix: dev: Fix a crash when resolving names below a cached DNAME

A recursive resolver could crash when it answered a query for a name beneath a
cached DNAME while that same DNAME record was concurrently refreshed or evicted
from the cache.

Closes #6182

Merge branch '6182-qpcache-dname-zonecut-uaf' into 'main'

See merge request isc-projects/bind9!12337

5 weeks agoReference-count the DNAME zonecut headers
Ondřej Surý [Wed, 1 Jul 2026 16:43:35 +0000 (18:43 +0200)] 
Reference-count the DNAME zonecut headers

check_dname() cached the DNAME header and its RRSIG in the search block
and dropped the node lock holding only a node reference.  Since cache
headers became reference counted and are freed synchronously, and
delegation adds no longer take the tree write lock, a concurrent refresh
or eviction can free the header before setup_delegation() reads it.  Take
a reference on the headers in check_dname() and release it once the
lookup finishes.

5 weeks agochg: dev: Support larger DNSSEC keys and signatures 6198-isc_buffer_reserve-wraps-near-uint_max
Ondřej Surý [Thu, 9 Jul 2026 07:22:09 +0000 (09:22 +0200)] 
chg: dev: Support larger DNSSEC keys and signatures

Some DNSSEC tools and trust-anchor handling could fail when
working with unusually large DNSSEC keys or signatures,
including those used by post-quantum algorithms. These paths
now accept DNSKEY, CDNSKEY, CDS, and RRSIG data up to the DNS
record size limits, so large key material can be parsed, written,
checked, and signed consistently.

Merge branch 'ondrej/dynamic-dnssec-buffers' into 'main'

See merge request isc-projects/bind9!12370

5 weeks agoRemove the fixed DST_KEY_MAXSIZE limit from key parsing paths
Ondřej Surý [Wed, 8 Jul 2026 08:56:39 +0000 (10:56 +0200)] 
Remove the fixed DST_KEY_MAXSIZE limit from key parsing paths

The buffers receiving DNSKEY (and SKR resource record) rdata parsed
from text or wire form were sized by DST_KEY_MAXSIZE (1280 octets),
which is too small for post-quantum public keys.  Parse into
DNS_RDATA_MAXLENGTH sized buffers instead, which cannot be exceeded
by construction, and drop the DST_KEY_MAXSIZE and DST_KEY_MAXTEXTSIZE
constants that no longer have any users.

Assisted-by: Claude:claude-fable-5
5 weeks agoSize RRSIG rdata buffers by the maximum rdata length
Ondřej Surý [Wed, 8 Jul 2026 08:47:47 +0000 (10:47 +0200)] 
Size RRSIG rdata buffers by the maximum rdata length

The buffers receiving the RRSIG rdata built by dns_dnssec_sign() were
fixed-size arrays (1024 or 2048 octets), which is too small for
post-quantum signatures.  Use DNS_RDATA_MAXLENGTH sized buffers
instead, which no RRSIG rdata can exceed by construction.

Assisted-by: Claude:claude-fable-5
5 weeks agoSize DNSKEY rdata buffers by the maximum rdata length
Ondřej Surý [Wed, 8 Jul 2026 08:34:50 +0000 (10:34 +0200)] 
Size DNSKEY rdata buffers by the maximum rdata length

Post-quantum signature algorithms have public keys that do not fit
into the fixed DST_KEY_MAXSIZE (1280 octets) buffers used when
converting a dst_key to DNSKEY rdata.  Use DNS_RDATA_MAXLENGTH sized
buffers instead, which no DNSKEY rdata can exceed by construction.

Assisted-by: Claude:claude-fable-5
5 weeks agofix: usr: Don't synthesize negative responses with pending NSEC
Matthijs Mekking [Wed, 8 Jul 2026 12:05:26 +0000 (12:05 +0000)] 
fix: usr: Don't synthesize negative responses with pending NSEC

If an NSEC record has not yet been validated and is cached with trust
pending, don't use it to synthesize negative responses.

Closes #5872

Closes #5887

Closes #5977

Merge branch '5977-validate-synth-from-dnssec' into 'main'

See merge request isc-projects/bind9!12281

5 weeks agoCover exact-name NODATA synthesis from a pending NSEC
Ondřej Surý [Tue, 7 Jul 2026 12:06:48 +0000 (14:06 +0200)] 
Cover exact-name NODATA synthesis from a pending NSEC

The #5872 reproducer plants a covering NSEC that is rejected inside the
cache (find_coveringnsec), so it never reaches the trust check on the
exact-match NODATA branch of query_coveringnsec(). This adds a companion
case: an NSEC owned by the victim name itself, injected at pending trust
via a CD=1 query, is returned by the cache as a NODATA proof for the
exact node and must not be used to synthesize a NODATA that would deny
the victim's real A record.

Reuses the f004.test fixture with a victim-owned forged NSEC.

Assisted-by: Claude:claude-fable-5
5 weeks agoMerge NSEC synthesis tests
Evan Hunt [Tue, 16 Jun 2026 21:25:51 +0000 (14:25 -0700)] 
Merge NSEC synthesis tests

Merge the tests for "nsec_child_next" and "nsec_pending_cd" into
"nsec_synthesis".

5 weeks agoReproducer for #5887 out of zone NSEC-next syntheisis
Alessio Podda [Thu, 4 Jun 2026 14:30:35 +0000 (16:30 +0200)] 
Reproducer for #5887 out of zone NSEC-next syntheisis

Create the "nsec_child_next" system test.

Co-Authored-By: Evan Hunt <each@isc.org>
5 weeks agoReproducer for #5872 cache pending synthesis
Alessio Podda [Wed, 3 Jun 2026 14:58:25 +0000 (16:58 +0200)] 
Reproducer for #5872 cache pending synthesis

Create the "nsec_pending_cd" system test.

Co-Authored-By: Matthijs Mekking <matthijs@isc.org>
5 weeks agoReproducer for #5977 cache poison NSEC piggyback
Alessio Podda [Wed, 3 Jun 2026 12:59:13 +0000 (14:59 +0200)] 
Reproducer for #5977 cache poison NSEC piggyback

Create a new "nsec_piggyback" system test.

Co-Authored-By: Matthijs Mekking <matthijs@isc.org>
5 weeks agoDon't synthesize negative responses with pending NSEC
Evan Hunt [Fri, 22 May 2026 07:57:24 +0000 (00:57 -0700)] 
Don't synthesize negative responses with pending NSEC

If a cached record has not yet been validated and has trust
level pending, don't use it to synthesize negative responses.

Fixes: isc-projects/bind9#5872
Fixes: isc-projects/bind9#5887
Fixes: isc-projects/bind9#5977
5 weeks agofix: dev: Detect UTF-16 surrogates in `isc_utf8_valid()`
Colin Vidal [Wed, 8 Jul 2026 09:03:52 +0000 (11:03 +0200)] 
fix: dev: Detect UTF-16 surrogates in `isc_utf8_valid()`

UTF-8 standard forbid usage of unicode character between the range of
0xD800..0xDFFF (reserved, and used as UTF-16 surrogates, see RFC 3629).

However, `usc_utf8_valid()` was not checking if the encoded unicode
character was in this range, which then would accept invalid UTF-8
strings. This is now fixed.

Closes #6151

Merge branch '6151-utf16-surrogates-detection' into 'main'

See merge request isc-projects/bind9!12345

5 weeks agoAdd UTF-8 unit test
Colin Vidal [Thu, 2 Jul 2026 07:52:22 +0000 (09:52 +0200)] 
Add UTF-8 unit test

Add a unit test suite for `isc_utf8_valid()` function. It test the
varioutes encoding lower/upper ranges as well as UTF-16 surrogate
exclusion.

Also add unit tests for `usc_utf8_bom()` function.

5 weeks agoDetect UTF-16 surrogates in `isc_utf8_valid()`
Colin Vidal [Thu, 2 Jul 2026 07:52:09 +0000 (09:52 +0200)] 
Detect UTF-16 surrogates in `isc_utf8_valid()`

UTF-8 standard forbid usage of unicode character between the range of
0xD800..0xDFFF (reserved, and used as UTF-16 surrogates, see RFC 3629).

However, `usc_utf8_valid()` was not checking if the encoded unicode
character was in this range, which then would accept invalid UTF-8
strings. This is now fixed.

5 weeks agofix: dev: Remove ACL detach deadcode from dyndb
Colin Vidal [Wed, 8 Jul 2026 06:02:53 +0000 (08:02 +0200)] 
fix: dev: Remove ACL detach deadcode from dyndb

Since `188aa43e`, `dns_acl_any()` can't
fail (and thus would always set memory to its target). Removing deadcode
that would detach the ACL if `dns_acl_any()` would return some error
while the ACL would be created and attached.

Merge branch 'colin/remove-acl-detach-deadcode' into 'main'

See merge request isc-projects/bind9!12333

5 weeks agoRemove ACL detach deadcode from dyndb
Colin Vidal [Wed, 1 Jul 2026 08:30:53 +0000 (10:30 +0200)] 
Remove ACL detach deadcode from dyndb

Since `188aa43e48379572ffa758e45333c67214917d39`, `dns_acl_any()` can't
fail (and thus would always set memory to its target). Removing deadcode
that would detach the ACL if `dns_acl_any()` would return some error
while the ACL would be created and attached.

5 weeks agochg: dev: Mark the related slabheader as visited on cache hit
Ondřej Surý [Tue, 7 Jul 2026 14:28:42 +0000 (16:28 +0200)] 
chg: dev: Mark the related slabheader as visited on cache hit

A cache hit only marked the looked-up header as SIEVE-visited, leaving
its related header (the flattened counterpart) a candidate for eviction.
Mark both so related slabheaders age together.

Merge branch 'ondrej/mark-related-header-visited-on-cache-hit' into 'main'

See merge request isc-projects/bind9!12306

5 weeks agoMark the related slabheader as visited on cache hit
Ondřej Surý [Wed, 24 Jun 2026 05:13:16 +0000 (07:13 +0200)] 
Mark the related slabheader as visited on cache hit

A cache hit only marked the looked-up header as SIEVE-visited, leaving
its related header (the flattened counterpart) a candidate for eviction.
Mark both so related slabheaders age together.

5 weeks agofix: dev: Include the IPv6 address's brackets in the parsed URL/URI host
Arаm Sаrgsyаn [Tue, 7 Jul 2026 12:19:26 +0000 (12:19 +0000)] 
fix: dev: Include the IPv6 address's brackets in the parsed URL/URI host

The brackets are not included in the host component of the parsed
URL/URI. Change the parser to include the brackets.

Closes #6147

Merge branch '6147-isc_url_parse-ipv6-brackets-fix' into 'main'

See merge request isc-projects/bind9!12266

5 weeks agoInclude the brackets when parsing a URI with a IPv6 address
Aram Sargsyan [Wed, 17 Jun 2026 15:43:01 +0000 (15:43 +0000)] 
Include the brackets when parsing a URI with a IPv6 address

The brackets are not included in the host component of the parsed
URL/URI. Change the parser to include the brackets.

5 weeks agofix: dev: Improve the input validation of the isc_url_parse() function
Arаm Sаrgsyаn [Tue, 7 Jul 2026 11:22:59 +0000 (11:22 +0000)] 
fix: dev: Improve the input validation of the isc_url_parse() function

The isc_url_parse() function failed to check the input buffer's
length and assumed that it can't be bigger than UINT16_MAX, because
both the 'off' and 'len' fields of the 'isc_url_parser_t' structure
are uint16_t.

Add a check to not accept a buffer longer than 8192 octets.

Closes #6150

Merge branch '6150-isc_url_parse-buffer-size-check-fix' into 'main'

See merge request isc-projects/bind9!12252

5 weeks agoLimit allowed URL/URI size to 8192 bytes in the parser
Aram Sargsyan [Thu, 18 Jun 2026 09:03:46 +0000 (09:03 +0000)] 
Limit allowed URL/URI size to 8192 bytes in the parser

RFC 9110 Section 4.1 recommends at least 8000 octets, and 65535
is too excessive. Limit the maximum length to 8192 octets.

5 weeks agoAdd IPv6 and authority cases to the isc_url_t unit test
Ondřej Surý [Wed, 17 Jun 2026 04:41:29 +0000 (06:41 +0200)] 
Add IPv6 and authority cases to the isc_url_t unit test

Cover IPv6 literal hosts (the brackets are stripped from the host, zone
identifiers are kept verbatim), userinfo, explicit ports and case
preservation, plus inputs that isc_url_parse() rejects although a generic
RFC 3986 parser would accept them: a '+' in the scheme, an IPvFuture
literal, and a percent-encoded port. The cases are drawn from the
Addressable URI test suite. The shared table runner is factored out so
both table-driven tests reuse it.

Assisted-by: Claude:claude-opus-4-8
5 weeks agoExtend the isc_url_t unit test with RFC 3986 cases
Ondřej Surý [Wed, 17 Jun 2026 04:30:51 +0000 (06:30 +0200)] 
Extend the isc_url_t unit test with RFC 3986 cases

Parse the absolute URIs from RFC 3986 section 5.4 and verify the
component split, and assert the input-length boundary (UINT16_MAX is
accepted, UINT16_MAX + 1 is rejected). isc_url_parse() splits request
targets but does not resolve relative references, so the dot-segments
in path/query/fragment are expected to survive verbatim.

Assisted-by: Claude:claude-opus-4-8
5 weeks agoAdd a unit test for isc_url_t
Aram Sargsyan [Tue, 16 Jun 2026 11:10:21 +0000 (11:10 +0000)] 
Add a unit test for isc_url_t

The test has some basic checks for the URL/URI parser.

5 weeks agoAdd a maximum length for isc_url_parse() input buffer
Aram Sargsyan [Tue, 16 Jun 2026 11:08:14 +0000 (11:08 +0000)] 
Add a maximum length for isc_url_parse() input buffer

The isc_url_parse() function failed to check the input buffer's
length and assumed that it can't be bigger than UINT16_MAX, because
both the 'off' and 'len' fields of the 'isc_url_parser_t' structure
are uint16_t.

Add a check to not accept a buffer longer than UINT16_MAX.

5 weeks agofix: dev: Fix PROXYv2 header size truncation bug
Arаm Sаrgsyаn [Tue, 7 Jul 2026 10:07:45 +0000 (10:07 +0000)] 
fix: dev: Fix PROXYv2 header size truncation bug

The 'isc_proxy2_handler_t' structure stores some size values in a
'uint16_t' type, while the maximum size can be bigger, which results
in truncation. Change the affected types to 'size_t'.

Closes #6142

Merge branch '6142-proxyv2-header-length-fix' into 'main'

See merge request isc-projects/bind9!12294

5 weeks agoAdd new proxyheader unit tests
Aram Sargsyan [Sat, 20 Jun 2026 14:56:22 +0000 (14:56 +0000)] 
Add new proxyheader unit tests

Check the maximum size and bigger than the maximum size headers.

5 weeks agoFix PROXYv2 header size truncation bug
Aram Sargsyan [Sat, 20 Jun 2026 14:56:17 +0000 (14:56 +0000)] 
Fix PROXYv2 header size truncation bug

The 'isc_proxy2_handler_t' structure stores some size values in a
'uint16_t' type, while the maximum size can be bigger, which results
in truncation. Change the affected types to 'size_t'.

5 weeks agonew: test: Test multi-master dnssec-policy setup
Matthijs Mekking [Tue, 7 Jul 2026 08:55:23 +0000 (08:55 +0000)] 
new: test: Test multi-master dnssec-policy setup

Update the manual rollover system test with a multi-master setup.

Merge branch 'matthijs-test-dnssec-policy-multimaster' into 'main'

See merge request isc-projects/bind9!11268

5 weeks agoTest multi-master dnssec-policy setup
Matthijs Mekking [Mon, 24 Nov 2025 08:45:51 +0000 (09:45 +0100)] 
Test multi-master dnssec-policy setup

Update the manual rollover test case with a multi-master setup.  In this
scenario, key files are generated, as well as rollovers are started
on one server (ns3) and key files are copied to the other server (ns4).

Add checks that the begin and end key states are the same.

6 weeks agofix: usr: Unvalidated opt-out NSEC3 could be accepted in insecurity proof alessio/split-query-delegation-baseline
Evan Hunt [Fri, 3 Jul 2026 07:01:30 +0000 (07:01 +0000)] 
fix: usr: Unvalidated opt-out NSEC3 could be accepted in insecurity proof

When determining whether an insecure delegation is legitimate, NSEC3 opt-out records which had not yet passed validation could be used. This has been fixed.

Closes #5970

Merge branch '5970-pending-nsec3' into 'main'

See merge request isc-projects/bind9!12283

6 weeks agoMerge "nsec3_wrong_zone" into "dnssec_nsec3"
Evan Hunt [Fri, 19 Jun 2026 05:58:07 +0000 (22:58 -0700)] 
Merge "nsec3_wrong_zone" into "dnssec_nsec3"

These tests are similar in structure and topic, and can be merged.

6 weeks agoReproducer for #5970 acceptance of unvalidated NSEC3
Alessio Podda [Thu, 4 Jun 2026 14:46:45 +0000 (16:46 +0200)] 
Reproducer for #5970 acceptance of unvalidated NSEC3

Add "dnssec_nsec3" system test.

Co-Authored-By: Evan Hunt <each@isc.org>
6 weeks agoUnvalidated opt-out NSEC3 could be accepted in insecurity proof
Evan Hunt [Thu, 11 Jun 2026 00:58:31 +0000 (17:58 -0700)] 
Unvalidated opt-out NSEC3 could be accepted in insecurity proof

Ignore NSEC3 records that failed in the sub-validator when determining
whether an insecure delegation is legitimate.

Fixes: isc-projects/bind9#5970
6 weeks agofix: usr: Fix DNSSEC validation failures for names under an apex DNAME
Ondřej Surý [Thu, 2 Jul 2026 14:47:22 +0000 (16:47 +0200)] 
fix: usr: Fix DNSSEC validation failures for names under an apex DNAME

DNSSEC validation could fail with SERVFAIL for names covered by a DNAME
at the apex of a signed zone, unless the zone's keys were already validated
in the cache. This regression was introduced by the recent fix for resolver
stalls on CNAME responses to DS queries.

Closes #6176

Merge branch '6176-validator-apex-dname' into 'main'

See merge request isc-projects/bind9!12353

6 weeks agoAdd a system test resolving through a signed apex DNAME
Ondřej Surý [Thu, 2 Jul 2026 13:35:56 +0000 (15:35 +0200)] 
Add a system test resolving through a signed apex DNAME

The dnssec system test signs a DNAME-at-apex zone but only ever
queried the apex directly; nothing resolved a name under the DNAME
through the validating resolver, so a validator regression on that
path went unnoticed.

Assisted-by: Claude:claude-fable-5
6 weeks agoRestrict the alias-chain deadlock check to chaining CNAMEs
Ondřej Surý [Thu, 2 Jul 2026 13:35:56 +0000 (15:35 +0200)] 
Restrict the alias-chain deadlock check to chaining CNAMEs

check_deadlock() aborted any fetch whose name equals the owner of a
chaining rdataset, assuming nothing the validator needs can live at an
alias.  That is true for a CNAME, but a DNAME aliases only the names
below its owner: with a DNAME at a zone apex, the DNSKEY signing the
DNAME lives at the owner name itself, so every answer synthesized from
a signed apex DNAME failed validation whenever that key was not
already validated in the cache.

Chaining CNAMEs, including those synthesized from a DNAME, still cover
the self-join case the check was added for.

6 weeks agofix: test: Support serving signed child zone from its parent's nameserver
Nicki Křížek [Thu, 2 Jul 2026 14:42:15 +0000 (16:42 +0200)] 
fix: test: Support serving signed child zone from its parent's nameserver

When a signed zone is served by the same nameserver instance as
its parent, the child's dnssec-signzone has already written
dsset-<child>. into that directory. Don't attempt to copy the dsset if
the destination and source files are the same.

Assisted-by: Claude:claude-opus-4-8
Merge branch 'nicki/serve-signed-child-same-ns' into 'main'

See merge request isc-projects/bind9!12354

6 weeks agoSupport serving signed child zone from its parent's nameserver
Nicki Křížek [Thu, 2 Jul 2026 14:00:55 +0000 (16:00 +0200)] 
Support serving signed child zone from its parent's nameserver

When a signed zone is served by the same nameserver instance as
its parent, the child's dnssec-signzone has already written
dsset-<child>. into that directory. Don't attempt to copy the dsset if
the destination and source files are the same.

Assisted-by: Claude:claude-opus-4-8
6 weeks agochg: test: Update AsyncDnsServer-related test cookbook parts
Michał Kępień [Thu, 2 Jul 2026 13:09:50 +0000 (15:09 +0200)] 
chg: test: Update AsyncDnsServer-related test cookbook parts

Add practical tips about specific handler classes.  Mention some good
practices and point developers at existing code written in the desired
manner.  Document common pitfalls.  Suggest preferred approaches for
splitting up complex response handling code.

Merge branch 'michal/update-asyncdnsserver-related-test-cookbook-parts' into 'main'

See merge request isc-projects/bind9!12260

6 weeks agoMove ans.py-related information to README.md
Michał Kępień [Thu, 2 Jul 2026 13:07:40 +0000 (15:07 +0200)] 
Move ans.py-related information to README.md

COOKBOOK.md is supposed to be minimal and heavy on examples, so move the
lengthy section about implementing custom ans.py servers from
COOKBOOK.md to README.md.

6 weeks agoUpdate AsyncDnsServer-related test cookbook parts
Michał Kępień [Thu, 2 Jul 2026 13:07:40 +0000 (15:07 +0200)] 
Update AsyncDnsServer-related test cookbook parts

Add practical tips about specific handler classes.  Mention some good
practices and point developers at existing code written in the desired
manner.  Document common pitfalls.  Suggest preferred approaches for
splitting up complex response handling code.

6 weeks agochg: test: Unify system test key and algorithm handling
Nicki Křížek [Thu, 2 Jul 2026 12:51:52 +0000 (14:51 +0200)] 
chg: test: Unify system test key and algorithm handling

This is a followup from https://gitlab.isc.org/isc-projects/bind9/-/merge_requests/11807.

De-duplicates the key material handling and moves algorithm-related things into a dedicated shared module.

Merge branch 'nicki/pytest-key-reconcile' into 'main'

See merge request isc-projects/bind9!12255

6 weeks agoMove algorithm definitions into a top-level isctest.algorithms module
Nicki Křížek [Tue, 16 Jun 2026 16:23:23 +0000 (16:23 +0000)] 
Move algorithm definitions into a top-level isctest.algorithms module

The Algorithm type, the per-algorithm constants, and the ALL_ALGORITHMS*
lookup tables are general DNSSEC key definitions used across isctest
package and the tests. Move them into a dedicated module to separate
these from the environment-specific setup that remains in
isctest.vars.algorithms.

Assisted-by: Claude:claude-opus-4-8
6 weeks agoAdd private_key support to all ZoneKey implementations
Nicki Křížek [Tue, 16 Jun 2026 14:38:53 +0000 (16:38 +0200)] 
Add private_key support to all ZoneKey implementations

Extend the ZoneKeyFile to read the file-backed private key and return it
in a format suitable for use with dnspython. Add ZoneKey.private_key
property to unify the interface.

6 weeks agoReplace get_dnsalg() with kasp.Key.algorithm
Nicki Křížek [Tue, 16 Jun 2026 15:56:00 +0000 (17:56 +0200)] 
Replace get_dnsalg() with kasp.Key.algorithm

The get_dnsalg() was just a compatibility layer for 9.18 which lacked
the Algorithm support - remove it in favor of using the .algorithm
property.

In order to properly support private OID algorithms, use the DST value
which is unique across all algorithms.

Also fix private_type_record(): the choice between the 5- and 7-byte
signing record depends on the DST value (256/257 for the private-OID
algorithms), not the on-wire number, which never reaches 256.

Assisted-by: Claude:claude-opus-4-8
6 weeks agoAdd NSEC3RSASHA1 to list of algorithms
Nicki Křížek [Tue, 16 Jun 2026 15:54:56 +0000 (17:54 +0200)] 
Add NSEC3RSASHA1 to list of algorithms

This algorithm is deprecated and not currently used in our system tests,
but it should be in the list of all algorithms.

6 weeks agoMove dnskey method from kasp.Key to zone.FileZoneKey
Nicki Křížek [Tue, 16 Jun 2026 12:32:28 +0000 (12:32 +0000)] 
Move dnskey method from kasp.Key to zone.FileZoneKey

Code move with one change - switch dnskey TTL from 300s (DEFAULT_TTL) to
3600s (DNSKEY_TTL).

Assisted-by: Claude:claude-opus-4-8
6 weeks agoMerge kasp.Key functionality into zone.FileZoneKey
Nicki Křížek [Tue, 16 Jun 2026 12:34:48 +0000 (12:34 +0000)] 
Merge kasp.Key functionality into zone.FileZoneKey

Make zone.FileZoneKey the single representation of a file-backed key
(typically generated by dnssec-keygen). Move the common key-related
functionality into zone.FileZoneKey, and extend that functionality in
kasp.Key to also add state and timing related operations on top. Remove
duplicate into_ta() function.

Note that is_ksk() is implemented differently for kasp.Key: with the
metadata file available, the KSK status is loaded from that file, as it
indicates the authoritative policy decision which makes the key a KSK.
In zone.FileZoneKey which doesn't work with the metadata file, the KSK
status if inferred from the DNSKEY SEP flag - the best information
available for that class.

Assisted-by: Claude:claude-opus-4-8
6 weeks agoRead DNSKEY TTL from kasp.Key.dnskey
Nicki Křížek [Tue, 16 Jun 2026 13:57:48 +0000 (15:57 +0200)] 
Read DNSKEY TTL from kasp.Key.dnskey

Remove the redundant ttl() method. The DNSKEY RR already provides the
TTL.