Trusted Types
Trusted Types とは何ですか?
Trusted TypesDOM ベースの XSS を根本から防ぐためのブラウザ API と CSP ディレクティブ。危険な DOM シンクには生文字列ではなく、ポリシーで検証された型付き値しか受け付けないようにする。
Trusted Types は、DOM ベース XSS を根絶するために Google が設計し、W3C の Working Draft として標準化された防御機構です。require-trusted-types-for 'script' と trusted-types の CSP ディレクティブで有効化すると、ブラウザは注入シンク、すなわち innerHTML、outerHTML、document.write、eval、文字列を渡した setTimeout、script.src、iframe.srcdoc をはじめとする数十のシンクに対して、生の文字列が渡された場合は実行を拒否します。代わりにコードは、名前付きで監査された各ポリシーが trustedTypes.createPolicy(...) を通じて生成する型付きオブジェクト(TrustedHTML、TrustedScript、TrustedScriptURL)を渡さなければなりません。これにより、コードベースに散在する数千もの安全でないシンクが、レビュー可能なわずかな数のポリシー関数へと集約されます。
この仕組みは Chromium 系ブラウザに搭載されています(Chrome と Edge は v83、2020 年 5 月以降)。Firefox と Safari の実装は現在も進行中であるため、単独の対策ではなく、厳格な CSP と併用する多層防御として展開されます。default という名前の特別なポリシーは、すり抜けてきた文字列をすべて捕捉し、サニタイザーへ通せるようにします。DOMPurify はネイティブで TrustedHTML を返すため、DOMPurify.sanitize(html, {RETURN_TRUSTED_TYPE: true}) で強制を満たせます。Google は、Search や Photos といった製品において DOM XSS をほぼゼロにまで削減できたのは Trusted Types のおかげだとしています。同社で過去に発生した XSS の大半はクライアントサイドのものだったからです。まずは Content-Security-Policy-Report-Only モードで展開し、強制する前に違反を洗い出しましょう。
flowchart TD
A[信頼できない文字列<br/>location.hash, postMessage] --> B{DOM シンクに代入?<br/>例: innerHTML}
B -->|Trusted Types 強制中| C{値は<br/>TrustedHTML オブジェクト?}
C -->|はい、監査済みポリシー由来| D[シンクが安全に実行]
C -->|いいえ、生文字列| E[ブラウザが例外送出<br/>TypeError + CSP レポート]
E --> F[default ポリシー<br/>DOMPurify がサニタイズ]
F --> C
B -->|Trusted Types なし| G[シンクが生文字列を実行<br/>DOM ベース XSS]● 例
- 01
Content-Security-Policy: require-trusted-types-for 'script'; trusted-types default;
- 02
element.innerHTML = userInput を element.innerHTML = policy.createHTML(userInput) に置き換える。
● よくある質問
Trusted Types とは何ですか?
DOM ベースの XSS を根本から防ぐためのブラウザ API と CSP ディレクティブ。危険な DOM シンクには生文字列ではなく、ポリシーで検証された型付き値しか受け付けないようにする。 サイバーセキュリティの アプリケーションセキュリティ カテゴリに属します。
Trusted Types とはどういう意味ですか?
DOM ベースの XSS を根本から防ぐためのブラウザ API と CSP ディレクティブ。危険な DOM シンクには生文字列ではなく、ポリシーで検証された型付き値しか受け付けないようにする。
Trusted Types からどのように防御しますか?
Trusted Types に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。