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コントリビューションガイドラインを通じて募集中である。