[websec] AD review of draft-ietf-websec-key-pinning-17
Barry Leiba <barryleiba@computer.org> Thu, 26 June 2014 11:00 UTC
Return-Path: <barryleiba@gmail.com>
X-Original-To: websec@ietfa.amsl.com
Delivered-To: websec@ietfa.amsl.com
Received: from localhost (ietfa.amsl.com [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id E2D5F1B2B16 for <websec@ietfa.amsl.com>; Thu, 26 Jun 2014 04:00:19 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: 0.621
X-Spam-Level:
X-Spam-Status: No, score=0.621 tagged_above=-999 required=5 tests=[BAYES_20=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, FM_FORGED_GMAIL=0.622, FREEMAIL_FROM=0.001, SPF_PASS=-0.001] autolearn=no
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ACMvB478nbuL for <websec@ietfa.amsl.com>; Thu, 26 Jun 2014 04:00:16 -0700 (PDT)
Received: from mail-lb0-x232.google.com (mail-lb0-x232.google.com [IPv6:2a00:1450:4010:c04::232]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 4155A1B2A61 for <websec@ietf.org>; Thu, 26 Jun 2014 04:00:16 -0700 (PDT)
Received: by mail-lb0-f178.google.com with SMTP id 10so2768133lbg.23 for <websec@ietf.org>; Thu, 26 Jun 2014 04:00:14 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:date:message-id:subject:from:to:cc:content-type; bh=In2ZKow753t8AQhwjGuu2HiGZqyCcQdLeA263/S/5zc=; b=KWTOognURv+5be/Z4XKCTZ8G9bx2EYiczbeErdJSqrWr/PrhfOObOp9idAm0Whutyl bWdQGi/6rpZb35D1xrr6Y3JQj75cCgsPMVY7CxT39cb49rI92/GzvxvheInloP0wjGwD gr5qsBDTL5KSxVNg2CQH0oHIh/gYuLBJcq3LQWClgzHmRtO/KDIgTzMQ1CrcqOqePsSw si7MkjKYrNX8wU7uUN25KHTqK6V4DZXt3EFKFTnL2cWW+rCowmRqUa/8CL+P+SqXY6LA AMaV6NId9dlV1NX5jFjQoCtWz8Et+8BirIfwpV/BYyVL5B+YqUF0EyKelAticXxEU5I9 IAsw==
MIME-Version: 1.0
X-Received: by 10.152.23.136 with SMTP id m8mr10614334laf.2.1403780414416; Thu, 26 Jun 2014 04:00:14 -0700 (PDT)
Sender: barryleiba@gmail.com
Received: by 10.152.104.80 with HTTP; Thu, 26 Jun 2014 04:00:14 -0700 (PDT)
Date: Thu, 26 Jun 2014 07:00:14 -0400
X-Google-Sender-Auth: YnWfEeQH0LNib9Ca8-VT3Ja0dPI
Message-ID: <CALaySJLWny1EBpre_v_A80XTX2n0tSs1s7tXdh7z_joTHGNU6w@mail.gmail.com>
From: Barry Leiba <barryleiba@computer.org>
To: draft-ietf-websec-key-pinning.all@tools.ietf.org
Content-Type: text/plain; charset="ISO-8859-1"
Archived-At: http://mailarchive.ietf.org/arch/msg/websec/H2QlRVuhf9b2DTjDeCj8C9EnSjQ
Cc: "websec@ietf.org" <websec@ietf.org>
Subject: [websec] AD review of draft-ietf-websec-key-pinning-17
X-BeenThere: websec@ietf.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: Web Application Security Minus Authentication and Transport <websec.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/websec>, <mailto:websec-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/websec/>
List-Post: <mailto:websec@ietf.org>
List-Help: <mailto:websec-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/websec>, <mailto:websec-request@ietf.org?subject=subscribe>
X-List-Received-Date: Thu, 26 Jun 2014 11:00:20 -0000
With the publication request for draft-ietf-websec-key-pinning, here's
my AD review. I'm putting the document into "Revised I-D Needed"
substate. That said, you should definitely push back at me on points
below that you disagree with. And note the point about the registry
that you're not creating, which I specifically want to discuss with
you.
Yoav, thanks for a very good shepherd writeup.
Tiny thing in the Abstract: we have to squash this "this memo" stuff
forever, but it'll probably take forever to do it. Please make it
"this document".
Similarly in the Introduction: Remember that the text has to make
sense after publication. "We propose a new HTTP header to enable..."
doesn't do that (even though "Proposed Standard" will be the RFC's
status). Go with "This document defines a new HTTP header that
enables...".
Tiny editorial: I suggest changing "that becomes invalid. (See
Section 4.)" to "that becomes invalid (see Section 4)." -- merging the
citation into the sentence. There are a couple of other citations in
the document that also read like that.
And in general, wherever you have a citation that looks like this: ([RFC6234])
...remove the parentheses so it looks like this: [RFC6234]
Is "we believe that" in the middle of the second paragraph something
that should stand as it is in the final RFC?
And I suggest:
OLD
We intend for hosts to use PKP together with HSTS ([RFC6797]), but is
possible to pin keys without requiring HSTS.
NEW
PKP is meant to be used together with HTTP Strict Transport Security
(HSTS) [RFC6797], but it is possible to pin keys without requiring HSTS.
END
You could make sure that "This draft is being discussed on the WebSec
Working Group mailing list, websec@ietf.org." is removed in AUTH48,
and the RFC Editor is likely to catch that anyway, but it can also be
removed now: the draft name already points readers to the working
group.
-- Section 2.1 --
The "Public-Key-Pins" and "Public-Key-Pins-Report-Only" header
fields, also referred to within this specification as the PKP and
PKP-RO header fields, respectively, are are response headers used by
server to indicate that a a UA should perform Pin Validation
(Section 2.6) in regards to the host emitting the response message
containing these header fields, and provide the necessary information
for the UA to do so.
Apart from the length of that one sentence, there are some typos
there. How about this?:
NEW
The "Public-Key-Pins" and "Public-Key-Pins-Report-Only" header
fields, also referred to within this specification as the PKP and
PKP-RO header fields, respectively, are new response headers
defined in this specification. They are used by a server to
indicate that a UA should perform Pin Validation (Section 2.6)
for the host emitting the response message, and to provide the
necessary information for the UA to do so.
END
2. All simple-directives MUST appear only once in a given header
field. Directives are either optional or required, as stipulated
in their definitions.
I don't think that's correct. It's certainly not required that each
header field contain every simple-directive. I think you mean this:
NEW
2. A given simple-directive MUST NOT appear more than once in a
given header field. Directives are either optional or required,
as stipulated in their definitions.
END
For list item 4, would it help to explain why? Perhaps, "In
particular, UAs must not attempt to fix malformed header fields." ?
Additional directives extending the semantic functionality of the
header fields can be defined in other specifications, with a registry
(having an IANA policy definition of IETF Review [RFC5226]) defined
for them at such time. Such future directives will be ignored by UAs
implementing only this specification, as well as by generally non-
conforming UAs.
I don't think it's clear enough that this document doesn't define that
registry, and that this is giving instruction for future registry
creation. Please talk with me about why you feel the need *now* to
say that a future registry will have to use IETF Review as its policy.
Why would Specification Required or Expert Review not be OK? Why
shouldn't the decision be left for the time the registry is created?
In the pin-directive, the token is the name of a cryptographic hash
algorithm, and MUST be "sha256". (In the future, additional hash
algorithms MAY be registered and used.) The quoted-string is a
sequence of base 64 digits: the base 64-encoded SPKI Fingerprint
([RFC4648]). See Section 2.4.
I don't like the MUST there (nor the MAY). As to "registered and
used", is this intended to be in the same registry as above? So the
directive "pin-sha256" would be registered, along with a new
"pin-shaXYZ"?
Assuming that's right, I'm really starting to think that the registry
should be created now. The reason to defer creation is if we think
that no new directives will ever really come along, so we won't need
the registry. But if the hash algorithm names will be in the
registry, we can be pretty sure we'll need new ones.
Anyway, a fix for this paragraph (but this will change if we create
the registry now) could be like this:
NEW
In the pin-directive, the token is the name of a cryptographic hash
algorithm. The only algorithm allowed at this time is "sha256";
additional algorithms may be defined in the future. The quoted-string
is a sequence of base 64 digits: the base 64-encoded SPKI Fingerprint
[RFC4648]. See Section 2.4.
END
The UA MUST ignore pin-directives with tokens naming hash algorithms
it does not recognize. If the set of remaining effective pin-
directives is empty, and if the connection passed Pin Validation with
the UA's existing noted pins for the Host (i.e. the Host is a Known
Pinned Host), the UA MUST cease to consider the Host as a Known
Pinned Host. (I.e. the UA should fail open.) The UA SHOULD indicate
to users that the Host is no longer a Known Pinned Host.
The first sentence follows from (5) in the above list, so I suggest
you say so. This also appears to be where you define "Known Pinned
Host", but you've buried the lede here. I suggest this:
NEW
When a connection passes Pin Validation using the UA's noted pins
for the Host at the time, the Host becomes a Known Pinned Host.
According to rule 5, above, the UA MUST ignore pin-directives with
tokens naming hash algorithms it does not recognize. If the set of
remaining effective pin-directives is empty, and if the Host is a
Known Pinned Host, the UA MUST cease to consider the Host as a Known
Pinned Host (the UA should fail open). The UA SHOULD indicate to
users that the Host is no longer a Known Pinned Host.
END
On the last sentence, though, I'm really unsure: are we really giving
UI advice in a protocol document? Is that a good idea? Do w have any
sense that my mother will have the first idea what you're talking
about when you indicate this to her?
This also is a good place for me to point out that you use "host" and
"Host" inconsistently. I think you use "pin" and "Pin" inconsistently
as well. The RFC Editor will ask you to fix that, so you can save
time by doing it now. Please go through the document and make sure
your capitalization in general is purposeful and consistent.
-- Section 2.1.1 --
In the first sentence, remove both commas. The second sentence is
unnecessary, as it's repeated at the end of the section.
-- Section 2.1.2 --
Change "which" to "that" (or the RFC Editor will).
-- Section 2.1.3 --
What does it mean to use POST on a URI that isn't http or https? What
do you do with a wss URI, for example?
Note that the report-uri need not necessarily be in the same Internet
domain or web origin as the Known Pinned Host.
This is confusing, particularly in context with the previous
paragraph. I think you mean this:
NEW
Note that the host in the report-uri need not necessarily be in the
same Internet domain or web origin as the host being reported about.
END
-- Section 2.2.1 --
Establishing a given host as a Known Pinned Host, in the context of a
given UA, MAY be accomplished over the HTTP protocol, which is in
turn running over secure transport, by correctly returning (per this
specification) at least one valid PKP header field to the UA. Other
mechanisms, such as a client-side pre-loaded Known Pinned Host list
MAY also be used.
There are two problems with this paragraph:
1. It has two sentences, and each sentence gives a MAY directive.
That means they're both optional, which means that it's possible to do
neither. Really? It seems to me that you mean to say that you do one
or the other.
2. The "which is in turn" part is non-restrictive -- it could be
removed without changing the meaning. I don't think so. I think you
mean to say that it may be accomplished by using HTTP over secure
transport -- the secure transport is a necessary part, yes?
Assuming so, try this:
NEW
Establishing a given host as a Known Pinned Host, in the context of a
given UA, is accomplished as follows:
1. Over the HTTP protocol running over secure transport, by correctly
returning (per this specification) at least one valid PKP header field
to the UA.
2. Through other mechanisms, such as a client-side pre-loaded Known
Pinned Host list.
END
-- Section 2.3.1 --
"the UA MUST either" introduces a list of eight items. Only the first
two are meant to be part of the "MUST either". I suggest that you
pull the last six items out of the list, and just make them regular
paragraphs.
In the second list item, "different than that already maintained":
"different than" is incorrect. Use either "different from" (US) or
"different to" (UK).
I think the third and fourth items can be in one paragraph.
"Otherwise:" is not necessary.
The sixth and seventh items can be merged into one paragraph (one sentence).
-- Section 2.3.2 --
This section should say what to do with the KPH cached information if
a PKP-RO header is received. If the Pin Validation fails, it's clear
what to do. But if Pin Validation succeeds, does the host become a
KPH? If it's already a KPH, is the cached information updated? If
there's both a PKP header and a PKP-RO header, Pin Validation succeeds
for both, and they have different directives, which wins with respect
to the KPH cached information?
-- Section 2.3.3 --
The UA MUST ignore all
expired Known Pinned Hosts from its cache if, at any time, an expired
Known Pinned Host exists in the cache.
Eh? I don't understand what this is trying to say. Do you mean "MUST
*remove* them from its cache? What's with the "at any time" bit?
Please try rephrasing this -- I don't understand it well enough to
try.
For the second paragraph, I would add something more explanatory to
real humans here, inserted as a first sentence: "Known Pinned Hosts
are only domain names, and never IP addresses."
And here we have another hugely long sentence. Please keep in mind
that when sentences get too long, people have trouble understanding
them.
OLD
Otherwise, if the substring does not congruently match a Known Pinned
Host's domain name, per the matching procedure specified in
Section 8.2 of [RFC6797], then the UA MUST note this host as a Known
Pinned Host, caching the Pinned Host's domain name and noting along
with it the Effective Expiration Date (or enough information to
calculate it, i.e. the Effective Pin Date and the value of the max-
age directive), whether or not the includeSubDomains directive is
asserted, the value of the report-uri directive (if present). If any
other metadata from optional or future PKP header directives is
present in the Valid Pinning Header, the UA MAY note them if it
understands them, and need not note them if it does not understand
them.
NEW
Otherwise, if the substring does not congruently match an existing
Known Pinned Host's domain name, per the matching procedure specified
in Section 8.2 of [RFC6797], then the UA MUST add this host to the
Known Pinned Host cache. The UA caches:
o the Pinned Host's domain name,
o the Effective Expiration Date, or enough information to calculate
(the Effective Pin Date and the value of the max-age directive),
o whether or not the includeSubDomains directive is asserted, and
o the value of the report-uri directive, if present.
If any other metadata from optional or future PKP header directives
are present in the Valid Pinning Header, and the UA understands them,
the UA MAY note them as well.
END
-- Section 2.4 --
(Future
versions of this specification may add new algorithms and deprecate
old ones.)
I would say "Future specifications"; algorithms might be added or
deprecated in extensions, not necessarily in future versions of *this*
specification.
If the certificate's subjectPublicKeyInfo is incomplete when taken in
isolation, such as when holding a DSA key without domain parameters,
a public key pin cannot be formed. Hence, pins using these keys
cannot be pinned.
The second sentence is silly. *Pins* aren't pinned. Either remove
the sentence (it's redundant anyway) or change the subject.
-- Section 2.5 --
Upon receipt of the PKP response header field, the UA notes the host
as a Pinned Host, storing the Pins and their associated directives in
non-volatile storage
"as a Known Pinned Host"... need to use terminology consistently.
The three-bullet list is wrong: the first phrase of each must be
factored out, because the "if and only if" applies to all three points
together. So, like this:
OLD
The UA MUST observe these conditions when noting a Host:
o The UA MUST note the Pins if and only if it received the PKP
response [...]
o The UA MUST note the Pins if and only if the TLS connection [...]
o The UA MUST note the Pins if and only if the given set of Pins
contains [...]
NEW
The UA MUST note the Pins for a Host if and only if all three of
the following conditions hold:
o It received the PKP response [...]
o The TLS connection [...]
o The given set of Pins contains [...]
END
-- Section 2.6 --
A UA
SHOULD perform Pin Validation whenever connecting to a Known Pinned
Host, but MAY allow Pin Validation to be disabled for Hosts according
to local policy.
Typical SHOULD/MAY trap. MAY is not an explanation of when you can
violate SHOULD. MAY means that something is entirely optional.
NEW
A UA
SHOULD perform Pin Validation whenever connecting to a Known Pinned
Host. It is acceptable to allow Pin Validation to be disabled for
some Hosts according to local policy.
END
Although the UA has previously received Pins at the HTTP layer, it
can and MUST perform Pin Validation at the TLS layer, before
beginning an HTTP conversation over the TLS channel. The TLS layer
thus evaluates TLS connections with pinning information the UA
received previously, regardless of mechanism: statically preloaded,
via HTTP header, or some other means (possibly in the TLS layer
itself).
Can you re-word this? It seems very strained, and I don't understand
it. There's no background for telling me what the UA has previously
received. I thought Pins *only* happened with TLS, so how can they
have been received without it? And please avoid phrasing such as "can
and MUST"; it if MUST, it clearly can, or else the MUST is
meaningless.
For the last paragraph of the section, the combined negatives can be
confusing, but the structure is necessary in order for the SHOULD NOT
to work. Perhaps an inserted first sentence that explains it
affirmatively will help: "UAs send validation failure reports only
when Pin Validation is actually in effect."
-- Section 2.7 --
In the first sentence, again, you're giving UI advice, and advice that
I find questionable. This is an option that will *only* be applicable
to expert users, and that won't be understood, much less used, by
99.999% of UA users (certainly not by my mother). I can't imagine how
such advice, well intentioned though it may be, merits a SHOULD.
-- Section 3 --
include-subdomains indicates whether or not the UA has noted the
includeSubDomains directive for the Known Pinned Host. It is
provided as one of the JSON identifiers true or false.
I would put "true" and "false" in quotes in the text.
-- Section 4.3 --
Because having a backup key pair is so important to recovery, UAs
MUST require that hosts set a Backup Pin. (See Section 2.5.)
Unless I misunderstand, this requirement means that if my server
doesn't send a backup pin, my server doesn't benefit from key pinning
(it's as though I never included the header in the first place). If
that's not true, then Section 2.5 needs to be fixed to make it clear
that failure to include a backup pin constitutes a validation failure.
If that is true, then you're trading off recovery for security, and I
expect the Security ADs to question that. To head that off, it might
be good to acknowledge that here, and perhaps to say a few more words
about it.
-- Section 7 --
I'll repeat the comment here about giving UI advice, especially with
SHOULDs and MUSTs. The portion of users who will have any idea what
you're talking about is vanishingly small.
-- Appendix B --
I *strongly* advise you to pull the SHOULDs out of here, and talk
about this advice without using 2119 key words. None of this has
anything to do with interoperability of the protocol -- it's all
quality of implementation/deployment stuff.
--
Barry, Applications AD
- [websec] AD review of draft-ietf-websec-key-pinni… Barry Leiba
- Re: [websec] AD review of draft-ietf-websec-key-p… Yoav Nir
- Re: [websec] AD review of draft-ietf-websec-key-p… Barry Leiba
- Re: [websec] AD review of draft-ietf-websec-key-p… Chris Palmer
- Re: [websec] AD review of draft-ietf-websec-key-p… Barry Leiba
- Re: [websec] AD review of draft-ietf-websec-key-p… Chris Palmer
- Re: [websec] AD review of draft-ietf-websec-key-p… Barry Leiba