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

Matthijs Mekking <[email protected]> Mon, 13 Oct 2014 10:59:54 +0200
Newsgroups gmane.ietf.dnsext
Message-ID <[email protected]>
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.

I have implemented this (http://nlnetlabs.nl/projects/autotrust/) and I 
agree with Michael's interpretations (even if it was after an hour 
asking questions at some past IETF).

I am trying to clarify below, although most stuff seems already 
straighted out.

>> On Oct 7, 2014, at 1:03 PM, Michael StJohns <[email protected]> wrote:
>>
>> > At 01:13 PM 10/7/2014, Paul Hoffman wrote:
>> >> Greetings. In reading RFC 5011 more carefully, I am finding that
>> some of the wording is confusing (possibly just to me). I have a few
>> questions for people who have implemented it in systems, but also want
>> to hear from the greater DNS community.
>> >>
>> >> Section 2.2 says:
>> >>
>> >>  Assume two trust point keys A and B.  Assume that B has been
>> >>  compromised.  An attacker could generate and add a new trust anchor
>> >>  key C (by adding C to the DNSKEY RRSet and signing it with B), and
>> >>  then invalidate the compromised key.  This would result in both the
>> >>  attacker and owner being able to sign data in the zone and have it
>> >>  accepted as valid by resolvers.
>> >>
>> >> I am assuming that "invalidate" means "revoke".
>> >
>> > Yes.
>> >
>> >> Pictorially, I think this means the following progression in time:
>> >>  1: Owner's zone: A signs (A B)
>> >>
>> >
>> > 1.5 Attacker's zone: B signs (B C)
>> > (This has to happen for the Add Hold down time until C becomes a
>> valid trust anchor.  In general this is going to be B and C sign (B,
>> C) for the hold down period).
>>
>> There is nothing in the quoted paragraph from the RFC that indicates
>> that the attacker gets C to be a valid trust anchor. It sounds like
>> you meant to say "the attack is only going to work if a relying party
>> trust C, and that will only happen after the hold-down period, so the
>> attacker first introduces C, then only that has succeeded for some
>> desired targets, revokes B".
>
>
> The add hold down time is meant to provide some breathing room for the
> owner against an attacker adding a new trust anchor.  If the attacker
> holds only one key (B), and the owner doesn't revoke it, then eventually
> the attacker can add a new trust anchor (C).  The incantation for the
> attacker is "B and C sign (B C X)" where X is a ZSK key owned by the
> attacker.   The moment that the owner sees something it hasn't itself
> signed, signed with B, then the owner should issue "A and B sign (A, Br,
> D, Z)" where D is the owner's replacement for B and where Z is a ZSK key
> owned by the owner.
>
> Any SEP key can become a trust anchor if it is validly signed and is in
> the DNSKEY RRSet for the add hold down time (plus one retrieval).

All above seems pretty clear.


>> >
>> >> 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.


> 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.

>> >
>> > What happens at a validator depends on what the validator sees.  In
>> general this goes:
>> >
>> > A Signs (A B)
>> > B is compromised
>> > Owner:  A and B sign (A Br D) - B is revoked and D starts its
>> process of being added as a trust anchor.
>> > Attacker:  B signs (B C)
>> >
>> > The key point is that if the validator sees even one of the "A and B
>> sign (A Br D)" RRSets, then B is revoked and "B signs (B C)" will fail
>> validation leading to C not being added to the trust anchor set.
>>
>> Yes, that's clearly the intent, and it should work (assuming that the
>> resolver follows the "revoke B as soon as you see a B-signed-Br
>> anywhere" rule).
>
>
> I can't help it if they don't read the black and white text of 5011.
>
>
>
>>     A key is
>> considered revoked when the resolver sees the key in a
>>     self-signed RRSet and the key has the REVOKE bit (see
>> Section 7  <http://tools.ietf.org/html/rfc5011#section-7>
>>     below) set to '1'.  Once the resolver sees the REVOKE
>> bit, it MUST
>>     NOT use this key as a trust anchor or for any other purpose
>> except to
>>     validate the RRSIG it signed over the DNSKEY RRSet
>> specifically for
>>     the purpose of validating the revocation.  Unlike the
>> 'Add' operation
>>     below, revocation is immediate and permanent upon receipt of
>> a valid
>>     revocation at the
>> resolver.
>
>
>
>> >> I don't understand why B signs (A D) in 2b. B is already untrusted
>> to anyone who saw 2a, and is untrusted by anyone looking at all of 2b.
>> These instructions seem to be saying "put a signature into the zone
>> that cannot be validated". I would think that 2b should just be "B
>> signs (Br) and A signs (A D)", but that's not what the RFC says.
>> >
>> > You can't actually have two different versions of the DNSKEY RRSet
>> being simultaneously offered by a single responder.  You *can* have
>> multiple signatures over a single DNSKEY RRSet.
>> >
>> > So the above is actually "A and B sign (A Br D)". It's also actually
>> more like "A and B sign (Br D and Z)" where "Z" is one of the ZSKs.
>> So you get "B signs Br to revoke itself", "A signs D to add D to the
>> trust anchor set" and "A signs Z so that Z chains to the root of trust".
>> >
>> > That's expressed by a DNSKEY RRSet consisting of B with the revoke
>> bit, D with the SEP bit and Z without the SEP bit with two
>> RRSIG(DNSKEY) records consisting of a signature by A and  a signature
>> by B.
>>
>>
>> On Oct 7, 2014, at 1:10 PM, Michael StJohns <[email protected]> wrote:
>>
>> > Sorry -
>> >
>> > This is actually "A and B sign (A Br D and Z)".
>> >
>> > A signing key needs to be included in the DNSKEY RRSet even if its
>> already accepted as a trust anchor.  That's mainly so the key id
>> reference of the RRSIG (DNSKEY) can find the appropriate public key
>> for validation.
>>
>> Why D? Is it a replacement for B because 5011 works better with more
>> than one trust anchor? I didn't see anything in the section that
>> explained D, and from what you say above, it looks like I guessed
>> wrong the first time.
>
>
> 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)"

> 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)".


Best regards,
   Matthijs

> In practice, it may take a little time to get folks together for the key
> ceremony for C, so you may end up with an interim DNSKEY RRSet "A and B
> sign (Ar B Z)" for a few days.  [Which by itself suggests a need to be
> able to do signatures without having everyone physically present]
>
>
> In the above, the attacker's only ploy is to do "A signs (A N X)" where
> N is a new trust anchor key owned by the attacker and X is a new ZSK
> also owned by the attacker.  His hope is that the validly signed (by
> compromised key A) RRSet gets accepted for a short while by specific
> targets and maybe long enough to get a new trust anchor key accepted by
> those specific targets.
>
>
>> --Paul Hoffman
>
>
>
> _______________________________________________
> dnsext mailing list
> [email protected]
> https://www.ietf.org/mailman/listinfo/dnsext
>

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