Skip to content

Commit ad09edc

Browse files
authored
Amend preload integrity check to better match implementations
Fixes #7736.
1 parent 3811489 commit ad09edc

File tree

1 file changed

+60
-8
lines changed

1 file changed

+60
-8
lines changed

source

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2642,6 +2642,13 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
26422642
<ul class="brief">
26432643
<li><dfn data-x-href="https://w3c.github.io/webappsec-mixed-content/#a-priori-authenticated-url"><i>a priori</i> authenticated URL</dfn></li>
26442644
</ul>
2645+
2646+
<p>The following terms are defined in <cite>Subresource Integrity</cite>: <ref spec=SRI></p>
2647+
2648+
<ul class="brief">
2649+
<li><dfn data-x-href="https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata">parse integrity metadata</dfn></li>
2650+
<li><dfn data-x-href="https://w3c.github.io/webappsec-subresource-integrity/#get-the-strongest-metadata">get the strongest metadata from set</dfn></li>
2651+
</ul>
26452652
</dd>
26462653

26472654
<dt>Paint Timing</dt>
@@ -14646,7 +14653,10 @@ data-x="rel-preload">preload</span>; <span data-x="attr-link-as">as</span>=font<
1464614653
<var>document</var> to <var>uncommittedPreloads</var>:</p>
1464714654

1464814655
<ol>
14649-
<li><p>Let <var>entry</var> be new <span>preload entry</span>.</p></li>
14656+
<li><p>Let <var>entry</var> be new <span>preload entry</span> whose
14657+
<span data-x="preload integrity metadata">integrity metadata</span> is
14658+
<var>earlyRequest</var>'s <span
14659+
data-x="concept-request-integrity-metadata">integrity metadata</span>.</p></li>
1465014660

1465114661
<li>
1465214662
<p>Let <var>respond</var> be the following steps given <span
@@ -26200,7 +26210,6 @@ document.body.appendChild(wbr);</code></pre>
2620026210
<dd>A <span>URL</span>
2620126211

2620226212
<dt><dfn data-x="preload destination">destination</dfn>
26203-
<dt><dfn data-x="preload integrity metadata">integrity metadata</dfn>
2620426213
<dd>A string
2620526214

2620626215
<dt><dfn data-x="preload mode">mode</dfn>
@@ -26216,6 +26225,9 @@ document.body.appendChild(wbr);</code></pre>
2621626225
item">items</span>:</p>
2621726226

2621826227
<dl>
26228+
<dt><dfn data-x="preload integrity metadata">integrity metadata</dfn>
26229+
<dd>A string
26230+
2621926231
<dt><dfn data-x="preload response">response</dfn>
2622026232
<dd>Null or a <span data-x="concept-response">response</span>
2622126233

@@ -26232,8 +26244,7 @@ document.body.appendChild(wbr);</code></pre>
2623226244
<ol>
2623326245
<li><p>Let <var>key</var> be a <span>preload key</span> whose <span data-x="preload
2623426246
URL">URL</span> is <var>url</var>, <span data-x="preload destination">destination</span> is
26235-
<var>destination</var>, <span data-x="preload integrity metadata">integrity metadata</span> is
26236-
<var>integrityMetadata</var>, <span data-x="preload mode">mode</span> is <var>mode</var>, and
26247+
<var>destination</var>, <span data-x="preload mode">mode</span> is <var>mode</var>, and
2623726248
<span data-x="preload credentials mode">credentials mode</span> is
2623826249
<var>credentialsMode</var>.</p></li>
2623926250

@@ -26246,6 +26257,47 @@ document.body.appendChild(wbr);</code></pre>
2624626257

2624726258
<li><p>Let <var>entry</var> be <var>preloads</var>[<var>key</var>].</p></li>
2624826259

26260+
<li><p>Let <var>consumerIntegrityMetadata</var> be the result of
26261+
<span data-x="parse integrity metadata">parsing</span> <var>integrityMetadata</var>.</p></li>
26262+
26263+
<li><p>Let <var>preloadIntegrityMetadata</var> be the result of
26264+
<span data-x="parse integrity metadata">parsing</span> <var>entry</var>'s
26265+
<span data-x="preload integrity metadata">integrity metadata</span>.</p></li>
26266+
26267+
<li>
26268+
<p>If none of the following condition apply:</p>
26269+
26270+
<ul>
26271+
<li><p><var>consumerIntegrityMetadata</var> is <code data-x="">no metadata</code>;</p></li>
26272+
26273+
<li>
26274+
<p><var>consumerIntegrityMetadata</var> is equal to <var>preloadIntegrityMetadata</var>;
26275+
or</p>
26276+
26277+
<p class="XXX">This comparison would ignore unknown integrity options. See <a
26278+
href="https://github.com/w3c/webappsec-subresource-integrity/issues/116">issue #116.</a></p>
26279+
</li>
26280+
26281+
<li><p>the user-agent has determined that <var>preloadIntegrityMetadata</var> is
26282+
<span data-x="get the strongest metadata from set">stronger</span> than
26283+
<var>consumerIntegrityMetadata</var> <ref spec=SRI></p></li>
26284+
</ul>
26285+
26286+
<p>then return false.</p>
26287+
26288+
<p class="note">A mistmatch in integrity metadata between the preload and the consumer, even if
26289+
both match the data, would lead to an additional fetch from the network.</p>
26290+
26291+
<p class="note">It is important that <span data-x="network error">network errors</span> are
26292+
added to the preload cache so that if a preload request results in an error, the erroneous
26293+
response isn't re-requested from the network later. This also has security implications;
26294+
consider the case where a developer specifies subresource integrity metadata on a preload
26295+
request, but not the following resource request. If the preload request fails subresource
26296+
integrity verification and is discarded, the resource request will fetch and consume a
26297+
potentially-malicious response from the network without verifying its integrity. <ref
26298+
spec=SRI></p>
26299+
</li>
26300+
2624926301
<li><p><span data-x="map remove">Remove</span> <var>preloads</var>[<var>key</var>].</p></li>
2625026302

2625126303
<li><p>If <var>entry</var> <span data-x="preload response">response</span> is null, then set
@@ -26341,9 +26393,7 @@ document.body.appendChild(wbr);</code></pre>
2634126393
<var>request</var>, return a new <span>preload key</span> whose <span data-x="preload
2634226394
URL">URL</span> is <var>request</var>'s <span data-x="concept-request-url">URL</span>, <span
2634326395
data-x="preload destination">destination</span> is <var>request</var>'s <span
26344-
data-x="concept-request-destination">destination</span>, <span data-x="preload integrity
26345-
metadata">integrity metadata</span> is <var>request</var>'s <span
26346-
data-x="concept-request-integrity-metadata">integrity metadata</span>, <span data-x="preload
26396+
data-x="concept-request-destination">destination</span>, <span data-x="preload
2634726397
mode">mode</span> is <var>request</var>'s <span data-x="concept-request-mode">mode</span>, and
2634826398
<span data-x="preload credentials mode">credentials mode</span> is <var>request</var>'s <span
2634926399
data-x="concept-request-credentials-mode">credentials mode</span>.</p>
@@ -26386,7 +26436,9 @@ document.body.appendChild(wbr);</code></pre>
2638626436
<li><p>Let <var>preloadKey</var> be the result of <span data-x="create a preload key">creating a
2638726437
preload key</span> given <var>request</var>.</p></li>
2638826438

26389-
<li><p>Let <var>preloadEntry</var> be a new <span>preload entry</span>.</p></li>
26439+
<li><p>Let <var>preloadEntry</var> be a new <span>preload entry</span> whose
26440+
<span data-x="preload integrity metadata">integrity metadata</span> is <var>request</var>'s <span
26441+
data-x="concept-request-integrity-metadata">integrity metadata</span>.</p></li>
2639026442

2639126443
<li><p><span data-x="map set">Set</span> <var>el</var>'s <span>node document</span>'s <span>map
2639226444
of preloaded resources</span>[<var>preloadKey</var>] to <var>preloadEntry</var>.</p></li>

0 commit comments

Comments
 (0)