独立したウェブアプリ(IWA)は、ウェブ アプリケーションが、通常は標準の「ドライブバイ」ウェブで制限されている強力な機能(Direct Sockets や Controlled Frame など)にアクセスできるセキュリティ モデルを提供します。IWA は信頼性の高い環境で動作するため、厳格なセキュリティとプライバシーのポリシーを遵守する必要があります。これらのガイドラインは、ウェブ プラットフォームの機能が強化されるにつれて、ユーザーの安全が確保され、ブラウザ環境の完全性が維持されるように設計されています。
IWA 信頼モデル
IWA プラットフォームの中核は、デベロッパーに高いレベルのセキュリティを維持させる厳格な技術ポリシーを中心に構築されています。標準のウェブアプリは柔軟な権限モデルに依存していますが、IWA は暗号で署名され、ウェブ バンドルを使用して配信されるため、オリジンと完全性を検証できます。
この検証済みの ID と引き換えに、IWA は特権 API へのアクセス権を取得します。この信頼を維持するため、デベロッパーは、強力な機能を使用する場合でもユーザーの安全を確保する、厳格なポリシー(堅牢なコンテンツ セキュリティ ポリシー(CSP)や Trusted Types など)を遵守することで、セキュリティを最優先するアプローチを採用する必要があります。具体的には、次のようになります。
- 透明性: ユーザーが、特権 API の使用に驚くことがないようにします。
- 最小権限: アプリは、明示された目的に必要な特定の機能のみをリクエストして使用する必要があります。
- 静的完全性: 実行可能なロジックはすべてアプリ パッケージ内に自己完結している必要があります。これにより、セキュリティ監査が可能になり、悪意のあるコードのサイドローディングを防ぐことができます。
IWA には、外部スクリプトの実行を防止する厳格なコンテンツ セキュリティ ポリシー(CSP)などの堅牢な組み込み保護機能が含まれていますが、技術的な制約だけではすべてのリスクを軽減することはできません。信頼性の高い環境であっても、特定の実装パターンやデベロッパーの選択によって、ユーザーの安全性やプライバシーが意図せず損なわれる可能性があります。このガイドでは、これらの制限付きシナリオと、特権 API の使用を管理するポリシーについて説明します。
このガイドラインが重要な理由
これらのポリシーを遵守することは、単にコンプライアンスを満たすだけでなく、高度なウェブ アプリケーションの持続可能なエコシステムを構築することにもつながります。これらのガイドラインに沿うことで、アプリケーションが次の条件を満たすようになります。
- セキュリティの回帰を回避する: ロジックを自己完結型にすることで、クロスサイト スクリプティング(XSS)やリモートコード実行などの脆弱性を防ぎます。
- ユーザーのプライバシーを保護する: ユーザーの明示的な意図と透明性に基づいてのみ、機密データとハードウェア アクセスが処理されるようにします。
- プラットフォームの長期的な維持: IWA プラットフォームが機能セットを拡張し続けるために必要な高いセキュリティ基準を維持するのに役立ちます。
基本原則
透明性とユーザーの意図
最も基本的なルールは、ユーザーを驚かせないことです。アプリケーションの動作は、その目的とユーザーの期待に沿ったものでなければなりません。
- 範囲内に留まる: アプリケーションの明確な目的を超える機能を実装しないでください。
- API のフットプリントを最小限に抑える: アプリのコア機能を達成するために必要な特定の IWA API のセットのみをリクエストして使用します。
動的コードのサイドローディングなし
IWA セキュリティ モデルは、管理者またはブラウザ ベンダーがすべての実行可能ロジックを検証できるかどうかに依存します。そのため、IWA パッケージは自己完結型でなければなりません。このプラットフォームでは、eval() や new Function() などの文字列ベースの実行をブロックする厳格なコンテンツ セキュリティ ポリシー(CSP)によって、これが適用されます。
script-src 'self' 'wasm-unsafe-eval';
require-trusted-types-for 'script';
CSP では 'wasm-unsafe-eval' で WebAssembly をサポートできますが、このセキュリティ境界の精神を回避してはなりません。
厳禁されている行為
- リモートコードのインタープリタの提供: Direct Sockets などの特権ネットワーク アクセスを使用して外部スクリプトをダウンロードして実行するコード インタープリタ(WASM にコンパイルされた Python や Lua など)を含めることはできません。
- リモートで読み込まれたロジック: サービス ワーカーを使用して、リモートで読み込まれたコードを IWA オリジンに埋め込まないでください。
- コードとデータ: データ(JSON など)のダウンロードは許可されますが、解釈または実行を目的としたコードのダウンロードはポリシー違反となります。
最小権限の原則
タスクを完了できる最小限の API を常に使用します。特権 IWA 固有の API は、標準のウェブ API のセキュリティ制約やユーザー プロンプトをバイパスするショートカットとして使用すべきではありません。次の表に、従来の Web API と IWA 固有の機能のどちらを使用するかを判断する際に役立つ一般的なユースケースを示します。
| タスク | 標準の Web API を使用する(推奨) | 特権 IWA API を使用しない(制限付き) |
|---|---|---|
| 外付けハードドライブへのアクセス | 標準のファイル I/O には File System Access API を使用します。 | ストレージへのアクセスに Unrestricted WebUSB を使用しないでください。 |
| スマートカード インタラクション | スマートカード API を使用します。 | スマートカードに Unrestricted WebUSB を使用しないでください。 |
| シリアル デバイスの通信 | デバイスで十分な場合は、WebSerial API を使用します。 | WebSerial でタスクを実行できる場合は、制限なしの WebUSB を使用しないようにします。 |
| 信頼できるコンテンツを埋め込む | 標準の <iframe> を使用します。 |
分離が必要な場合を除き、単純な埋め込みに <controlledframe> を使用しないでください。 |
API 固有のガイドライン
IWA API は、通常ブラウザで制限されている強力な機能を提供します。一般的なガイダンスとしては、ユーザーを驚かせたり、ユーザーの信頼やデータを損なうような方法でこれらの特権機能を使用しないことが推奨されます。
Direct Sockets API
Direct Sockets API は、マルチキャストやローカル ネットワーク アクセスなど、未加工の TCP と UDP へのアクセスを許可します。
許可
- カスタム プロトコルのサポート: 現在上位レベルの Web API が存在しないカスタム プロトコルを使用するリモート サーバーに接続します。
- バックエンド サービスの維持: アプリケーションのバックエンド サービス専用の、事前定義されたハードコード化されたサーバーに接続します。
- 必須のハードウェアの検出: ローカル ネットワークにアクセスしたり、マルチキャストを使用して、アプリの機能に不可欠な特定の関連ハードウェアを検出する(動画編集アプリがネットワーク接続ストレージを検出するなど)。
許可されない
- ユーザーを驚かせる: テキスト エディタがローカル ネットワーク デバイスと通信するなど、アプリの主な機能で明確に正当化されないネットワーク アクセスを実装している。
- ネットワークの任意のスキャン: ユーザーのプロファイリングや無関係なデバイスの検出を目的として、ユーザーのローカル ネットワークの広範なスキャン(192.168.1.0/24 のポートスキャンなど)を行うこと。
- ローカル デバイスをターゲットにする: ローカル ネットワーク上の他のデバイスをプローブ、再構成、攻撃することは厳禁です。
Controlled Frame API
<controlledframe> 要素を使用すると、スクリプトの挿入やヘッダーの変更など、クロスオリジン コンテンツの埋め込みと変更が可能になります。
許可
- ユーザー インターフェースの合理化: サードパーティ サービスを埋め込み、CSS を挿入して、関連性のない UI 要素を非表示にしたり、よりまとまりのあるエクスペリエンスを提供したりします。
- 安全な通信の仲介:
postMessageを含む埋め込みページからリクエストを受け取り、特権 API を介して取得したサニタイズ済みの必要なデータのみを返すことで、ゲートキーパーとして機能します。
許可されない
- ユーザー認証情報の盗用: スクリプトを挿入して、埋め込みコンテンツからパスワード、セッション Cookie、その他の機密性の高いユーザーデータを取得する。
- サービス規約の違反: プログラマティック広告のクリックや不正なスクレイピングなど、埋め込みプラットフォームの利用規約に違反する方法で埋め込みプラットフォームを変更すること。
- 特権アクセスをプロキシする: 信頼できない埋め込みコンテンツに、特権 IWA API への直接アクセスまたは制御されないアクセスを許可するパススルーを作成する。
- 制御されていない AI の実装: 特定の透明性の高いユースケースの制約なしに、AI を通じてログイン ユーザーに代わってアクションを実行する。
画面録画の制限なし
標準のウェブで表示されるようなユーザー権限のプロンプトが繰り返し表示されることなく、スクリーン キャプチャが可能になります。
許可
- コア機能の提供: 仮想会議やチュートリアル録画機能など、アプリのサービスの一部として画面キャプチャを明確に使用している場合。
- ユーザーの認識を確保する: アプリケーションを使用する前に、録画が行われる可能性があることをユーザーに明確に通知します。
許可されない
- 秘密裏に録画する: ユーザーの明示的な事前認識と同意なしに、ユーザーの画面をキャプチャすること。
- プライバシー規制への違反: 地域のプライバシー法または国際的なプライバシー法に違反する録画行為を行うこと。
制限のない WebUSB
Unrestricted WebUSB は、標準の WebUSB 拒否リストをバイパスして、デバイスとの低レベルのやり取りを可能にします。
許可
- 独自のハードウェアのサポート: 高水準のウェブ API が存在しない特殊なハードウェアやレガシー ハードウェア(産業用コントローラなど)とのやり取り。
許可されるようになりました
- 専用 API のバイパス: スマートカード(Smart Card API を使用)や外部ストレージ(File System Access API を使用)など、より具体的で制約のある API を持つデバイスに WebUSB を使用します。
ウィンドウ管理(window.open、window.focus)
IWA は、標準ウェブで必要なユーザー操作なしで、ポップアップを作成してウィンドウにフォーカスできます。
許可
- タスク完了の通知: 動画のレンダリングなど、ユーザーが開始した重要なバックグラウンド タスクが完了したときに、アプリ ウィンドウをフォーカスします。
許可されない
- スパム行為: ユーザーに複数の不要なウィンドウを大量に表示する行為。
- フィッシング: システム ダイアログを模倣したり、ユーザーを騙したりするように設計されたウィンドウを開きます。
- フォーカス スティール: 重要でないイベントのために他のアプリからフォーカスを奪い、ユーザーを妨害します。
まとめ
分離されたウェブアプリのセキュリティ アーキテクチャは、ユーザーにとって信頼性の高い環境を維持しながら、デベロッパーを支援するように設計されています。これらのガイドラインに準拠することで、アプリが IWA エコシステムの責任ある市民であり続けることができます。このガイドの最も重要なポイントは次のとおりです。
- 透明性を優先する: アプリケーションの動作は常に明示された目的に沿ったものでなければなりません。ユーザーを驚かせたり裏切ったりするような機能を実装してはなりません。
- パッケージの完全性を適用する: 静的検証を可能にするため、すべての実行可能ロジックは IWA バンドル内に自己完結している必要があります。動的コードのサイドローディングやリモート インタープリタを介してセキュリティ モデルをバイパスすることは固く禁じられています。
- 最小権限の原則を遵守する: 特定のタスクに利用可能な最も制約の厳しい API を常に選択します。特権 IWA API は、アプリケーションのコア機能に標準の Web API では不十分な場合にのみ使用する必要があります。
- ゲートキーパーとして機能する:
<controlledframe>などの強力なツールを使用する場合、IWA は信頼できないコンテンツの透過プロキシではなく、安全な仲介者として機能する必要があります。
IWA を公開する前に、次の質問に答えて実装の最終監査を行います。
- このタスクに可能な限りシンプルで制約の多い API を使用しているか?
- アプリの動作によってユーザーが驚いたり、裏切られたと感じたりする可能性はありますか?
最初の質問の答えが「いいえ」の場合、または 2 番目の質問の答えが「はい」の場合、アプリは IWA のセキュリティ ポリシーに違反している可能性が高く、削除の対象となる可能性があります。