Re: How are people implementing hold-down in RFC 5011?

Matthijs Mekking <[email protected]> Tue, 14 Oct 2014 10:49:56 +0200
Newsgroups gmane.ietf.dnsext
Message-ID <[email protected]>
On 13-10-14 17:58, Michael StJohns wrote:
> At 04:59 AM 10/13/2014, Matthijs Mekking wrote:
>> Hi,
>>
>> On 09-10-14 18:46, Michael StJohns wrote:
>>> At 07:57 PM 10/7/2014, Paul Hoffman wrote:
>>>> Thanks for the clarifications. I still have a bunch of
>>>> questions, and I really do wonder if implementers agree with
>>>> your interpretations.
>>
>>
>>>>>
>>>>>> 2: Attacker's zone: B signs (A Br C) (Here, "Br" means "B
>>>>>> with the REVOKE bit set".)
>>>>>
>>>>> 2 is actually B and C sign (Br C).
>>>>
>>>> When the RFC says "and signing it with B", it might be clearer
>>>> if it says "and signing it with B and C". It is far from clear
>>>> which messages from the attacker are for public consumption
>>>> (which would be seen by the zone owner) and which are meant for
>>>> restricted relying parties.
>>>
>>> That's not actually a matter of concern for the zone owner. The
>>> incantation to revoke a key K is "K signs (Kr)".  As I noted
>>> elsewhere, you can't actually have multiple disjoint DNSKEY
>>> RRSets for a given name, so that you end up doing a union of all
>>> the keys to be signed into a single DNSKEY RRSet and you provide
>>> signatures by all signers over all the keys.
>>
>> When the RFC says "and signing it with B" in section 2.2 Add
>> Hold-Down, it talks about adding C to the DNSKEY RRset. C is still
>> a stand-by key and does not necessarily need to sign the DNSKEY
>> set. C will still be added to the validator in the AddPend state.
>>
>> When B is revoked, you do want to sign with both B and C: B to
>> self-sign (Br) and C to sign the DNSKEY RRset.
>
> It depends.  If A is still sacrosanct - then the usual incantation
> for the owner will be  "A and B sign (A Br C Z)" where C is a new
> trust anchor and Z is the ZSK.    C becomes a standby trust anchor
> and doesn't have to actually sign the root DNSKEY RRSet until it's
> placed into active service.

The scenario above is for the attacker, he has no incentive of keep 
publishing A.


> For the attacker, trying to add a new trust anchor that he owns (N),
> the incantation is going to be "B and N sign (B N X)" where X is a
> ZSK owned by the attacker.
>
> The attacker - if all he holds is B - can't sign Br until after the
> Add Holddown period expires if he's trying to add a new attacker
> owned trust anchor.
>
>
>
>>> With respect to the relying party - he doesn't know and can't
>>> tell - who originated the DNSKEY and signature data he's seeing.
>>> It's a crap shoot as to which version of the "truth" (owner or
>>> attacker) he sees.  The 5011 model is designed to make it as
>>> difficult as possible for an attacker to feed its version of
>>> truth to a specific validating resolver for a long enough period
>>> of time so that resolver installs a new trust anchor AND never
>>> sees the revocation of the compromised trust anchor.
>>>
>>>
>>>>>> Immediately after the relying party has seen (2), B can
>>>>>> never be
>>>> trusted again, even while they are waiting for the hold-down
>>>> timer for adding C.
>>>>>
>>>>> Revocation takes place immediately.  Once the bit is set and
>>>>> validly
>>>> signed, the key is revoked and can't be used for anything
>>>> except signing the revocation.  So in B and C sign (Br C), the
>>>> signature over the keys by B only has impact on Br,  The
>>>> signature by C over the keys only has impact if C has already
>>>> been added to the validators trust anchor set.
>>>>
>>>> Yup.
>>>>
>>>>>> Later in Section 2.2, it says:
>>>>>>
>>>>>> In the given example, the zone owner can recover from a
>>>>>> compromise by revoking B and adding a new key D and signing
>>>>>> the DNSKEY RRSet with both A and B.
>>>>>>
>>>>>> The time progression here sounds like: 1: Owner's zone: A
>>>>>> signs (A B) 2a: Attacker's zone: B signs (A Br C) 2b:
>>>>>> Owner's zone: B signs (Br) and A signs (A D) and B signs (A
>>>>>> D) 2a happens before 2b because that is how the owner
>>>>>> discovers that B
>>>> was compromised.
>>
>> I think the time progression is as follows:
>>
>> 1a:  Owner's zone: A signs (A B) 1b:  Attacker's zone: B signs (B
>> C) 2a:  Owner's zone: A and B signs (A Br D) 2b:  Attacker's zone:
>> B and C signs (Br C)
>>
>> The owner should do step 2a before the attacker is able to do 2b.
>
>
> Right, but 2a can happen as soon as the owner notices something hinky
> with the zone or suspects a compromise.  2b can't happen until 1b has
> been out in the wild for the entire Add Holddown time otherwise the
> attacker is throwing away its only mechanism for installing new trust
> anchors.

Correct.


>>> Yes, D is the owner's replacement for B.    I don't name the keys
>>> as "C" and "D" in section 6.1, but that's what's happening.
>>>
>>> You used "C" as the "Attacker's new trust anchor" in this series
>>> of messages.  I probably would have used something more disjoint
>>> in the explanation.
>>>
>>>
>>> So to clarify.
>>>
>>> 1) Start with two trust anchors (A B) and a ZSK (Z) (let Z stand
>>> for any of the regularly generated ZSKs) 2) B is a stand by key -
>>> it's a trust anchor, but not used for regular quarterly signing
>>> 3) The normal DNSKEY RRSet is "A signs (A Z)"
>>
>> Since B is a standby key, it should be "A signs (A B Z)"
>
>
> No.  Once B is added as a trust anchor, it need not be included in
> the root DNSKEY RRSet.   If B is not signing anything, there is no
> reason to include it.

That depends on your key rollover mechanism. In the Double-DS rollover, 
you don't need to add B, in Double-KSK and Double-Signature you do.

But if you want B to keep as a trust anchor at the validator, you better 
leave it in the DNSKEY RRset, otherwise it goes to the `Missing` state, 
an abnormal state. That can't be good.

In the Autotrust implementation, missing trust anchors will be removed 
after a (fairly long) time, otherwise we might end up with a bunch of 
valid, but missing, trust points which are no longer in use. That sounds 
like a weakness in the system.


>>> 4) If A or B is compromised then generate a new key pair C 5)
>>> Assuming A is compromised issue a new RRSET  "A and B sign (Ar B
>>> C Z)"  and propagate that for twice the add hold down time.  (the
>>> add hold down time to get the bits set, the additional time to
>>> pick up stragglers - the additional time is just suspenders and
>>> belt) 6) Once you've done (5) for long enough, issue a new
>>> "normal" RRSET "B signs (B Z)".  C is now a standby key.
>>
>> 6) should be "B signs (B C Z)".
>
>
> Same thing as above.  Once C is a trust anchor, unless its actively
> signing something, there's no need to include it in the DNSKEY RRSet.
> [However, you increase the "take" rate for resolvers the longer you
> leave it there - especially if there are intermittently connected
> resolvers]

Same thing as above. You want to keep it in the DNSKEY RRset, or the 
validator will mark the trust anchor as `Missing`.


> Keys enter the trust anchor set only by being present in the root
> DNSKEY RRSet and signed by a previous trust anchor for a minimum
> period of time (the Add Hold Down).   Keys leave the trust anchor set
> only through revocation.

Right, and to me that sounds like a weakness. Missing trust points 
should be cleaned up too.

Best regards,
   Matthijs



>
> Mike
>
>
>
>
>
>
>> Best regards, Matthijs
>
>

_______________________________________________
dnsext mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/dnsext