混合コンテンツ

W3C 候補勧告ドラフト,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2023/CRD-mixed-content-20230223/
最新公開バージョン:
https://www.w3.org/TR/mixed-content/
編集者ドラフト:
https://w3c.github.io/webappsec-mixed-content/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/mixed-content
フィードバック:
public-webappsec@w3.org 件名 “[mixed-content] … メッセージトピック …” で (アーカイブ)
GitHub:
課題を登録 (未解決の課題)
実装レポート:
https://wpt.fyi/results/mixed-content
編集者:
(Google Inc.)
(Google Inc.)
(Google Inc.)
参加方法:
課題を登録 (未解決の課題)

概要

本仕様は、ユーザーエージェントが暗号化・認証されたドキュメントのコンテキストにおいて、暗号化されていないまたは認証されていない接続を介した コンテンツの取得をどのように処理すべきかについて説明します。

この文書のステータス

このセクションは、本書が公開された時点での文書のステータスを説明しています。現在のW3C出版物およびこの技術報告書の最新版は、W3C技術報告書インデックス(https://www.w3.org/TR/)に掲載されています。

この文書は、Webアプリケーションセキュリティワーキンググループによって、勧告トラックを使用して、候補勧告ドラフトとして公開されました。本書はW3C勧告となることを意図しています。

(アーカイブ) 公開メーリングリスト public-webappsec@w3.org案内参照) は本仕様について議論する際に推奨されます。 メール送信時には、 件名に「mixed-content」と記載してください。 できれば次のようにしてください: 「[mixed-content] …コメント概要…

候補勧告としての公開は、W3Cおよびそのメンバーによる承認を意味するものではありません。候補勧告ドラフトは、 前回の候補勧告からワーキンググループが次の候補勧告スナップショットに含める予定の変更点を統合したものです。本書はドラフト文書であり、 今後更新、置換、または他の文書によって廃止される場合があります。本書を進行中の作業以外として引用することは不適切です。

本書が提案勧告段階に進むための条件は、 この仕様のすべての機能を実装した最低2つの独立かつ相互運用可能なユーザーエージェントが存在することであり、 これはワーキンググループが作成したテストスイートのユーザーエージェントテストに合格することで判断されます。ワーキンググループは進捗を追跡するための実装報告書を準備します。

本書はW3C特許ポリシーの下で活動するグループによって作成されました。 W3Cは、グループの成果物に関連してなされた特許公開の公開リストを管理しています; そのページには特許公開の案内も含まれています。 個人が当該特許に関する実際の知識を持ち、その特許が必須クレームを含むと信じる場合には、 W3C特許ポリシー第6節に従って情報を公開しなければなりません。

本書は、2021年11月2日付W3Cプロセス文書によって管理されています。

1. はじめに

このセクションは規範的ではありません。

ユーザーがexample.comのウェブページを安全なチャネル(例えばHTTPS)経由で正常に読み込むとき、ユーザーエージェントとexample.comの間の通信データが第三者に盗聴または改ざんされていないことが保証されます。しかし、この保証はウェブページがスクリプトや画像などのサブリソースを安全でない接続で読み込んだ場合に弱まります。たとえば、安全でない方法で読み込まれたスクリプトは、攻撃者がユーザーの代わりにデータを読み取ったり変更したりすることを許す可能性があります。安全でない方法で読み込まれた画像は、攻撃者がユーザーに誤った情報(例:捏造された株価チャート)を伝えたり、クライアント側の状態を変更したり(例:クッキーの設定)、意図しない行動を誘発したり(例:ボタンのラベル変更)することができます。これらのリクエストは「混在コンテンツ」と呼ばれます。

本仕様は、ユーザーエージェントがこれらのリスクを軽減するために、特定のタイプの混在コンテンツをブロックし、一部のコンテキストでより厳格に動作する方法を詳述します。

ただし、以前のバージョンの本仕様はユーザーのデータの機密性および完全性を十分に保護していませんでした。画像・音声・動画などの安全でないコンテンツは、現行では安全なコンテキストでもデフォルトで読み込むことができます。安全なページは、ユーザーエージェントのサンドボックスを完全に回避する安全でないダウンロードさえ開始することができます。

さらに、混在コンテンツが読み込まれた場合、ユーザーには明確なセキュリティ指標が表示されません。ウェブページが混在コンテンツを読み込むと、ブラウザは「中間的な」セキュリティ指標(例:南京錠アイコンの削除)を表示しますが、ユーザーがそのページを信頼すべきかどうか明確には示しません。このUXは、開発者が混在コンテンツを回避する十分な動機付けにもなっていません。なぜなら、現状でも多くのウェブページが混在コンテンツを読み込んでいるからです。すべての混在コンテンツをブロックすれば、ユーザーにとっても「ウェブページが安全な通信で読み込まれているかどうか」という単純な理解モデルとなり、開発者も必要なコンテンツを安全に読み込むよう促されます。

そのため、本仕様はユーザーにより良いセキュリティとプライバシーの保証、そしてより良いセキュリティUXを提供しつつ、破壊を最小限に抑えるよう改訂されました。ブラウザが単純にすべての混在コンテンツを厳しくブロックするのではなく、混在コンテンツの自動アップグレードを推奨します:

自動アップグレードにより、安全なウェブページで安全でないリソースが読み込まれることを防ぎつつ、開発者の作業負担を最小限に抑えます。

本仕様は、現在デフォルトでブロックされていない種類の混在コンテンツサブリソースのみ自動アップグレードを推奨し、すでにブロックされているコンテンツ種別の自動アップグレードは推奨しません。これは、ウェブ上で発生する変化を最小限に抑えるためであり、自動アップグレードがデフォルトで混在コンテンツをすべてブロックするという目標に近づく場合のみ実施します。

本仕様では混在ダウンロードという概念も明確に導入します。混在ダウンロードとは、安全なコンテキストによって開始されたが、安全でない接続でダウンロードされるリソースのことです。ユーザーエージェントは混在ダウンロードをブロックすべきです。なぜなら、(実行ファイルの場合)ユーザーエージェントのサンドボックスを回避できたり、(例:銀行明細書のダウンロードの場合)機密情報を含むことがあるためです。特に混在ダウンロードは、ユーザーエージェントがユーザーに安全なページであると表示しながら、ダウンロードを開始・完了させるので、誤解を招きやすいです。

2. 主要な概念と用語

混在コンテンツ
requestURL潜在的に信頼できるURL ではなく、かつ、それを読み込む責任のあるコンテキストが混在セキュリティコンテキストを禁止している場合(後者の厳密な定義については § 4.3 settingsは混在セキュリティコンテキストを禁止しているか? を参照)、混在コンテンツ となります。

response認証されていないレスポンス であり、かつ、それを読み込む責任のあるコンテキストが混在セキュリティコンテキストを禁止している場合、その response も混在コンテンツとなります。

混在コンテンツを制限するコンテキスト(例えば https://secure.example.com/)内では:
  1. スクリプト http://example.com/script.js へのリクエストは 混在コンテンツ です。スクリプト requestブロック可能 なので、ユーザーエージェントはネットワークエラーを返してリソースの読み込みを行いません。

  2. 画像 http://example.com/image.png へのリクエストは 混在コンテンツ です。画像 requestアップグレード可能 なので、ユーザーエージェントはURLを書き換えて https://example.com/image.png とするか、読み込みをブロックします。

注: 「混在コンテンツ」は元々 Web Security Context: User Interface Guidelines [WSC-UI]セクション5.3 で定義されました。本書はその初期定義を更新します。

注: [XML] でも「混在コンテンツ」という無関係な概念が定義されています。用語の混乱を招く可能性はありますが、この用語が10年以上にわたりユーザーエージェントのセキュリティ分野で広く使われているため、実質的な混乱のリスクは低いと考えられます。

認証されていないレスポンス
response (response) の URL潜在的に信頼できるURL ではない場合、a posteriori で認証されていないと判断できます。
埋め込みドキュメント
Document A埋め込みドキュメント とは、A閲覧コンテキストコンテナドキュメント のことです。[HTML]
混在ダウンロード
混在ダウンロードとは、安全なコンテキストによって開始されたが、安全でない接続でダウンロードされるリソースのことです。

a priori 認証済みURL は、潜在的に信頼できるURLと同等です。[SECURE-CONTEXTS]

3. コンテンツカテゴリ

理想的な世界では、すべてのユーザーエージェントは例外なくすべての混在コンテンツをブロックすることが求められます。しかし現実のインターネットでは、それは非現実的です。ユーザーエージェントは、膨大な数のウェブサイトの利用体験を損なわないよう、より微妙な制限を行う必要があります。

この観点から、混在コンテンツを § 3.1 アップグレード可能なコンテンツ§ 3.2 ブロック可能なコンテンツ の2つに分類します。

3.1. アップグレード可能なコンテンツ

アップグレード可能なコンテンツは、以前のバージョンの本仕様ではオプションでブロック可能と呼ばれていました。

混在コンテンツが混在コンテンツとして許可されるリスクよりも、ウェブの大部分が動作しなくなるリスクの方が大きい場合、そのコンテンツはアップグレード可能です。これは、そのリソースタイプの混在利用率が高く、かつそのリソース自体のリスクが比較的低い場合です。アップグレード可能だからといって安全という意味ではなく、他のリソースタイプほど致命的な危険性は低いというだけです。例えば、画像やアイコンはアプリケーションのUIの中心的な要素であることが多く、攻撃者が「メール削除」と「返信」アイコンを入れ替えると、ユーザーに実害が生じる可能性があります。

このカテゴリには以下が含まれます:

さらに § 4.4 リクエストの取得は混在コンテンツとしてブロックすべきか? で、CORS有効なリクエストは強制的に失敗させます。たとえば、<img crossorigin ...>で読み込まれる混在コンテンツ画像はブロックされます。これは、このカテゴリに含まれるのは「広く使われているために一律ブロックできないもののみ」という原則の好例です。ワーキンググループは今後さらにブロック可能なサブセットを切り出していく予定です。

3.2. ブロック可能なコンテンツ

上記で定義したアップグレード可能でないすべての混在コンテンツは、ブロック可能とみなされます。典型的な例としては、スクリプト、プラグインデータ、XMLHttpRequestによるデータ取得などがあります。

注: ナビゲーションリクエストトップレベル閲覧コンテキストを対象とする場合がありますが、これらは混在コンテンツとはみなされません。詳細は § 4.4 リクエストの取得は混在コンテンツとしてブロックすべきか? を参照してください。

注: プラグインのために行われるリクエストもブロック可能です。ただし、ユーザーエージェントがこれらのリクエストを常に制御できるとは限りません。NPAPIプラグインなどはネットワークへ直接アクセスでき、ユーザーエージェントを完全にバイパス可能です。ユーザーエージェントは可能な限りこれらのリクエストをブロックすることを推奨し、プラグインベンダーは本書で示されたリスクを軽減するために混在コンテンツチェックを実装することが望まれます。

4. アルゴリズム

4.1. 混在コンテンツrequest潜在的に信頼できるURLへ、適切な場合はアップグレードする

注: Fetch仕様はこのアルゴリズムにフックし、アップグレード可能な混在コンテンツをHTTPSにアップグレードします。

Request requestが与えられた場合、このアルゴリズムはリクエストがアップグレード可能な混在コンテンツと判断された場合、そのURLを書き換えます。具体的なアルゴリズムは以下の通りです:

  1. 以下のいずれかの条件が満たされた場合、requestを変更せずにリターンする:
    1. requestURL潜在的に信頼できるURLである。
    2. requestURLホストIPアドレスである。
    3. § 4.3 settingsは混在セキュリティコンテキストを禁止しているか?requestclientに適用されて"Does Not Restrict Mixed Security Contents"を返す。
    4. requestdestinationが"image"、"audio"、"video"以外である。
    5. requestdestinationが"image"かつrequestinitiatorが"imageset"である。

      注: 歴史的な理由により"imageset"はアップグレードされません。以前は混在コンテンツをブロック可能・オプションでブロック可能に区分していましたが、"imageset"はブロック可能に含まれており、仕様にアップグレードが追加された際もアップグレード対象外となりました。

  2. requestURLschemehttpの場合、 requestURLschemehttpsに設定し、リターンする。

    注: [url]に従い、ポートは変更しません。schemeがhttpの場合ポートはnullとなり、schemeがhttpsに変更された時点で443として解釈されます。

4.2. 以前のアルゴリズムへの修正

注: このセクションは仕様の以前のバージョンのアルゴリズムに対する修正を含みます。オプションでブロック可能とブロック可能の区別を無視し、すべてのオプションでブロック可能な混在コンテンツは自動アップグレードされるようになりました。

4.3. settingsは混在セキュリティコンテキストを禁止しているか?

ドキュメントとワーカーの両方は環境設定オブジェクトを持ち、以下のアルゴリズムによって混在コンテンツを制限するかどうかを判定できます。このアルゴリズムは適切に"Prohibits Mixed Security Contexts"または"Does Not Prohibit Mixed Security Contexts"を返します。

environment settings object (settings)が与えられた場合:

  1. settingsorigin潜在的に信頼できるoriginなら "Prohibits Mixed Security Contexts"を返す。

  2. settingsglobal objectwindowの場合:

    1. documentsettingsglobal objectの関連付けられたDocumentを設定する。

    2. navigable navigabledocument先祖navigablesで反復:

      1. navigableactive documentorigin潜在的に信頼できるoriginなら "Prohibits Mixed Security Contexts"を返す。

  3. "Does Not Restrict Mixed Security Contexts"を返す。

ドキュメントが埋め込みドキュメントを持つ場合、ユーザーエージェントはドキュメント自身だけでなく、そのドキュメントがネストされているトップレベル閲覧コンテキストも確認する必要があります。これはユーザーが読み込んだリソースのセキュリティ状態に関する期待をコントロールするコンテキストです。例:
http://a.comhttp://evil.comを読み込む。この場合、a.comが安全な接続で読み込まれていないため、安全でないリクエストは許可されます。
https://a.comhttp://evil.comを読み込む。この場合、a.comが安全な接続で読み込まれているため、安全でないリクエストはブロックされます。
http://a.comhttps://b.comをフレームし、https://b.comhttp://evil.comを読み込む。この場合、b.comが安全な接続で読み込まれているため、evil.comへの安全でないリクエストはブロックされます(a.comは安全でなくても)。
https://a.comdata:URLをフレームし、data:URLがhttp://evil.comを読み込む。この場合、トップレベルコンテキストでdata:URLが混在コンテンツをブロックしなくても、a.comが安全な接続で読み込まれているため、evil.comへの安全でないリクエストはブロックされます。

4.4. requestの取得は混在コンテンツとしてブロックすべきか?

注: Fetch仕様はこのアルゴリズムにフックし、リクエストが完全にブロックされるべきか(例:ブロック可能コンテンツの場合、安全な接続で読み込まれないと仮定できる)を判定します。

Request requestが与えられた場合、ユーザーエージェントは以下のアルゴリズムによりリクエストrequestを進行させるべきか判定します:

  1. 以下のいずれかの条件が満たされた場合はallowedを返す:
    1. § 4.3 settingsは混在セキュリティコンテキストを禁止しているか?requestclientに適用されて"Does Not Restrict Mixed Security Contexts"を返す。
    2. requestURL潜在的に信頼できるURLである。
    3. ユーザーエージェントが混在コンテンツの許可を指示されている(§ 7.2 ユーザーコントロール参照)。
    4. requestdestinationが"document"で、requesttarget browsing context親閲覧コンテキストが存在しない。

      注: トップレベルナビゲーションは混在コンテンツのチェック対象外ですが、ユーザーエージェントは安全でないフォーム送信に対して混在コンテンツチェックを適用することも可能です(§ 7.1 フォーム送信参照)。

  2. blockedを返す。

4.5. requestへのresponseは混在コンテンツとしてブロックすべきか?

注: リクエストが進行した場合でも、レスポンスを生成した接続の状態(例:リクエストがブロック可能だが接続が認証されていないなど)によってレスポンスのブロックが必要になる場合があります。また、Service Workerがブロック可能リクエストに対して認証されていないレスポンスを誤って返さないようにも判断が必要です。このアルゴリズムはその判定に使用されます。

request requestresponse responseが与えられた場合、ユーザーエージェントは以下のアルゴリズムで返すべきレスポンスを判定します:

  1. 以下のいずれかの条件が満たされた場合はallowedを返す:
    1. § 4.3 settingsは混在セキュリティコンテキストを禁止しているか?requestclientに適用されてDoes Not Restrict Mixed Contentを返す。
    2. responseurl潜在的に信頼できるURLである。
    3. ユーザーエージェントが混在コンテンツの許可を指示されている(§ 7.2 ユーザーコントロール参照)。
    4. requestdestinationが"document"で、requesttarget browsing context親閲覧コンテキストが存在しない。

      注: トップレベルナビゲーションは混在コンテンツのチェック対象外ですが、ユーザーエージェントは安全でないフォーム送信に対して混在コンテンツチェックを適用することも可能です(§ 7.1 フォーム送信参照)。

  2. blockedを返す。

5. 統合

5.1. Fetchへの修正

Fetch § 4.1 メインフェッチは、ステップ3と4の間でrequestに対して§ 4.1 混在コンテンツのリクエストを適切な場合は潜在的に信頼できるURLへアップグレードするを呼び出すように修正すべきです。すなわち、アップグレード可能な混在コンテンツは混在コンテンツのブロック処理を適用する前にHTTPSへ自動アップグレードされるべきです。

5.2. HTMLへの修正

ナビゲートレスポンスの処理 は以下のように修正すべきです。ステップ3は、sourceアクティブドキュメントURL潜在的に信頼できるURLで、かつresponseURLリスト内のいずれかのURLが潜在的に信頼できるURLでない場合、ダウンロードを中止してリターンすべきです。

同様の修正をハイパーリンクのダウンロードにも適用すべきです。このアルゴリズムでは、ステップ6.2は、subjectノードドキュメントURL潜在的に信頼できるURLで、かつresponseURLリスト内のいずれかのURLが潜在的に信頼できるURLでない場合はリターン(ダウンロード中止)すべきです(responserequestのフェッチ結果)。

注: ダウンロードは他の混在コンテンツタイプと異なり自動アップグレードされません。なぜなら、ユーザーエージェントはリソースがダウンロードされるかどうかをリクエスト前に必ずしも把握できないためです。

注: リソースはユーザーエージェントが不正な接続に基づいてダウンロードを中止するかどうかを判断する前にダウンロードされます。そのため、ユーザーエージェントが最終的にダウンロードをブロックしても、機密情報がネットワーク上を通過する可能性があります。これは一般的に避けられませんが、ユーザーエージェントがリソースをブロックすることで、ウェブサイト運営者が安全な接続でダウンロードを提供するよう促すことができます。

6. 廃止事項

6.1. Strict Mixed Content Checking

以前のバージョンの本仕様ではblock-all-mixed-content CSPディレクティブが定義されていましたが、現在は廃止されています。なぜなら、自動アップグレードできないすべての混在コンテンツが現在はブロックされるためです。

注: upgrade-insecure-requests ([upgrade-insecure-requests])ディレクティブは廃止されていません。これは開発者がブロック可能なコンテンツをアップグレードできるようにするためです。本仕様はデフォルトでアップグレード可能なコンテンツのみアップグレードします。

7. セキュリティおよびプライバシーに関する考慮事項

全体として、アップグレード可能な混在コンテンツの自動アップグレードは、より多くのユーザー通信をネットワークの盗聴や改ざんから保護できるため、セキュリティ・プライバシーの向上が期待されます。

開発者が意図しなかったリソースを読み込むことで、ウェブページにセキュリティやプライバシー上の問題が発生するリスクがあります。例えば、あるウェブサイトがhttp://www.example.com/image.jpgから画像を読み込んでおり、何らかの理由でhttps://www.example.com/image.jpgがトラッキングサイトにリダイレクトされている場合、ブラウザは開発者やユーザーの明示的な同意なしにプライバシー問題を引き起こすことになります。しかし、こうしたケースは非常に稀であると考えられます。このリスクはアップグレード可能なコンテンツのみを自動アップグレードし、ブロック可能なコンテンツは対象外とすることで軽減されます。ブロック可能なコンテンツは、例えば古い脆弱なJavaScriptライブラリを読み込むなど、より大きなリスクを持つ可能性があります。

7.1. フォーム送信

§ 4.3 settingsは混在セキュリティコンテキストを禁止しているか?が、Document関連設定オブジェクトに適用された際にRestricts Mixed Contentを返す場合、ユーザーエージェントは、form要素のaction属性の値が潜在的に信頼できるURLでない場合、ユーザーに警告を表示することができます。

ユーザーエージェントは、form要素のaction属性の値が潜在的に信頼できるURLでない場合、送信時に警告を表示し、送信を中止できるようにすることができます。もしユーザーエージェントがform要素の送信先が潜在的に信頼できるURLでない場合に警告するなら、送信先がリダイレクトして非信頼URLとなった場合も警告し送信を中止できるようにすべきです。その場合、formの情報が漏れることになります。

さらに、ユーザーエージェントはそのようなDocumentからのフォーム送信を、ブロック可能リクエストとして扱うこともできます。送信がトップレベル閲覧コンテキストで行われた場合でも同様です。

7.2. ユーザーコントロール

ユーザーエージェントは、特定のページでブロック可能混在コンテンツのブロック決定をユーザーが上書きできる機能を提供してもよいです。

注: 実際には、ユーザーエージェントがこのような抜け道を一切提供しないのは困難でしょう。ただし、混在スクリプトの許可は特に非常に危険な選択であり、各ユーザーエージェントはREALLY SHOULD NOT [RFC6919]、リスクを慎重に説明した上で選択肢を提示すべきです。

ユーザーエージェントは、特定のページでアップグレード可能混在コンテンツの自動アップグレード決定をユーザーが上書きできる機能を提供してもよいです。

ユーザーエージェントがそのようなコントロール機能を提供する場合、支援技術を利用するユーザーのためにアクセシビリティAPI経由でも同様の機能を提供しなければなりません。

8. 謝辞

WebAppSec WGから寄せられた素晴らしいフィードバックに加え、Chromeセキュリティチームは本仕様の準備において非常に貴重な協力をしてくれました。特に、Chris Palmer、Chris Evans、Ryan Sleevi、Michal Zalewski、Ken Buchanan、Tom Sepezは、初期段階で多くのフィードバックを提供してくれました。Anne van KesterenはFetchの説明や本仕様へのインターフェース定義、Level 2アップデートへの重要なフィードバックを提供してくれました。Brian Smithは仕様を焦点化し、簡潔で理性的なものに保つために助力してくれました。

索引

本仕様で定義される用語

参照で定義される用語

参考文献

規範的参考文献

[DOM]
Anne van Kesteren. DOM Standard. 現行標準. URL: https://dom.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. 現行標準. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; 他. HTML Standard. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 現行標準. URL: https://infra.spec.whatwg.org/
[SECURE-CONTEXTS]
Mike West. Secure Contexts. 2021年9月18日. CR. URL: https://www.w3.org/TR/secure-contexts/
[URL]
Anne van Kesteren. URL Standard. 現行標準. URL: https://url.spec.whatwg.org/
[XHR]
Anne van Kesteren. XMLHttpRequest Standard. 現行標準. URL: https://xhr.spec.whatwg.org/

参考情報

[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2023年2月14日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[RFC6919]
R. Barnes; S. Kent; E. Rescorla. Further Key Words for Use in RFCs to Indicate Requirement Levels. 2013年4月1日. 実験的. URL: https://www.rfc-editor.org/rfc/rfc6919
[UPGRADE-INSECURE-REQUESTS]
Mike West. Upgrade Insecure Requests. 2015年10月8日. CR. URL: https://www.w3.org/TR/upgrade-insecure-requests/
[WSC-UI]
Thomas Roessler; Anil Saldhana. Web Security Context: User Interface Guidelines. 2010年8月12日. REC. URL: https://www.w3.org/TR/wsc-ui/
[XML]
Tim Bray; 他. Extensible Markup Language (XML) 1.0 (第五版). 2008年11月26日. REC. URL: https://www.w3.org/TR/xml/