BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース クロスサイトスクリプティング脆弱性を防止するTrusted Types API

クロスサイトスクリプティング脆弱性を防止するTrusted Types API

原文(投稿日:2019/03/20)へのリンク

Google Chromeチームは,DOMクロスサイトスクリプティング(XSS)セキュリティ脆弱性の防止を支援するための,試験的なTrusted Types APIを発表した。同社のVulnerability Reward Programによると,DOM XSSは,XSSセキュリティの中で最も一般的なものだ。

Googleでセキュリティを担当するエンジニアのKrzysztof Kotowicz氏は,XSSによって開発者が直面する課題を次のように説明する。

実務的に見れば,XSSフリーなアプリケーションを維持することは,アプリケーションが複雑である場合は特に,依然として難題であることが分かります。サーバ側でXSSを防止するためのソリューションは広く知られていますが,DOMベースのクロスサイトスクリプティング(DOM XSS)が大きな問題となってきているのです。

問題となるのは,XSSは簡単に実行できる一方で,その検出が難しいことだ。

Trusted Typesは,これらのXSS問題に根本原因から対処することで,DOM XSS脆弱性の排除を支援する。

Trusted Typesを使用することによって,危険なインジェクションシンクをブロックすることが可能になり,デフォルト状態が安全になるとともに,文字列による呼び出しを防止できる。この機能を活用するには,Content Security Policy(CSP) HTTP応答ヘッダにContent-Security-Policy: trusted-types *を設定すればよい。

これにより,次の例のような,XSSの一般的な方法を防止することができる。これはGoogleが例として提供しているものだ。

const templateId = location.hash.match(/tplid=([^;&]*)/)[1];
// typeof templateId == "string"
document.head.innerHTML += templateId // Throws a TypeError.

Trusted Typesでは,新たなグローバルが導入されて,ポリシの設定を通じて既存のものに代えて使用される。

const templatePolicy = TrustedTypes.createPolicy('template', {
  createHTML: (templateId) => {
    const tpl = templateId;
    if (/^[0-9a-z-]$/.test(tpl)) {
      return `<link rel="stylesheet" href="./templates/${tpl}/style.css">`;
    }
    throw new TypeError();
  }
});

const html = templatePolicy.createHTML(location.hash.match(/tplid=([^;&]*)/)[1]);
// html instanceof TrustedHTML
document.head.innerHTML += html;

テンプレートポリシは,最終的なHTMLを生成する前に,渡されたIDパラメータの検証を行う。ポリシオブジェクトは,ユーザが定義したcreateHTML関数をTrusted Typeオブジェクト内にラップする。templateIdの検証がXSS脆弱性の対策として有効である以外にも,DOM XSS脆弱性の導入される可能性のあるコードがそのポリシのコードに限定されることにより,DOM XSS脆弱性問題に関してレビューすべきコードベースの領域を制限することができる。

現時点でのTrusted Typesには,HTML,URL,ScriptURL,Scriptがある。Trusted TypesのCSPはひとつ,またはすべてのTrusted Typesポリシに制限されている

Trusted Typesは,ライブWebサイトあるいはChromeのWebアプリ上でTrusted Types Origin Trialを登録するか,ローカルインストールしたChromeをコマンドラインchrome --enable-blink-features=TrustedDOMTypesで実行してこの機能を有効にするか,あるいはChrome内でchrome://flags/#enable-experimental-web-platform-featuresをオープンすれば試すことができる。

他のブラウザでこの機能を試すためのTrusted Typesポリフィルも用意されている。ブラウザポリフィルには,Trusted Typesを使ったコードベースが古いブラウザでも動作するようにAPIのみをサポートするものと,ドキュメントのCSPポリシに基づいたDOM内の型制限が有効なものと,2つのタイプがある。実際にTrusted Typesポリフィルを使用したデモも公開されている。

イシューやフィードバックはWICG Trusted Types GitHubプロジェクトまで報告するか,あるいはtrusted-types Google Groupで議論される。Trusted Typesの仕様に対するコントリビューションが,WICGコントリビューションガイドラインを通じて募集中である。

この記事に星をつける

おすすめ度
スタイル

BT