NSEC TTLs: NSEC and NSEC3: TTLs and Aggressive Use
Fixes the TTL rules for NSEC and NSEC3 records so that cached 'this name does not exist' proofs expire when the zone operator intended.
van Dijk, P., "NSEC and NSEC3: TTLs and Aggressive Use", RFC 9077, DOI 10.17487/RFC9077, July 2021, <https://www.rfc-editor.org/info/rfc9077>.
@misc{rfc9077,
series = {Request for Comments},
number = 9077,
howpublished = {RFC 9077},
publisher = {RFC Editor},
doi = {10.17487/RFC9077},
url = {https://www.rfc-editor.org/info/rfc9077},
author = {P. van Dijk},
title = {{NSEC and NSEC3: TTLs and Aggressive Use}},
pagetotal = 8,
year = 2021,
month = jul,
} RFC text
Contents
Internet Engineering Task Force (IETF) P. van Dijk
Request for Comments: 9077 PowerDNS
Updates: 4034, 4035, 5155, 8198 July 2021
Category: Standards Track
ISSN: 2070-1721
NSEC and NSEC3: TTLs and Aggressive Use
Abstract
Due to a combination of unfortunate wording in earlier documents,
aggressive use of NSEC and NSEC3 records may deny the existence of
names far beyond the intended lifetime of a denial. This document
changes the definition of the NSEC and NSEC3 TTL to correct that
situation. This document updates RFCs 4034, 4035, 5155, and 8198.
Status of This Memo
This is an Internet Standards Track document.
This document is a product of the Internet Engineering Task Force
(IETF). It represents the consensus of the IETF community. It has
received public review and has been approved for publication by the
Internet Engineering Steering Group (IESG). Further information on
Internet Standards is available in Section 2 of RFC 7841.
Information about the current status of this document, any errata,
and how to provide feedback on it may be obtained at
https://www.rfc-editor.org/info/rfc9077.
Copyright Notice
Copyright (c) 2021 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License.
Table of Contents
1. Introduction
2. Conventions and Definitions
3. NSEC and NSEC3 TTL Changes
3.1. Updates to RFC 4034
3.2. Updates to RFC 4035
3.3. Updates to RFC 5155
3.4. Updates to RFC 8198
4. Zone Operator Considerations
4.1. A Note on Wildcards
5. Security Considerations
6. IANA Considerations
7. Normative References
Acknowledgements
Author's Address
1. Introduction
[RFC2308] defines the TTL of the Start of Authority (SOA) record that
must be returned in negative answers (NXDOMAIN or NODATA):
| The TTL of this record is set from the minimum of the MINIMUM
| field of the SOA record and the TTL of the SOA itself, and
| indicates how long a resolver may cache the negative answer.
Thus, if the TTL of the SOA in the zone is lower than the SOA MINIMUM
value (the last number in the SOA record), the authoritative server
sends that lower value as the TTL of the returned SOA record. The
resolver always uses the TTL of the returned SOA record when setting
the negative TTL in its cache.
However, [RFC4034], Section 4 has this unfortunate text:
| The NSEC RR SHOULD have the same TTL value as the SOA minimum TTL
| field. This is in the spirit of negative caching ([RFC2308]).
This text, while referring to [RFC2308], can cause NSEC records to
have much higher TTLs than the appropriate negative TTL for a zone.
[RFC5155] contains equivalent text.
[RFC8198], Section 5.4 tries to correct this:
| Section 5 of [RFC2308] also states that a negative cache entry TTL
| is taken from the minimum of the SOA.MINIMUM field and SOA's TTL.
| This can be less than the TTL of an NSEC or NSEC3 record, since
| their TTL is equal to the SOA.MINIMUM field (see [RFC4035],
| Section 2.3 and [RFC5155], Section 3).
|
| A resolver that supports aggressive use of NSEC and NSEC3 SHOULD
| reduce the TTL of NSEC and NSEC3 records to match the SOA.MINIMUM
| field in the authority section of a negative response, if
| SOA.MINIMUM is smaller.
But the NSEC and NSEC3 RRs should, according to [RFC4034] and
[RFC5155], already be at the value of the MINIMUM field in the SOA.
Thus, the advice from [RFC8198] would not actually change the TTL
used for the NSEC and NSEC3 RRs for authoritative servers that follow
the RFCs.
As a theoretical exercise, consider a top-level domain (TLD) named
.example with an SOA record like this:
example. 900 IN SOA primary.example. dnsadmin.example. (
1 1800 900 604800 86400 )
The SOA record has a 900-second TTL and an 86400-second MINIMUM TTL.
Negative responses from this zone have a 900-second TTL, but the NSEC
or NSEC3 records in those negative responses have an 86400-second
TTL. If a resolver were to use those NSEC or NSEC3 records
aggressively, they would be considered valid for a day instead of the
intended 15 minutes.
2. Conventions and Definitions
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here.
3. NSEC and NSEC3 TTL Changes
[RFC4034], [RFC4035], and [RFC5155] use the SHOULD requirement level,
but they were written prior to the publication of [RFC8198] when
[RFC4035] still said:
| However, it seems prudent for resolvers to avoid blocking new
| authoritative data or synthesizing new data on their own.
[RFC8198] updated that text to contain:
| ...DNSSEC-enabled validating resolvers SHOULD use wildcards and
| NSEC/NSEC3 resource records to generate positive and negative
| responses until the effective TTLs or signatures for those records
| expire.
This means that the correctness of NSEC and NSEC3 records and their
TTLs has become much more important. Because of that, the updates in
this document upgrade the requirement level to MUST.
3.1. Updates to RFC 4034
[RFC4034] says:
| The NSEC RR SHOULD have the same TTL value as the SOA minimum TTL
| field. This is in the spirit of negative caching ([RFC2308]).
This is updated to say:
| The TTL of the NSEC RR that is returned MUST be the lesser of the
| MINIMUM field of the SOA record and the TTL of the SOA itself.
| This matches the definition of the TTL for negative responses in
| [RFC2308]. Because some signers incrementally update the NSEC
| chain, a transient inconsistency between the observed and expected
| TTL MAY exist.
3.2. Updates to RFC 4035
[RFC4035] says:
| The TTL value for any NSEC RR SHOULD be the same as the minimum
| TTL value field in the zone SOA RR.
This is updated to say:
| The TTL of the NSEC RR that is returned MUST be the lesser of the
| MINIMUM field of the SOA record and the TTL of the SOA itself.
| This matches the definition of the TTL for negative responses in
| [RFC2308]. Because some signers incrementally update the NSEC
| chain, a transient inconsistency between the observed and expected
| TTL MAY exist.
3.3. Updates to RFC 5155
[RFC5155] says:
| The NSEC3 RR SHOULD have the same TTL value as the SOA minimum TTL
| field. This is in the spirit of negative caching [RFC2308].
This is updated to say:
| The TTL of the NSEC3 RR that is returned MUST be the lesser of the
| MINIMUM field of the SOA record and the TTL of the SOA itself.
| This matches the definition of the TTL for negative responses in
| [RFC2308]. Because some signers incrementally update the NSEC3
| chain, a transient inconsistency between the observed and expected
| TTL MAY exist.
Where [RFC5155] says:
| * The TTL value for any NSEC3 RR SHOULD be the same as the
| minimum TTL value field in the zone SOA RR.
This is updated to say:
| * The TTL value for each NSEC3 RR MUST be the lesser of the
| MINIMUM field of the zone SOA RR and the TTL of the zone SOA RR
| itself. Because some signers incrementally update the NSEC3
| chain, a transient inconsistency between the observed and
| expected TTL MAY exist.
3.4. Updates to RFC 8198
[RFC8198], Section 5.4 ("Consideration on TTL") is completely
replaced by the following text:
| The TTL value of negative information is especially important,
| because newly added domain names cannot be used while the negative
| information is effective.
|
| Section 5 of [RFC2308] suggests a maximum default negative cache
| TTL value of 3 hours (10800). It is RECOMMENDED that validating
| resolvers limit the maximum effective TTL value of negative
| responses (NSEC/NSEC3 RRs) to this same value.
|
| A resolver that supports aggressive use of NSEC and NSEC3 MAY
| limit the TTL of NSEC and NSEC3 records to the lesser of the
| SOA.MINIMUM field and the TTL of the SOA in a response, if
| present. It MAY also use a previously cached SOA for a zone to
| find these values.
(The third paragraph of the original is removed, and the fourth
paragraph is updated to allow resolvers to also take the lesser of
the SOA TTL and SOA MINIMUM.)
4. Zone Operator Considerations
If signers and DNS servers for a zone cannot immediately be updated
to conform to this document, zone operators are encouraged to
consider setting their SOA record TTL and the SOA MINIMUM field to
the same value. That way, the TTL used for aggressive NSEC and NSEC3
use matches the SOA TTL for negative responses.
Note that some signers might use the SOA TTL or MINIMUM as a default
for other values, such as the TTL for DNSKEY records. Operators
should consult documentation before changing values.
4.1. A Note on Wildcards
Validating resolvers consider an expanded wildcard valid for the
wildcard's TTL, capped by the TTLs of the NSEC or NSEC3 proof that
shows that the wildcard expansion is legal. Thus, changing the TTL
of NSEC or NSEC3 records (explicitly, or by implementation of this
document implicitly) might affect (shorten) the lifetime of
wildcards.
5. Security Considerations
An attacker can delay future records from appearing in a cache by
seeding the cache with queries that cause NSEC or NSEC3 responses to
be cached for aggressive use purposes. This document reduces the
impact of that attack in cases where the NSEC or NSEC3 TTL is higher
than the zone operator intended.
6. IANA Considerations
IANA has added a reference to this document in the "Resource Record
(RR) TYPEs" subregistry of the "Domain Name System (DNS) Parameters"
registry for the NSEC and NSEC3 types.
7. Normative References
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>.
[RFC2308] Andrews, M., "Negative Caching of DNS Queries (DNS
NCACHE)", RFC 2308, DOI 10.17487/RFC2308, March 1998,
<https://www.rfc-editor.org/info/rfc2308>.
[RFC4034] Arends, R., Austein, R., Larson, M., Massey, D., and S.
Rose, "Resource Records for the DNS Security Extensions",
RFC 4034, DOI 10.17487/RFC4034, March 2005,
<https://www.rfc-editor.org/info/rfc4034>.
[RFC4035] Arends, R., Austein, R., Larson, M., Massey, D., and S.
Rose, "Protocol Modifications for the DNS Security
Extensions", RFC 4035, DOI 10.17487/RFC4035, March 2005,
<https://www.rfc-editor.org/info/rfc4035>.
[RFC5155] Laurie, B., Sisson, G., Arends, R., and D. Blacka, "DNS
Security (DNSSEC) Hashed Authenticated Denial of
Existence", RFC 5155, DOI 10.17487/RFC5155, March 2008,
<https://www.rfc-editor.org/info/rfc5155>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[RFC8198] Fujiwara, K., Kato, A., and W. Kumari, "Aggressive Use of
DNSSEC-Validated Cache", RFC 8198, DOI 10.17487/RFC8198,
July 2017, <https://www.rfc-editor.org/info/rfc8198>.
Acknowledgements
This document was made possible with the help of the following
people:
* Ralph Dolmans
* Warren Kumari
* Matthijs Mekking
* Vladimir Cunat
* Matt Nordhoff
* Josh Soref
* Tim Wicinski
The author would like to explicitly thank Paul Hoffman for the
extensive reviews, text contributions, and help in navigating WG
comments.
Author's Address
Peter van Dijk
PowerDNS
Den Haag
Netherlands
Email: peter.van.dijk@powerdns.com
AI ELI5
On this page
§1Two Different TTLs for the Same Denial
RFC 2308 says that the TTL of the SOA record returned in a negative answer (NXDOMAIN or NODATA) is the minimum of the SOA MINIMUM field and the TTL of the SOA itself. That value tells a resolver how long it may cache the negative answer.
Meanwhile RFC 4034 said the NSEC record should have the same TTL as the SOA minimum TTL field, and RFC 5155 has equivalent text for NSEC3. The RFC calls this wording unfortunate, because it can give NSEC records a much higher TTL than the correct negative TTL for the zone.
There were two different timers for the same 'nothing here' message, and one of them could run much longer than the other by mistake.
§2Why Aggressive Use Makes It Matter
Under RFC 8198, validating resolvers may use cached NSEC and NSEC3 records aggressively: they use wildcards and NSEC/NSEC3 records to generate positive and negative responses until the effective TTLs or signatures for those records expire. Before that, RFC 4035 advised resolvers to avoid synthesizing data on their own.
Because of this change in resolver behavior, the correctness of NSEC and NSEC3 TTLs became much more important. That is the reason this RFC raises the requirement level from SHOULD to MUST.
RFC 8198 had tried to fix the problem by telling resolvers to reduce the NSEC TTL to a smaller SOA.MINIMUM. But NSEC records from servers that follow the older RFCs already equal SOA.MINIMUM, so that advice would not change anything.
Once resolvers started reusing old 'no such name' proofs to answer new questions, it mattered a lot how long those proofs lasted.
§3A Worked Example
The RFC gives a theoretical top-level domain named .example. Its SOA record has a TTL of 900 seconds and a MINIMUM of 86400 seconds.
Negative responses from this zone carry a 900-second TTL, but the NSEC or NSEC3 records inside them carry 86400 seconds. A resolver using those records aggressively would treat them as valid for a day instead of the intended 15 minutes.
The rule said 15 minutes, but the proof stayed good for a whole day, which is far too long.
| Record | TTL before | Intended lifetime |
|---|---|---|
| SOA | 900 seconds | 900 seconds |
| NSEC or NSEC3 in a negative response THIS RFC | 86400 seconds | 15 minutes (900 seconds) |
§4The New TTL Rules
Sections 3.1 to 3.3 replace the old SHOULD text in RFC 4034, RFC 4035 and RFC 5155. The new text says the TTL of the NSEC (or NSEC3) record that is returned MUST be the lesser of the MINIMUM field of the SOA record and the TTL of the SOA itself, which matches the TTL for negative responses in RFC 2308.
Some signers update the NSEC chain incrementally, so a transient inconsistency between the observed and expected TTL MAY exist.
Section 3.4 completely replaces Section 5.4 of RFC 8198. Validating resolvers are RECOMMENDED to limit the maximum effective TTL of negative responses (NSEC/NSEC3 records) to 3 hours (10800), the maximum default negative cache TTL suggested by RFC 2308. A resolver that supports aggressive use MAY also limit the TTL to the lesser of SOA.MINIMUM and the SOA TTL, and MAY use a previously cached SOA to find these values.
The new rule is simple: use the shorter of the two timers, and never keep a 'nothing here' proof for more than about three hours.
§5Advice for Zone Operators
If signers and DNS servers cannot be updated right away, operators are encouraged to set the SOA record TTL and the SOA MINIMUM field to the same value. Then the TTL used for aggressive NSEC and NSEC3 use matches the SOA TTL for negative responses.
The RFC warns that some signers use the SOA TTL or MINIMUM as a default for other values, such as the TTL for DNSKEY records, so operators should consult documentation before changing them.
Wildcards are affected too. A resolver treats an expanded wildcard as valid for the wildcard's TTL, capped by the TTLs of the NSEC or NSEC3 proof that shows the expansion is legal. Shortening NSEC TTLs can therefore shorten the lifetime of wildcards.
If you cannot update your software yet, set both timers to the same number so they agree. Be careful, because that number may also be used for other things.
§6Security and IANA
An attacker can delay future records from appearing in a cache by seeding the cache with queries that cause NSEC or NSEC3 responses to be cached for aggressive use. This RFC reduces the impact of that attack where the NSEC or NSEC3 TTL is higher than the zone operator intended.
For IANA, a reference to this document was added to the "Resource Record (RR) TYPEs" subregistry for the NSEC and NSEC3 types.
A trickster could make a 'nothing here' sign stick around so new things cannot show up. Shorter, correct timers make that trick weaker.