DOM ベース XSS
DOM ベース XSS とは何ですか?
DOM ベース XSSクライアントサイドの JavaScript が信頼できないデータをサニタイズせずにシンクへ書き込むことで、注入と実行がすべてブラウザ内で完結する XSS の亜種。
DOM ベース XSS(Type-0)は、根本原因がすべてクライアントサイドのコードに存在するクロスサイトスクリプティングの欠陥です。この用語は、2005 年に Amit Klein が論文 "DOM Based Cross Site Scripting or XSS of the Third Kind." で提唱しました。信頼されたソース、すなわち location.hash、location.search、document.referrer、window.name、postMessage、localStorage が、サニタイズされないまま innerHTML、document.write、eval、setTimeout、jQuery.html() といった危険なシンクへ流れ込みます。悪意あるペイロードはしばしば URL のフラグメント(# の後ろ)に乗るため、サーバには一切送信されず、WAF、サーバログ、そして大半の反射型 XSS スキャナーからは不可視となります。
実世界での影響は大きく、DOM XSS は広告や分析タグ、クロスオリジンのデータを信頼する postMessage ハンドラー、そしてレガシーな jQuery セレクター($(location.hash)、1.6.3 より前のバージョンで CVE-2011-4969 として修正)などに繰り返し現れてきました。Google 自身の分析では、同社製品における XSS の大半が DOM ベースであることが判明し、これが Trusted Types の開発の動機となりました。対策としては、textContent や setAttribute のような無害なシンクを優先し、DOMPurify や組み込みの Sanitizer API でサニタイズし、Trusted Types と厳格な Content Security Policy を強制し、コードレビュー時にソースからシンクへのフローを追跡する汚染解析(taint-tracking)ツールを実行することが挙げられます。
flowchart LR
A["ソース<br/>location.hash / postMessage"] --> B[クライアントサイド JS<br/>が値を読み取り]
B --> C{サニタイズ済み?}
C -->|"textContent / DOMPurify"| D[安全に描画]
C -->|"生文字列を innerHTML,<br/>eval, document.write へ"| E[シンクがペイロードを実行]
E --> F[攻撃者のスクリプトが<br/>被害者のセッションで実行]
F --> G[Cookie 窃取、アカウント<br/>乗っ取り、キーロギング]
E -.->|Trusted Types が阻止| H[TypeError、実行なし]● 例
- 01
document.getElementById('out').innerHTML = location.hash.substring(1);
- 02
SPA ルータが window.location を用いてサニタイズしていない HTML をテンプレートスロットに描画する。
● よくある質問
DOM ベース XSS とは何ですか?
クライアントサイドの JavaScript が信頼できないデータをサニタイズせずにシンクへ書き込むことで、注入と実行がすべてブラウザ内で完結する XSS の亜種。 サイバーセキュリティの 攻撃と脅威 カテゴリに属します。
DOM ベース XSS とはどういう意味ですか?
クライアントサイドの JavaScript が信頼できないデータをサニタイズせずにシンクへ書き込むことで、注入と実行がすべてブラウザ内で完結する XSS の亜種。
DOM ベース XSS からどのように防御しますか?
DOM ベース XSS に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
DOM ベース XSS の別名は何ですか?
一般的な別名: Type-0 XSS, クライアントサイド XSS。