-
Notifications
You must be signed in to change notification settings - Fork 35
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* [Editorial] Fixing links Updating links in a few ways, none of which (intentionally) change normative meaning: 1. Linking to HTML, not HTML5. 2. Dropping hard-coded links that are now properly exported. 3. Updating grammar to link to CSP. * [Editorial] Integrate with WPT. Rather than linking to (very) old implementation reports, we can instead render live data from WPT instead. * [Editorial] Add syntax highlighting. This patch cleans up example code by using `<xmp>` instead of `<pre>` to make things more readable, and by adding syntax highlighting. * [Editorial] Remove uninteresting metadata. * [Editorial] Make variable names more generic. If we'd like to support non-hash algorithms, changing variable names in the parsing function will reduce the complexity of future diffs.
- Loading branch information
Showing
1 changed file
with
57 additions
and
84 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,12 +1,10 @@ | ||
<pre class="metadata"> | ||
Title: Subresource Integrity | ||
Status: ED | ||
Deadline: 2015-12-15 | ||
ED: https://w3c.github.io/webappsec-subresource-integrity/ | ||
TR: http://www.w3.org/TR/SRI/ | ||
Previous Version: http://www.w3.org/TR/2015/WD-SRI-20151006/ | ||
Shortname: SRI | ||
Level: 1 | ||
Level: none | ||
Editor: Devdatta Akhawe, Dropbox Inc., http://devd.me, [email protected] | ||
Editor: Frederik Braun 68466, Mozilla, https://frederik-braun.com, [email protected] | ||
Editor: François Marier, Mozilla, https://fmarier.org, [email protected] | ||
|
@@ -18,8 +16,8 @@ Group: webappsec | |
Repository: w3c/webappsec-subresource-integrity | ||
Indent: 2 | ||
Version History: https://github.com/w3c/webappsec-subresource-integrity/commits/gh-pages | ||
!Implementation status: <a href="https://code.google.com/p/chromium/issues/detail?id=355467">Blink/Chromium</a><br /><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=992096">Gecko</a> | ||
!Implementation report: <a href="https://github.com/w3c/webappsec-subresource-integrity/wiki/Links">https://github.com/w3c/webappsec-subresource-integrity/wiki/Links</a> | ||
WPT Path Prefix: /subresource-integrity/ | ||
WPT Display: closed | ||
Markup Shorthands: css off, markdown on | ||
Ignored Vars: src, resource, val | ||
|
@@ -31,57 +29,28 @@ spec: ABNF; urlPrefix: https://tools.ietf.org/html/rfc5234 | |
text: VCHAR; url: appendix-B.1 | ||
text: WSP; url: appendix-B.1 | ||
type: grammar | ||
text: ALPHA; url: appendix-B.1 | ||
text: DIGIT; url: appendix-B.1 | ||
text: VCHAR; url: appendix-B.1 | ||
text: WSP; url: appendix-B.1 | ||
|
||
|
||
spec: Fetch; urlPrefix: https://fetch.spec.whatwg.org | ||
type: dfn | ||
text: fetch; url: concept-fetch | ||
text: request; url: concept-request | ||
text: response type; url: concept-response-type | ||
text: destination; url: concept-request-destination | ||
|
||
spec: HTML5; urlPrefix: http://www.w3.org/TR/html5/ | ||
type: dfn | ||
urlPrefix: document-metadata.html | ||
text: obtain a resource; url: concept-link-obtain | ||
urlPrefix: infrastructure.html | ||
text: CORS settings attribute; url: #cors-settings-attributes | ||
text: reflect; url: #reflect | ||
urlPrefix: scripting-1.html | ||
text: prepare a script; url: #prepare-a-script | ||
text: splitting tokens on spaces; url: split-a-string-on-spaces | ||
|
||
spec: RFC7234; urlPrefix: https://tools.ietf.org/html/rfc7234 | ||
type: dfn | ||
text: Cache-Control; url: section-5.2 | ||
text: no-transform; url: section-5.2.1.6 | ||
|
||
spec: SECURE-CONTEXTS; urlPrefix: http://www.w3.org/TR/powerful-features/ | ||
type: dfn | ||
text: Secure Context; urlPrefix: # | ||
|
||
spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf | ||
spec: SHA2; urlPrefix: https://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf | ||
type: dfn | ||
text: SHA-1; url: # | ||
text: SHA-2; url: # | ||
text: SHA-256; url: # | ||
text: SHA-384; url: # | ||
text: SHA-512; url: # | ||
</pre> | ||
<pre class="link-defaults"> | ||
spec:csp3; type:grammar; text:base64-value | ||
</pre> | ||
|
||
<pre class="biblio"> | ||
{ | ||
"SECURE-CONTEXTS": { | ||
"authors": [ "Mike West", "Yan Zhu" ], | ||
"href": "https://w3c.github.io/webappsec-secure-contexts/", | ||
"title": "Secure Contexts", | ||
"status": "WD", | ||
"publisher": "W3C" | ||
}, | ||
"SHA2": { | ||
"href": "http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf", | ||
"title": "FIPS PUB 180-4, Secure Hash Standard" | ||
|
@@ -128,17 +97,21 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
`script` element, like so: | ||
|
||
<div class="example"> | ||
<pre> | ||
<script src="https://example.com/example-framework.js" | ||
<xmp highlight="html"> | ||
<script src="https://example.com/example-framework.js" | ||
integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7" | ||
crossorigin="anonymous"></script> | ||
</pre> | ||
crossorigin="anonymous"></script> | ||
</xmp> | ||
</div> | ||
|
||
Scripts, of course, are not the only response type which would benefit | ||
from integrity validation. The scheme specified here also applies to `link` | ||
and future versions of this specification are likely to expand this coverage. | ||
|
||
<wpt> | ||
subresource-integrity.html | ||
</wpt> | ||
|
||
## Goals ## {#goals} | ||
|
||
1. Compromise of a third-party service should not automatically mean | ||
|
@@ -163,11 +136,11 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
<a>integrity metadata</a> is added to the `link` element included on the page: | ||
|
||
<div class="example"> | ||
<pre> | ||
<link rel="stylesheet" href="https://site53.example.net/style.css" | ||
<xmp highlight="html"> | ||
<link rel="stylesheet" href="https://site53.example.net/style.css" | ||
integrity="sha384-+/M6kredJcxdsqkczBUjMLvqyHb1K/JThDXWsBVxMEeZHEaMKEOEct339VItX1zB" | ||
crossorigin="anonymous"> | ||
</pre> | ||
crossorigin="anonymous"> | ||
</xmp> | ||
</div> | ||
|
||
* An author wants to include JavaScript provided by a third-party | ||
|
@@ -176,11 +149,11 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
the script, and adds it to the `script` element: | ||
|
||
<div class="example"> | ||
<pre> | ||
<script src="https://analytics-r-us.example.com/v1.0/include.js" | ||
<xmp highlight="html"> | ||
<script src="https://analytics-r-us.example.com/v1.0/include.js" | ||
integrity="sha384-MBO5IDfYaE6c6Aao94oZrIOiC6CGiSN2n4QUbHNPhzk5Xhm0djZLQqTpL0HzTUxk" | ||
crossorigin="anonymous"></script> | ||
</pre> | ||
crossorigin="anonymous"></script> | ||
</xmp> | ||
</div> | ||
|
||
* A user agent wishes to ensure that JavaScript code running in high-privilege HTML | ||
|
@@ -213,10 +186,11 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
specified in RFC5234. [[!ABNF]] | ||
|
||
<a href="https://tools.ietf.org/html/rfc5234#appendix-B.1">Appendix B.1</a> of | ||
[[!ABNF]] defines <a>VCHAR</a> (printing characters). | ||
[[!ABNF]] defines the <a>VCHAR</a> (printing characters) and <a>WSP</a> | ||
(whitespace) rules. | ||
|
||
<a>WSP</a> (white space) characters are defined in <a href="http://www.w3.org/TR/html5/infrastructure.html#space-character">Section 2.4.1 Common parser idioms</a> of the HTML 5 specification as | ||
<code>White_Space characters</code>. [[!HTML5]] | ||
Content Security Policy defines the <a grammar>`base64-value`</a> and | ||
<a grammar>`hash-algorithm`</a> rules. [[!CSP]] | ||
|
||
</section> | ||
|
||
|
@@ -232,8 +206,8 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
## Integrity metadata ## {#integrity-metadata-description} | ||
|
||
To verify the integrity of a response, a user agent requires <dfn>integrity | ||
metadata</dfn> as part of the <a>request</a>. This metadata consists of the | ||
following pieces of information: | ||
metadata</dfn> as part of the <a for=/>request</a>. This metadata consists of | ||
the following pieces of information: | ||
|
||
* cryptographic hash function ("alg") | ||
* <a>digest</a> ("val") | ||
|
@@ -257,9 +231,9 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
as follows: | ||
|
||
<div class="example"> | ||
<pre> | ||
<xmp> | ||
sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO | ||
</pre> | ||
</xmp> | ||
</div> | ||
|
||
<div class="note"> | ||
|
@@ -268,9 +242,9 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
available. The example in this section is the result of the following command | ||
line: | ||
|
||
<pre> | ||
<xmp highlight="shell"> | ||
echo -n "alert('Hello, world.');" | openssl dgst -sha384 -binary | openssl base64 -A | ||
</pre> | ||
</xmp> | ||
</div> | ||
|
||
## Cryptographic hash functions ## {#hash-functions} | ||
|
@@ -293,21 +267,21 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
by either of the following hash expressions: | ||
|
||
<div class="example"> | ||
<pre> | ||
<xmp> | ||
sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO | ||
sha512-Q2bFTOhEALkN8hOms2FKTDLy7eugP2zFZ1T8LCvX42Fp3WoNr3bjZSAHeOsHrbV1Fu9/A0EzCinRE7Af1ofPrw== | ||
</pre> | ||
</xmp> | ||
</div> | ||
|
||
Authors may choose to specify both, for example: | ||
|
||
<div class="example"> | ||
<pre> | ||
<script src="hello_world.js" | ||
<xmp highlight="html"> | ||
<script src="hello_world.js" | ||
integrity="sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO | ||
sha512-Q2bFTOhEALkN8hOms2FKTDLy7eugP2zFZ1T8LCvX42Fp3WoNr3bjZSAHeOsHrbV1Fu9/A0EzCinRE7Af1ofPrw==" | ||
crossorigin="anonymous"></script> | ||
</pre> | ||
crossorigin="anonymous"></script> | ||
</xmp> | ||
</div> | ||
|
||
In this case, the user agent will choose the strongest hash function in the | ||
|
@@ -355,15 +329,15 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
1. Let |result| be the empty set. | ||
2. For each |item| returned by <a lt="strictly split">splitting</a> | ||
|metadata| on spaces: | ||
1. Let |hash-with-opt-token-list| be the result of | ||
1. Let |expression-and-options| be the result of | ||
<a lt="strictly split">splitting</a> |item| on U+003F (?). | ||
2. Let |hash-expression| be |hash-with-opt-token-list|[0]. | ||
2. Let |algorithm-expression| be |expression-and-options|[0]. | ||
3. Let |base64-value| be the empty string. | ||
4. Let |hash-expr-token-list| be the result of | ||
<a lt="strictly split">splitting</a> |hash-expression| on U+002D (-). | ||
5. Let |algorithm| be |hash-expr-token-list|[0]. | ||
6. If |hash-expr-token-list|[1] <a for=list>exists</a>, set | ||
|base64-value| to |hash-expr-token-list|[1]. | ||
4. Let |algorithm-and-value| be the result of | ||
<a lt="strictly split">splitting</a> |algorithm-expression| on U+002D (-). | ||
5. Let |algorithm| be |algorithm-and-value|[0]. | ||
6. If |algorithm-and-value|[1] <a for=list>exists</a>, set | ||
|base64-value| to |algorithm-and-value|[1]. | ||
7. If |algorithm| is not a hash function recognized by the user agent, | ||
[=continue=]. | ||
8. Let |metadata| be the ordered map «["alg" → |algorithm|, | ||
|
@@ -372,7 +346,7 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
Note: Since no `options` are defined (see the | ||
[[#integrity-metadata-description]]), a corresponding entry is not set | ||
in |metadata|. If `options` are defined in a future version, | ||
|hash-with-opt-token-list|[1] can be utilized as `options`. | ||
|expression-and-options|[1] can be utilized as `options`. | ||
|
||
9. <a for=list>Append</a> |metadata| to |result|. | ||
3. Return |result|. | ||
|
@@ -417,12 +391,12 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
functions. For example, a developer might write a `script` element such as: | ||
|
||
<div class="example"> | ||
<pre> | ||
<script src="https://example.com/example-framework.js" | ||
<xmp highlight="html"> | ||
<script src="https://example.com/example-framework.js" | ||
integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7 | ||
sha384-+/M6kredJcxdsqkczBUjMLvqyHb1K/JThDXWsBVxMEeZHEaMKEOEct339VItX1zB" | ||
crossorigin="anonymous"></script> | ||
</pre> | ||
crossorigin="anonymous"></script> | ||
</xmp> | ||
</div> | ||
|
||
which would allow the user agent to accept two different content payloads, one | ||
|
@@ -461,9 +435,7 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
<dfn>integrity-metadata</dfn> = *<a>WSP</a> <a>hash-with-options</a> *(1*<a>WSP</a> <a>hash-with-options</a> ) *<a>WSP</a> / *<a>WSP</a> | ||
<dfn>hash-with-options</dfn> = <a>hash-expression</a> *("?" <a>option-expression</a>) | ||
<dfn>option-expression</dfn> = *<a>VCHAR</a> | ||
<dfn>hash-algo</dfn> = <hash-algo production from [Content Security Policy Level 2, section 4.2]> | ||
<dfn>base64-value</dfn> = <base64-value production from [Content Security Policy Level 2, section 4.2]> | ||
<dfn>hash-expression</dfn> = <a>hash-algo</a> "-" <a>base64-value</a> | ||
<dfn>hash-expression</dfn> = <a grammar>hash-algorithm</a> "-" <a grammar>base64-value</a> | ||
</pre> | ||
|
||
`option-expression`s are associated on a per `hash-expression` basis and are | ||
|
@@ -537,8 +509,9 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
|
||
## Cross-origin data leakage ## {#cross-origin-data-leakage} | ||
|
||
This specification requires the <a>CORS settings attribute</a> to be present on | ||
integrity-protected cross-origin requests. If that requirement were omitted, | ||
This specification requires integrity-protected cross-origin requests to use the | ||
<a>CORS protocol</a> to ensure that the resource's content is explicitly shared | ||
with the requestor. If that requirement were omitted, | ||
attackers could violate the <a | ||
href="http://www.w3.org/Security/wiki/Same_Origin_Policy">same-origin policy</a> | ||
and determine whether a cross-origin resource has certain content. | ||
|
@@ -553,9 +526,9 @@ spec: SHA2; urlPrefix: http://csrc.nist.gov/publications/fips/fips180-4/fips-180 | |
static resource. Consider a JSON response that looks like this: | ||
|
||
<div class="example"> | ||
<pre> | ||
<xmp highlight="json"> | ||
{'status': 'authenticated', 'username': 'admin'} | ||
</pre> | ||
</xmp> | ||
</div> | ||
|
||
An attacker could precompute hashes for the response with a variety of | ||
|