ここが危ない!Web2.0のセキュリティ
第8回 Wikiのセキュリティ
「ユーザ参加型サービス」のもつ危険性
一般的なWebアプリケーションでは,HTMLタグとなる文字をエスケープしていれば,それがクロスサイトスクリプティング対策にもなっていました。しかし,Wikiやブログのようなユーザ参加型のサービスの場合,HTMLタグとなる文字を単純にエスケープすることはできません。ユーザに参加してもらう,つまりユーザにHTMLを記述してもらう場合があるためです。ユーザの中には素直なユーザだけではなく,不正なスクリプトを混入させようと狙っている攻撃者も存在します。
というわけで,今回から2回に渡って,ユーザ参加型のサービスを提供しつつ,セキュリティを確保する方法について見ていきます。今回はWikiのセキュリティについて考え,次回はブログのセキュリティを考えたいと思います。
Wikiのセキュリティ要件
基本的にWikiには認証という考えは無く,不特定多数の人が誰でも記事を編集できるようになっています。認証が無い代わりに変更履歴として,IPアドレスと変更箇所が記録されます。この方法のセキュリティレベルは決して高いとは言えませんが,攻撃に対して十分な抑止効果を発揮しており,セキュリティと利便性のトレードオフという観点では,バランスの取れた位置にあると思います。
Wikiを提供する際に難しいのは,クロスサイトスクリプティング対策です。文字装飾や整形のためのHTMLタグは許可しつつ,スクリプトは許可しないようにする必要があるためです。
ここでひとつ例を挙げて考えます。
たとえば見出しを表示する場合,HTMLでは以下のように記載します。
<H2>見出し</H2>
さて,ここで入力された文字列が単なる見出しであり,スクリプトが実行されないかをチェックする必要があります。そのためには以下のような処理を行えばよいと考えられます(図1)。
- HTMLを構文解析する
- 許可されたタグであるかをチェックする
- 許可された属性,属性値であるかをチェックする
Wikiにおけるセキュリティ対策の問題点
それでは上記の方法でスクリプトの混入を防ぐことができるかを考えてみます。
まず,以下の2つのHTMLを見てください。どのように構文解析すればよいでしょうか。そして,スクリプトが実行されると思いますか?
1.html
<H2/</onmouseover=alert('sst')
<b>見出し</H2>
2.html
<script src=a.js?<H2>見出し</H2>
正解は表1のようになります。
表1 ブラウザによる構文解析の違い
| 1.html | 2.html | |
|---|---|---|
| Internet Explorer 6 | ○ | × |
| Internet Explorer 7 | ○ | × |
| Firefox 2.0.0.7 | × | ○ |
| Opera 9.23 | × | × |
| Safari 3.0.3 | × | × |
- ○:実行される
- ×:実行されない
ご覧のとおり,ブラウザによって異なる結果になっています。HTMLの構文解析はブラウザによって解釈の異なる部分もあるため,解析しきれないというのが現実です。また,今後各ブラウザがいつ仕様変更されるかもわかりません。
次に以下をご覧ください。攻撃者は以下のようなHTMLを挿入してくることが考えられます。
- <H2/onmouseover=alert('xss')>見出し</H2>
- <H2 onmouseover=alert('xss')>見出し</H2>
- <H2 style="{javascript:expression(alert('xss'))}">見出し</H2>
- <H2 style="{a:expression(alert('xss'))}">見出し</H2>
- <H2 style="{javascript:expression(alert('xss'))}">見出し</H2>
たとえば構文解析がうまくできていなかった場合,上記1番のスクリプトが混入します。
許可された属性値であるかのチェックがうまくできていなかった場合,2~5番のスクリプトが混入します。
つまり,ブラックリスト方式では漏れなくチェックできそうにありません。実際,ブラックリスト方式を採用しているサイトでは多くの対策漏れが見つかっています。


