A DNSSEC-validating resolver looks up a name in shop.example.com, delegated from signed example.com with no DS; why is the answer insecure rather than bogus, and what must the resolver see first?
answer
- absence must be proven
- a signed denial from the parent
- parent-side NSEC, no DS bit
- stripped DS is not proof
- unsupported algorithms count as unsigned
basics
~20 sWith no DS, the chain ends at that delegation, and the parent's signed proof that no DS exists makes everything below it provably insecure. Answers there are returned unvalidated, not rejected. Without that signed proof, a missing DS counts for nothing.
solid answer
~50 sRFC 4033 defines **insecure** as having a trust anchor, a chain of trust, and "at some delegation point, signed proof of the non-existence of a DS record". **Bogus** is when the chain says the data should be signed but validation fails. Here `example.com` is signed and its referral for `shop.example.com` carries an `NS` RRset but no `DS`. RFC 4035 Section 3.1.4 requires such a referral to include the parent's signed `NSEC` proving the DS is absent. If the referral has neither a `DS` nor that proof, the resolver MUST ask the parent's servers for the `DS`. It must use the parent's `NSEC`, the one without the SOA bit, not the child's. Once absence is proven, `shop.example.com` gets no protection and its answers pass through unvalidated. A merely missing `DS` proves nothing, since an attacker could strip it, and RFC 4035 forbids treating absence as proof.
go deeper
Recall that DNSSEC can end on purpose: a delegation with no DS in the parent leaves the zone below it unsigned and unvalidated, which is not an error.
Explain the four states and the difference between insecure and bogus. Say which signed record proves that a DS is absent, and in which zone it lives.
Diagnose from the operator's side: a signed subzone nobody uploaded a DS for (silently unprotected), a stripped DS (bogus, not a downgrade), RSASHA1-only DS records now treated as insecure, and when a parent query is mandatory.
Decide which delegations in an estate must be signed and chained and which may stay insecure. Weigh the protection each buys against the outage risk a stale DS adds.
## Four outcomes, two of them easily confused A validating resolver sorts every answer into one of four states, defined in RFC 4033 Section 5 and RFC 4035 Section 4.3: | State | What the resolver has | What happens to the answer | |---|---|---| | **Secure** | an anchor and an unbroken chain of DS and DNSKEY RRsets to the data, all signatures verify | returned as validated | | **Insecure** | an anchor, a chain, and *signed proof* that some delegation on the path has no DS | returned without validation | | **Bogus** | an anchor and a secure delegation saying the data should be signed, but validation fails | treated as a failure | | **Indeterminate** | no anchor covering the name | returned without validation (the default mode) | **Insecure** and **bogus** both describe data that did not validate. The difference is whether the chain *promised* signatures. Insecure means the signed tree itself said "below here, nothing is signed". Bogus means the tree said "this should be signed" and the answer failed that promise. A bogus answer reaches a stub resolver as a server failure; that signalling belongs to validation. An insecure answer is returned normally. ## The scenario: shop.example.com has no DS `example.com` is signed and chains to the root. It delegates `shop.example.com` to another team's name servers, and no `DS` was ever placed in `example.com` for it. Perhaps the subzone is unsigned. Perhaps it is signed but nobody uploaded its digest, which makes it an *island of security*. What the resolver does: 1. It asks `example.com`'s servers about a name under `shop.example.com` and gets a **referral**: the delegation `NS` RRset. That RRset is never signed at a delegation point, so it proves nothing on its own. 2. Under RFC 4035 Section 3.1.4, a security-aware server answering with the DO bit set MUST include the `DS` RRset and its signatures if one exists. If not, it MUST include the `NSEC` record proving there is no `DS`, with its `RRSIG`. 3. The resolver authenticates that `NSEC` with `example.com`'s trusted keys. It shows the delegation name with `NS` in its type map but no `DS`. 4. If the referral carried neither a `DS` nor such a proof, the resolver **MUST query the parent zone's servers for the DS RRset** (RFC 4035 Section 5.2). 5. With absence proven, RFC 4035 says there is "no authentication path leading from the parent to the child". Data in and below `shop.example.com` is insecure, and validation of that subtree stops. Two details matter here: - **Use the parent's proof.** A signed delegation has two `NSEC` records at the same name: one in the parent and one at the child's apex. RFC 4035 says the resolver MUST use the parent's, which can be told apart because the SOA bit is clear in it and set in the child's. - **Hashed denial works the same way.** In zones using `NSEC3`, the proof is an `NSEC3` record for the delegation whose type map has no DS bit. With **opt-out**, an insecure delegation may have no `NSEC3` of its own and is covered by a span flagged opt-out. Those proof mechanics belong to authenticated denial. ## Why a missing DS is not enough RFC 4035 Section 5 is blunt: "The absence of DNSSEC data in a response MUST NOT by itself be taken as an indication that no authentication information exists." From the defender's side, that rule closes a **downgrade**. An on-path attacker who could delete a `DS` from a referral, and have the resolver shrug and treat the child as unsigned, would switch off DNSSEC for any zone they liked. Requiring a *signed* denial means only the parent's keys can declare a child unsigned. A stripped `DS` leaves the resolver unable to prove absence: it asks the parent directly, and if the attacker blocks that too, the answer ends up bogus, never insecure. ## Other roads to insecure - **Unsupported algorithms.** RFC 4035 Section 5.2 says that if the resolver supports none of the algorithms in an authenticated DS RRset, it should treat the child as unsigned. RFC 9905 now requires operators to treat `DS` records using RSASHA1 (5) or RSASHA1-NSEC3-SHA1 (7) as insecure, and the data below as insecure if no other `DS` remains. - **Local policy.** RFC 4033 lets a resolver operator mark parts of the namespace insecure, for example to ride out someone else's broken zone. - **A deeper anchor.** If the resolver holds a configured key for `shop.example.com` itself, RFC 4035 lets it re-establish the chain from that anchor. ## What this means for operators - Signing `shop.example.com` without getting its `DS` into `example.com` buys **no protection** from validating resolvers. Nothing fails, so nobody notices. - The reverse mistake, a `DS` in the parent that matches no published key, makes the child **bogus** and unreachable for validating clients. That outage usually comes from a botched key rollover. - An unsigned delegation inside a signed zone is legitimate and common; insecure is a valid result, not an error.
- Why must a DNSSEC-validating resolver use the parent's NSEC record, not the child's, to prove a delegation has no DS?The `DS` lives only on the parent's side of the cut, so only the parent can authoritatively deny it. The child's apex `NSEC` lists what exists at the child's apex, where a `DS` never appears, so it would wrongly seem to prove absence every time. RFC 4035 Section 5.2 makes the parent's record mandatory and tells them apart by the SOA bit, clear in the parent's and set in the child's.
- The subzone shop.example.com is signed, but its DS was never added to example.com; what do validating resolvers make of its signatures?Nothing. The parent's signed denial proves there is no `DS`, so the chain ends and everything in `shop.example.com` is insecure. Its `RRSIG` records are present but unused, and a forged answer would be accepted just as readily. It is an island of security: only a resolver that configures its key as a local trust anchor can validate it. The fix is to get the DS published in the parent.
saying these in an interview costs you the question
- A delegation with no DS makes the answer bogus, so the resolver returns SERVFAIL.
- If a referral omits the DS, the resolver can assume the child zone is unsigned.
- The child's own apex NSEC proves that no DS exists for its delegation.
- A signed child zone without a DS in its parent still validates as secure.
- Insecure means the resolver tried to validate the answer and failed.