1. 序論
◎非規範的~web上の~siteや~appが,単独の生成元のみからの資源で構成されることは稀である。 例えば,作者は、 多様な[ ~service/ ~CDN ( Content Delivery Network, “内容~送達~network” ) ]から,~scriptや~stylesheetを~pullする — 作者は、 送達された表現が[ 読込まれるものと自身が期待するものと,~~実際に~~相違ない ]ことを信用しなければナラナイ。 攻撃者が,敵対的~serverからの内容を~downloadするよう 利用者を騙せる場合(~DNS `RFC1035$r 汚染, その他の手段を介して)、 作者にできる手立てはない。 同様に、 ~CDN~server上の~fileを置換できる攻撃者は,任意な内容を注入できる能を有する。 ◎ Sites and applications on the web are rarely composed of resources from only a single origin. For example, authors pull scripts and styles from a wide variety of services and content delivery networks, and must trust that the delivered representation is, in fact, what they expected to load. If an attacker can trick a user into downloading content from a hostile server (via DNS [RFC1035] poisoning, or other such means), the author has no recourse. Likewise, an attacker who can replace the file on the Content Delivery Network (CDN) server has the ability to inject arbitrary content.
この~riskの一部は、 資源を~secure~channel — ~TLS `TLS$r, ~HSTS `RFC6797$r, `pinned public keys^en `RFC7469$r — 越しに送達することで軽減される。 ~UAは、 自身が通話相手と信じる~serverが~~本物であることについて,相応の~~確証を得られるので。 しかしながら,これらの仕組みが認証するのは、 `内容ではなく^em,`~serverに限られる^em。 ~serverへの~accessを有する攻撃者(あるいは管理者)は、 咎め無く内容を操作できる。 理想は、 作者が~serverの~keyを~pin†できるのみならず,`内容^emについても資源~表現の~~同一性が確保されるよう~pinして,`そのような表現に限って^em読込んで実行できるようにすることである。 ◎ Delivering resources over a secure channel mitigates some of this risk: with TLS [TLS], HSTS [RFC6797], and pinned public keys [RFC7469], a user agent can be fairly certain that it is indeed speaking with the server it believes it’s talking to. These mechanisms, however, authenticate only the server, not the content. An attacker (or administrator) with access to the server can manipulate content with impunity. Ideally, authors would not only be able to pin the keys of a server, but also pin the content, ensuring that an exact representation of a resource, and only that representation, loads and executes.
【† “~keyを~pinする” — 相手( ~server )の身元を随時確認できるよう,その証明情報の “真正な写し” ( ~key )を手元( ~UA側)に “ピン留め” しておく。 (したがって、 最初に “写し” を得る段階で,その真正性が確保される必要がある。) 】
この文書は、 そのような検証の枠組みを指定する。 また、 2 個の~HTML要素 — `script$e, `link$e — を `integrity$a 属性で拡張する。 この属性は、 作者が読込むものと期待する資源の表現に対する,暗号用~hashを包含する。 一例として、 作者は[ ある~frameworkを,自前の生成元では~hostせずに 共用~serverから読込みたい ]と望んでいるとする。 `https://example.com/example-framework.js^s に`期待される^em `SHA-384$hS ~hashとして`~digest$ `Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7^s を指定することは、 ~UAが、 その~URLから読込む~dataが包含している~JSを実行する前に,~dataが期待されている~hashに合致するかどうか検証yできることを意味する。 この完全性~検証yは、 攻撃者により資源が悪意的な内容で代用される~riskを,有意に抑制する。 ◎ This document specifies such a validation scheme, extending two HTML elements with an integrity attribute that contains a cryptographic hash of the representation of the resource the author expects to load. For instance, an author may wish to load some framework from a shared server rather than hosting it on their own origin. Specifying that the expected SHA-384 hash of https://example.com/example-framework.js is Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7 means that the user agent can verify that the data it loads from that URL matches that expected hash before executing the JavaScript it contains. This integrity verification significantly reduces the risk that an attacker can substitute malicious content.
例えば `script^e 要素に次の様に~hashを追加すれば、 ~UAへ向けて ~hashを通信できる: ◎ This example can be communicated to a user agent by adding the hash to a script element, like so:
<script src="https://example.com/example-framework.js" integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7" crossorigin="anonymous"></script>
無論、 ~scriptだけが 完全性~検証からの便益を得られる応答~種別ではない。 ここで指定される枠組みは、 `link^e にも適用され、 また,この仕様の将来の~versionでは、 対象範囲を拡げる見込みが高い。 ◎ 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.
1.1. 目標
- 第三者-主体~serviceが弱体化されても,自動的に その~scriptを含む~siteまで ことごとく弱体化されるべきでない。 内容~作者が、 自身が読込む内容に対する期待を指定できる仕組みを与える — 例えば、 当の~URLにたまたま あてがわれた `~~任意の^em ~scriptではなく,`特定の^em ~scriptに限って読込めるような。 ◎ Compromise of a third-party service should not automatically mean compromise of every site which includes its scripts. Content authors will have a mechanism by which they can specify expectations for content they load, meaning for example that they could load a specific script, and not any script that happens to have a particular URL.
- 検証yの仕組みは、 受信された応答が妥当でないときは,それを作者に伝えるような、 ~errorを報告する機能性を備えるべきである。 ◎ The verification mechanism should have error-reporting functionality which would inform the author that an invalid response was received.
1.2. 利用事例と例
1.2.1. 資源の完全性
-
作者は、 全世界の利用者のために処理能を改善するため,~CDNを利用したいと望んでいるとする。 しかしながら、[ ~CDNの~serverが,作者が`期待する~codeのみ^emを送達する ]ことを確保することも重要である。 ~CDNが弱体化されて(あるいは期待されない悪意的な挙動により),~siteが不幸な~~形に変えられてしまう~riskを軽減するためには、 ~pageに含まれる `link$e 要素に,次の`完全性~metadata$を追加する: ◎ An author wishes to use a content delivery network to improve performance for globally-distributed users. It is important, however, to ensure that the CDN’s servers deliver only the code the author expects them to deliver. To mitigate the risk that a CDN compromise (or unexpectedly malicious behavior) would change that site in unfortunate ways, the following integrity metadata is added to the link element included on the page:
<link rel="stylesheet" href="https://site53.example.net/style.css" integrity="sha384-`…( ~digest )…$V" crossorigin="anonymous" >
-
作者は、 第三者-主体が解析~service用に供した~JSを~pageに含めるよう求めているとする。 注意深く考査された~codeのみ 実行されることを確保するためには、 ~scriptに対する`完全性~metadata$を生成して,それを `script$e 要素に追加する: ◎ An author wants to include JavaScript provided by a third-party analytics service. To ensure that only the code that has been carefully reviewed is executed, the author generates integrity metadata for the script, and adds it to the script element:
<script src="https://analytics-r-us.example.com/v1.0/include.js" integrity="sha384-`…( ~digest )…$V" crossorigin="anonymous" ></script>
- ~UAは、 高特権な~HTML文脈(例えば, ~browserの新たな~UItab~page)内で走っている~JS~codeが,表示される前に操作されないことを確保したいと望む。 `完全性~metadata$は、 改ざんされた~JSが そのような高特権な文脈~下で走る~riskを軽減する。 ◎ A user agent wishes to ensure that JavaScript code running in high-privilege HTML contexts (for example, a browser’s New Tab page) aren’t manipulated before display. Integrity metadata mitigates the risk that altered JavaScript will run in these pages' high-privilege contexts.
2. ~~主要な概念と各種用語
この節では、 文書~全体を通して利用されるいくつかの用語を定義する。 ◎ This section defines several terms used throughout the document.
用語 `~digest@ は、 任意な~data~blockに暗号用~hash関数を適用した結果を~base64に符号化した結果を指す。 ◎ The term digest refers to the base64 encoded result of executing a cryptographic hash function on an arbitrary block of data.
用語[ 生成元, 同一-生成元 ]は、 `HTML$r にて定義される。 ◎ The terms origin and same origin are defined in HTML. [HTML]
`~base64符号化法@ は、 `RFC4648$r `§ 4@~RFCx/rfc4648#section-4$ にて定義される。 ◎ A base64 encoding is defined in Section 4 of RFC 4648. [RFC4648]
`SHA-256^hS, `SHA-384^hS, `SHA-512^hS は、 暗号用~hash関数 `SHA-2@hS の一部を成し、 `SHA2$r にて定義される。 ◎ The SHA-256, SHA-384, and SHA-512 are part of the SHA-2 set of cryptographic hash functions defined by the NIST. [SHA2]
2.1. 文法~上の概念
【 この節の内容は、 関連な節に直に記すことにする。 】 ◎ The Augmented Backus-Naur Form (ABNF) notation used in this document is specified in RFC5234. [ABNF] ◎ Appendix B.1 of [ABNF] defines VCHAR (printing characters). ◎ WSP (white space) characters are defined in Section 2.4.1 Common parser idioms of the HTML 5 specification as White_Space characters. [HTML5]
3. ~framework
ここで指定する 完全性~検証yの仕組みは、 次の処理-を煮詰める:
- 資源から ~~十分に強い暗号用~digestを生成する。
- 生成した~digestを,応答を検証yするために利用できるよう,~UAへ伝送する。
3.1. 完全性~metadata
応答の完全性を検証yするため、 ~UAは, `要請の一部@~FETCH#concept-request-integrity-metadata$として `完全性~metadata@ を要求する。 この~metadataは、 次に挙げる情報~片からなる: ◎ To verify the integrity of a response, a user agent requires integrity metadata as part of the request. This metadata consists of the following pieces of information:
- `~algo@iM ⇒ ある暗号用~hash関数【を識別する名前】 ◎ cryptographic hash function ("alg")
- `値@iM ⇒ ある`~digest$ ◎ digest ("val")
- `~option群@iM ◎ options ("opt")
これらのうち,`~algo$iMと`値$iM は、 供されなければナラナイ — 応答の完全性を検証するためには必須なので。 ◎ The hash function and digest MUST be provided in order to validate a response’s integrity.
注記: 現時点では,定義された~optionはないが、 この仕様は,将来の~versionにて~optionを定義し得る — ~MIME型 `MIME-TYPES$r など。 ◎ Note: At the moment, no options are defined. However, future versions of the spec may define options, such as MIME types [MIME-TYPES].
この~metadataは、 ~CSP `§ ~source~list$の `hash-source$P と同じ形式に符号化されなければナラナイ(ただし、 一重引用符は含めない)。 ◎ This metadata MUST be encoded in the same format as the hash-source (without the single quotes) in section 4.2 of the Content Security Policy Level 2 specification.
例えば、 ~script資源の内容が文字列 `alert(\'Hello, world.\');^l で,作者が~hash関数として `SHA-384$hS を選んだなら、 ~base64に符号化された結果の~digestは、 `H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO^s になる。 これは、 次のように符号化できる: ◎ For example, given a script resource containing only the string alert('Hello, world.');, an author might choose SHA-384 as a hash function. H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO is the base64 encoded digest that results. This can be encoded as follows:
sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO
注記: ~digestを生成するために利用できる~utilityは、 いくつもある。 例えば `OpenSSL@https://www.openssl.org/$ は、 ごく共通に可用である。 この節の例は、 次の~command-lineによる結果である: ◎ Digests may be generated using any number of utilities. OpenSSL, for example, is quite commonly available. The example in this section is the result of the following command line:
echo -n "alert('Hello, world.');" | \ openssl dgst -sha384 -binary | \ openssl base64 -A
3.2. 暗号用~hash関数
適合t~UAは、 要請の`完全性~metadata$の一部として利用する暗号用~hash関数として[ `SHA-256$hS, `SHA-384$hS, `SHA-512$hS ]を~supportするモノトスル。 また、 追加的な~hash関数も~supportしてヨイ。 ◎ Conformant user agents MUST support the SHA-256, SHA-384, and SHA-512 cryptographic hash functions for use as part of a request’s integrity metadata and MAY support additional hash functions.
~UAは、 自身が~supportする~hashing関数を,次に従って制約するベキである (`§ ~hash衝突~攻撃@#hash-collision-attacks$を見よ):
- `MD5^hS や `SHA-1^hS の様な弱いことが既知なものは~supportしない。
- 衝突耐性があることが既知なものに限る。
- ~supportしている~hashing関数を定期的に評価し直して、 ~secureでなくなったものは非推奨にする。
3.2.1. 即応性
将来,暗号上の発見に直面したときに 機敏に対応できるよう、 同じ資源に複数個の[ `完全性~metadata$の集合 ]を結付けてもよい†。 ◎ Multiple sets of integrity metadata may be associated with a single resource in order to provide agility in the face of future cryptographic discoveries. For example, the resource described in the previous section may be described by either of the following hash expressions:
作者は、 同じ資源に対し,例えば `SHA-384$hS, `SHA-512$hS ~hashの 2 つを指定してよい: ◎ sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO ◎ sha512-Q2bFTOhEALkN8hOms2FKTDLy7eugP2zFZ1T8LCvX42Fp3WoNr3bjZSAHeOsHrbV1Fu9/A0EzCinRE7Af1ofPrw== ◎ Authors may choose to specify both, for example:
<script src="hello_world.js" integrity="sha384-`…( ~digest )…$V sha512-`…( ~digest )…$V" crossorigin="anonymous"></script>
【† 複数個の集合( `multiple sets of^en 〜 ): 各~hash関数に対しても,複数個の~hash値を与え得る — `後述の例@#_multi-hash$のように。 】
この事例では、 ~UAは,応答を検証するときに~list内の最も強い~hash関数を選んで, その~metadataを利用することになる(後述の[ `~metadata~listを構文解析する$ / `最も強い~metadataを取得する$ ]~algoに則って)。 ◎ In this case, the user agent will choose the strongest hash function in the list, and use that metadata to validate the response (as described below in the § 3.3.2 Parse metadata and § 3.3.3 Get the strongest metadata from set algorithms).
~secureでないと決定された~hash関数に対しては、 ~UAは,それを非推奨にした上で、 最終的には,~secureでないな~hash関数を利用している完全性~検証の~supportを除去するベキである。 ~UAは、 応答の妥当性を検査する際に,非推奨にされた関数に基づく~digestを利用してもヨイ。 ◎ When a hash function is determined to be insecure, user agents SHOULD deprecate and eventually remove support for integrity validation using the insecure hash function. User agents MAY check the validity of responses using a digest based on a deprecated function.
作者が,古い~UAに縛られることなく より強い~hash関数に切替えれるよう、 ~UAは,自身が~supportしない~hash関数を利用している検証に対しては,その完全性~値は供されなかったかの様に動作することになる(後述の,`~byte列は~metadata~listに合致するか?$を見よ)。 作者には、 強い~hash関数を利用することに加え,より強い~hash関数が可用になり次第 それへ移行することが奨励される。 ◎ To allow authors to switch to stronger hash functions without being held back by older user agents, validation using unsupported hash functions acts like no integrity value was provided (see the § 3.3.4 Do bytes match metadataList? algorithm below). Authors are encouraged to use strong hash functions, and to begin migrating to stronger hash functions as they become available.
3.2.2. 優先度
~UAは、 `より優先される~hash関数を取得する@ ~algo( `getPrioritizedHashFunction^en )を供するモノトスル。 それは、 所与の 2 つの~hash関数 ( %A, %B ) に対し,より優先される方 — ~UAがより衝突耐性があると見なす方 — を返す — ただし、 優先度が等しい場合は ε 【!空~文字列】を返す。 例えば、[ `より優先される~hash関数を取得する$(`sha256^l, `sha512^l) は `sha512^l / `より優先される~hash関数を取得する$(`sha256^l, `sha256^l) は空~文字列 ]を返すことになる。 ◎ User agents must provide a mechanism for determining the relative priority of two hash functions and return the empty string if the priority is equal. That is, if a user agent implemented a function like getPrioritizedHashFunction(a, b) it would return the hash function the user agent considers the most collision-resistant. For example, getPrioritizedHashFunction('sha256', 'sha512') would return 'sha512' and getPrioritizedHashFunction('sha256', 'sha256') would return the empty string.
注記: この~algoは、 もっぱら,この文書にて~algoの記述を単純~化するために利用される。 ◎ Note: The getPrioritizedHashFunction is an internal implementation detail. It is not an API that implementors provide to web applications. It is used in this document only to simplify the algorithm description.
【 この~algoを[ 3 個~以上の~hash関数の優先度が循環する様な結論を導く ]ように定義することも明示的には禁止されてはいないが、 許容されないであろう(この仕様の他の~algoは、 そうであっても~~問題なく働いてしまうが)。 】
3.3. 応答【の本体~data】を検証yする~algo
3.3.1. ~byte列に~algoを適用する
所与の ( `~byte列$ %~byte列, ~algo %~algo ) に対し:
- %結果 ~LET %~byte列 に %~algo を適用した結果 ◎ Let result be the result of applying algorithm to bytes.
- ~RET %結果 に`~base64符号化法$を適用した結果 ◎ Return the result of base64 encoding result.
3.3.2. ~metadataを構文解析する
この~algoは、 所与の ( 文字列 %~metadata文字列 ) に対し,一連の[ ~UAが解する~hash関数を伴う~hash式【`完全性~metadata$】 ]を返す: ◎ This algorithm accepts a string, and returns a set of hash expressions whose hash functions are understood by the user agent.
- %結果 ~LET 空~集合 【ではなく`~list$ — 以下に利用される %結果 に付加する演算は,`~list$用なので。】 ◎ Let result be the empty set.
- %~token~list ~LET `区切子で厳密に分割する$( %~metadata文字列, `0020^U `SPACE^cn ) ◎ ↓
-
%~token~list を成す ~EACH( %~token ) に対し: ◎ For each item returned by splitting metadata on spaces:
- %~option群を伴う~hash ~LET `区切子で厳密に分割する$( %~item, `003F^U `?^smb ) ◎ Let hash-with-opt-token-list be the result of splitting item on U+003F (?).
- %~hash式 ~LET %~option群を伴う~hash[ 0 ] ◎ Let hash-expression be hash-with-opt-token-list[0].
- %~base64値 ~LET 空~文字列 ◎ Let base64-value be the empty string.
- %~hash式~token~list ~LET `区切子で厳密に分割する$( %~hash式, `002D^U `-^smb ) ◎ Let hash-expr-token-list be the result of splitting hash-expression on U+002D (-).
- %~algo ~LET %~hash式~token~list[ 0 ] ◎ Let algorithm be hash-expr-token-list[0].
- ~IF[ %~hash式~token~list の`~size$ ~GTE 2 ] ⇒ %~base64値 ~SET %~hash式~token~list[ 1 ] ◎ If hash-expr-token-list[1] exists, set base64-value to hash-expr-token-list[1].
- ~IF[ %~algo は~UAが認識する~hash関数でない ] ⇒ ~CONTINUE ◎ If algorithm is not a hash function recognized by the user agent, continue.
-
%~metadata ~LET 新たな`完全性~metadata$ — その ⇒# `~algo$iM ~SET %~algo, `値$iM ~SET %~base64値 ◎ Let metadata be the ordered map «["alg" → algorithm, "val" → base64-value]».
注記: 定義された~optionは無いので (`§ 完全性~metadata@#integrity-metadata-description$を見よ)、 %~metadata の`~option群$iMは設定されない。 将来の~versionにおいて,~optionが定義されたなら、 %~option群を伴う~hash[ 1 ] が`~option群$iMとして用立てられ得る。 ◎ Note: Since no options are defined (see the § 3.1 Integrity metadata), 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.
- %結果 に %~metadata を`付加する$ ◎ Append metadata to result.
- ~RET %結果 ◎ Return result.
3.3.3. 集合から最も強い~metadataを取得する
所与の ( %集合 ) に対し:
- %結果 ~LET 空~集合 ◎ ↓
- %最強~algo ~LET ~NULL ◎ Let result be the empty set and strongest be the empty string.
-
%集合 を成す ~EACH( %~item ) に対し:
- %新たな~algo ~LET %~item の`~algo$iM
- %~algo ~SET %最強~algo に応じて ⇒# ~NULL ならば %新たな~algo / ~ELSE_ `より優先される~hash関数を取得する$( %最強~algo, %新たな~algo )
-
~IF[ %~algo ~NEQ %最強~algo ]:
- ~IF[ %~algo ~EQ %新たな~algo ] ⇒# %結果 を空にする; %最強~algo ~SET %新たな~algo
- %結果 に %~item を追加する
- ~RET %結果 ◎ Return result.
3.3.4. ~byte列は~metadata~listに合致するか?
所与の ( `~byte列$ %~byte列, 文字列 %~metadata~list ) に対し:
- %構文解析した~metadata ~LET `~metadata~listを構文解析する$( %~metadata~list ) ◎ Let parsedMetadata be the result of parsing metadataList.
- ~IF[ %構文解析した~metadata は`空$である ] ⇒ ~RET ~T ◎ If parsedMetadata is empty set, return true.
- %~metadata ~LET `最も強い~metadataを取得する$( %構文解析した~metadata ) ◎ Let metadata be the result of getting the strongest metadata from parsedMetadata.
-
%~metadata を成す ~EACH( %~item ) に対し: ◎ For each item in metadata:
- %~algo ~LET %~item の`~algo$iM ◎ Let algorithm be the item["alg"].
- %期待される値 ~LET %~item の`値$iM ◎ Let expectedValue be the item["val"].
- %実際の値 ~LET `~byte列に~algoを適用する$( %~byte列, %~algo ) ◎ Let actualValue be the result of applying algorithm to bytes .
- ~IF[ %実際の値 ~EQ %期待される値 ] ⇒ ~RET ~T ◎ If actualValue is a case-sensitive match for expectedValue, return true.
- ~RET ~F ◎ Return false.
この~algoは、 複数個の[ 妥当かつ強い~hash関数 ]を受容することを~UAに許容する。 ◎ This algorithm allows the user agent to accept multiple, valid strong hash functions.\
例えば,開発者は、 `script$e 要素を次のようにも記せる: ◎ For example, a developer might write a script element such as:
<script src="https://example.com/example-framework.js" integrity="sha384-`…( ~digest )…$V sha384-`…( ~digest )…$V" crossorigin="anonymous"></script>
これは、 2 つの異なる内容~payload — 1 個目, 2 個目どちらかの `SHA-384$hS ~hash値に合致するもの — を~UAに受容させる。 ◎ which would allow the user agent to accept two different content payloads, one of which matches the first SHA-384 hash value and the other matches the second SHA-384 hash value.
注記: ~UAは、 この~algoの結果を改変することを利用者に許容してよい — [ 利用者-選好, ~bookmarklet, 第三者-主体による~UAに対する追加, その他の同類の仕組み ]を介して。 例えば、 `HTTPS Everywhere@https://www.eff.org/https-everywhere$en の様な拡張により生成される~redirectは、 資源の[ ~HTTPS, ~HTTP ]~versionが相違する場合でも,正しく読込んで実行する。 ◎ Note: User agents may allow users to modify the result of this algorithm via user preferences, bookmarklets, third-party additions to the user agent, and other such mechanisms. For example, redirects generated by an extension like HTTPS Everywhere could load and execute correctly, even if the HTTPS version of a resource differs from the HTTP version.
注記: 下位資源の完全性には、 ~CORSが要求される — ~CORSを伴わずにそれを利用しようとする試みるのは、 論理的な誤りである。 それが生じた場合、 ~UAには[ 開発者~consoleに,この失敗を説明する警告~messageを報告すること ]が奨励される。 `Fetch$r ◎ Note: Subresource Integrity requires CORS and it is a logical error to attempt to use it without CORS. User agents are encouraged to report a warning message to the developer console to explain this failure. [Fetch]
3.4. ~HTML文書の下位資源に対する検証y
種々の~HTML要素が,[ 文書の中へ埋込まれる/文書の文脈において実行される ]ことになる資源を要請する。 その種の要素に対し,完全性~metadataを~supportする一環として、[ `link$e / `script$e ]要素には,新たな内容~属性 `integrity$a が追加される。 `HTML$r ◎ A variety of HTML elements result in requests for resources that are to be embedded into the document, or executed in its context. To support integrity metadata for some of these elements, a new integrity attribute is added to the list of content attributes for the link and script elements. [HTML]
注記: この仕様の将来の改訂版は、 アリなすべての下位資源 — すなわち,次に挙げる要素 — に対しても,完全性の~supportを含める見込みが高い ⇒ `a^e, `audio^e, `embed^e, `iframe^e, `img^e, `link^e, `object^e, `script^e, `source^e, `track^e, `video^e ◎ Note: A future revision of this specification is likely to include integrity support for all possible subresources, i.e., a, audio, embed, iframe, img, link, object, script, source, track, and video elements.
3.5. `integrity^a 属性
`integrity^a 属性は、 要素に対する`完全性~metadata$を表現する。 この属性の値は、 空~文字列か, または 少なくとも 1 個以上の,次の~ABNF `ABNF$r 文法に則って妥当な~metadataを含んでなければナラナイ ◎ The integrity attribute represents integrity metadata for an element. The value of the attribute MUST be either the empty string, or at least one valid metadata as described by the following ABNF grammar:
`integrity-metadata@P = *`WSP$P `hash-with-options$P *( 1*`WSP$P `hash-with-options$P ) *`WSP$P / *`WSP$P `hash-with-options@P = `hash-expression$P *("?" `option-expression$P) `option-expression@P = *`VCHAR$P `hash-algo@P = <~CSP `§ ~source~list$の `hash-algorithm^P 生成規則> `base64-value@P = <~CSP `§ ~source~list$の `base64-value^P 生成規則> `hash-expression@P = `hash-algo$P "-" `base64-value$P
`option-expression$P は、 各 `hash-expression$P ごとに結付けられ,当の `hash-expression^P に限り適用される。 ◎ option-expressions are associated on a per hash-expression basis and are applied only to the hash-expression that immediately precedes it.
~UAは、 将来の~optionと全部的に前方-互換であり続けるようにするため,自身が認識しない `option-expression$P を無視するモノトスル。 ◎ In order for user agents to remain fully forwards compatible with future options, the user agent MUST ignore all unrecognized option-expressions.
注記: 構文~内では `option-expression$P が予約されているが、 定義された~optionはまだないことに注意。 この仕様の将来の~versionでは,~optionに対しより特定な構文を定義することになる見込みが高いので、 アリな限り広く定義されている。 ◎ Note: Note that while the option-expression has been reserved in the syntax, no options have been defined. It is likely that a future version of the spec will define a more specific syntax for options, so it is defined here as broadly as possible.
3.6. 完全性~違反の取扱い
~UAは、 完全性~検査に失敗した応答を[ 具現化する/実行する ]のを拒否して,代わりに `Fetch$r にて定義される~network~errorを返すことになる。 ◎ The user agent will refuse to render or execute responses that fail an integrity check, instead returning a network error as defined in Fetch [Fetch].
注記: 完全性~検査の失敗-時には、 `error^et ~eventが発火される。 開発者は、 正準的~fallback資源(例: ~CDNから~serveされていない, 二次的な,信用されてはいるが より低速な~sourceからの資源など)を供したいと望むなら、[ この `error^et ~eventをとらえて,失敗した当の資源を異なるものに置換する ]ような適切な~handlerを供せる。 ◎ Note: On a failed integrity check, an error event is fired. Developers wishing to provide a canonical fallback resource (e.g., a resource not served from a CDN, perhaps from a secondary, trusted, but slower source) can catch this error event and provide an appropriate handler to replace the failed resource with a different one.
4. ~proxy
応答を改変するような~proxyその他の媒介~serverを最適化するときは、 当の応答に結付けられた~digestが新たな内容にも同期cし続けることを確保しなければナラナイ。 選択肢としては、 次が挙げられる:
- 資源に結付けられた`完全性~metadata$が更新されることを確保する。
- 単純に,~page作者が完全性の検証yを要請した際には,当の資源の正準的~versionのみを送達する。
媒介~serverに伝わり易くするため、 資源を~serveしている~serverは,自身が送信する資源に,値 `no-transform$dir を伴う `Cache-Control$h ~headerを伴わせるベキである。 ◎ To help inform intermediate servers, those serving the resources SHOULD send along with the resource a Cache-Control header with a value of no-transform.
5. ~securityと~privacyの考慮点
◎非規範的5.1. ~secureでない文脈は~secureでないであり続ける
[ `~secureな文脈$enVでない文脈 — ~HTTP【~HTTPSでない】~pageなど — により送達される`完全性~metadata$ ]が保護する生成元は,[ 外部~資源を~hostしている~serverの弱体化に抗する ]ことに限られる。 ~network攻撃者は、 ~hashの検証-対象である応答を,その経路上で改ざんできるのと同じく,~~元の~digestも改ざんできる(あるいは,それを除去するなど,文書に対し何でもできる)。 したがって,作者は、 完全性~metadataを`~secureな文脈$enV下にある場合に限り送達するベキである。 `~webの~secure化法@http://www.w3.org/2001/tag/doc/web-https$も見よ。 ◎ Integrity metadata delivered by a context that is not a Secure Context such as an HTTP page, only protects an origin against a compromise of the server where an external resources is hosted. Network attackers can alter the digest in-flight (or remove it entirely, or do absolutely anything else to the document), just as they could alter the response the hash is meant to validate. Thus, it is recommended that authors deliver integrity metadata only to a Secure Context. See also Securing the Web.
5.2. ~hash衝突~攻撃
~digestの強さは、 それを生成する~hash関数に基づく。 ~UAには、[ 弱いことが既知である~hashing関数に対する~supportは拒否すること ], および[ ~supportする~algoを,衝突耐性があることが既知であるものに制限すること ]が推奨される。 推奨されない~hashing関数の例としては、 `MD5^hS や `SHA-1^hS が挙げられる。 これを書いている時点では、 `SHA-384$hS は 良好な~~基準である。 ◎ Digests are only as strong as the hash function used to generate them. It is recommended that user agents refuse to support known-weak hashing functions and limit supported algorithms to those known to be collision resistant. Examples of hashing functions that are not recommended include MD5 and SHA-1. At the time of writing, SHA-384 is a good baseline.
更には、 ~UAには,[ 定期的に,自身が~supportしている~hash関数を評価し直すこと ], および[ ~secureでないと~~判明した関数に対しては,~supportを非推奨にすること ]が推奨される。 ~hash関数は,時を経て[ 期待されるより ずっと弱い, あるいは 一部の事例では壊れている ]ものと~~判明することがあるので、 ~UAは,開発にあたって そのことを自覚し続けることが重要である。 ◎ Moreover, it is recommended that user agents re-evaluate their supported hash functions on a regular basis and deprecate support for those functions shown to be insecure. Over time, hash functions may be shown to be much weaker than expected and, in some cases, broken, so it is important that user agents stay aware of these developments.
5.3. 非同一-生成元~data漏洩e
この仕様は、[ 完全性の保護-対象である非同一-生成元~要請 ]に`~CORS設定群~属性$が在ることを要求する。 この要件が無ければ、 攻撃者は `同一-生成元~施策@http://www.w3.org/Security/wiki/Same_Origin_Policy$に違反することもでき、 非同一-生成元~資源が,ある種の内容を持つかどうか決定できてしまう: ◎ This specification requires the CORS settings attribute to be present on integrity-protected cross-origin requests. If that requirement were omitted, attackers could violate the same-origin policy and determine whether a cross-origin resource has certain content.
- 攻撃者は、 既知な~digestで資源の読込nを試みながら,その失敗を注視する。 読込nに失敗したなら、 応答はその~hashに合致しないものと推定でき、 それにより その内容についての洞察を得られる。 これは例えば、 利用者が特定0の~serviceに~log-inしたかどうかを露呈するかもしれない。 ◎ Attackers would attempt to load the resource with a known digest, and watch for load failures. If the load fails, the attacker could surmise that the response didn’t match the hash and thereby gain some insight into its contents. This might reveal, for example, whether or not a user is logged into a particular service.
-
更には,攻撃者は、 静的な資源~内の特定の値を総当たりできる。 ◎ Moreover, attackers could brute-force specific values in an otherwise static resource.\
次の様な~JSON応答を考える: ◎ Consider a JSON response that looks like this:
{'status': 'authenticated', 'username': 'admin'}
攻撃者は、 様々な共通的な~username( `username^c )から,応答に対する~hashを予め算出しておいて、 それらの~hashを順々に指定しながら繰返し文書の読込nを試みれる。 読込nに成功したなら、 ~usernameを正しく推測できたことが確認されたことになる。 ◎ An attacker could precompute hashes for the response with a variety of common usernames, and specify those hashes while repeatedly attempting to load the document. A successful load would confirm that the attacker has correctly guessed the username.
謝辞
この仕様のかなりの部分は、 `Gervase Markham^en 氏による `Link Fingerprints@http://www.gerv.net/security/link-fingerprints/$en の概念, および WHATWG による `Link Hashes@https://wiki.whatwg.org/wiki/Link_Hashes$en から着想を得ている。 ◎ Much of the content here is inspired heavily by Gervase Markham’s Link Fingerprints concept as well as WHATWG’s Link Hashes.
この仕様の初期~versionに貴重な貢献された `Mike West^en 氏に特別な謝意を。 貴重な~feedbackを寄せられた次の方々にも: ◎ A special thanks to Mike West for his invaluable contributions to the initial version of this spec.\