チャットの脆弱性について

チャットリンク集『Shelle』 > コラム『チャットの脆弱性について』

 CGI・PHPの『チャットスクリプト(プログラム)』を自分で設置する・している人へ向けて。
 CGIチャット設置時のセキュリティについてのミニコラムです。
 Perl、PHP等を触る以上、HTML等の知識は有している、と前提で話を進めますが、なるべくわかりやすく書いているつもりです。

貴方の設置してるチャット(CGI, PHP)に脆弱性はないか?

 今回のコラムは、『チャット等自分以外も利用するスクリプトを設置するならば危機意識を持とう』がテーマです。
 善意ある利用者に利用方法を説けば受け入れられるでしょうが、悪意のある利用者には通じません。ならば、スクリプト側で対応するしかありません。
  ――ほとんど『(Wikipediaで言う所の)クロスサイトスクリプティング(Cross Site Scripting=XSS))』の脆弱性対策について話してるに過ぎないコラムです。
  雑誌で取り上げられているXSSの事例が『データベース』に関連する事が多いのもありますが、『掲示板・チャット等でHTMLタグやJavaScript,スタイルシートが使える』のもクロスサイトスクリプティングと呼ぶようです。
 『IT用語辞典 e-Words - XSS[クロスサイトスクリプティング=Cross Site Scripting]とは』
 http://e-words.jp/w/XSS.htmlを参照してください。
 「レンタルチャットだから絶対安全だ」、という物でもありません。レンタルチャットでも作りの甘いチャットは存在します。

目次

 今回は、以下の項目についてを考えます。

『安全なチャットスクリプトかどうか』

 安全なチャットスクリプトとは何でしょうか?

 といった辺りでしょうか。『タグ(+CSS)が(制限無く)使えるチャットは危険だ』といえます。
 『チャットの発言欄で発言してもタグが使えない。だから安全だ』とは、言えません。
 メールアドレス入力欄があるチャットであれば、メールアドレス入力欄に入力された値をチェックしなければなりません。
 『test@test.com』とメールアドレス入力欄に入っていれば結果、「<a href="mailto:test@test.com">Mailaddress</a>」となれば問題ない物を、
 『test@test.com" style="font-size: 50px;』と入力されて結果、「<a href="mailto:test@test.com" style="font-size: 50px;">Mailaddress</a>」となってしまえば……どうなるかわかりましたね?

Mailaddress ←通常の例。正常です。

Mailaddress ←font-size:50px;に指定されてしまった方。

 このように、『フォントサイズを大きくされたり』、『JavaScriptでウィルスコードの埋め込まれたページにジャンプさせてしまう』ことだって、不可能ではなくなるのです。
 タグが利用可能であると、他には、<img src="http://test.com/cgi.cgi">といった感じに、ウィルスコードの入ったサイトを画像URLとして表示させる、などもされない事はありません。
 『HTMLタグが利用可能なチャットは危険』である、と理解していただけたでしょうか?

ありがち?な脆弱性例とその対策例

 大切な処理、見落としていませんか?

XHTML仕様にそってCSSで色指定しているチャット

 あまり無いとは思いますが、『XHTML使って仕様に沿ってCSS使って文字色装飾してる』チャットで、文字色指定がフォームから渡される場合も危険です。
span style="color: (色名);"といった形式になるかと思いますが、  色指定のvalue値に『#000000』や『Black』といった色RGB値・色名の指定が考えられますが、ここで『;font-size:50px』と指定されていたら、という問題ですね。「色指定のvalue値に『;』が含まれていれば削除する、という仕様」でも良いでしょうし、「色指定のvalue値を6文字に制限してRGB値だけを採用する仕様」にするのも手です。考えて作られてなければ、利用者に危険が及ぶチャットになってしまうのです。
 ちなみに、色名指定で一番長いのは『Lightgoldenrodyellow(20Bytes)』です。無精して『色指定は20Bytesまでなら何でもOK』とかすると痛い目に合うかもしれません。

アイコンチャットで画像ファイル名でアイコンを変更するタイプのチャット

 『アイコンチャットであれば、アイコン指定のselect value値が数値で、「画像ファイル名」ではないチャット。』は安全だ、と書きましたが、その理由は、下記の例を考えてみてください。
http://shelle.galle.jp.net/chatlinks/chaticon/というフォルダURL+アイコン名でアイコンファイルが呼び出されるとしましょう。
ここで『icon_00.jpg』が呼び出される指定であれば『http://shelle.galle.jp.net/chatlinks/chaticon/icon_00.jpg』が呼び出されます。
そこで『../icon_00.jpg』が呼び出される指定であれば『http://shelle.galle.jp.net/chatlinks/icon_00.jpg』が呼び出されてしまいます。
ここで、『../../format.exe』という悪意のあるプログラムが実行されてしまえば、どうなるでしょう? という事ですね。危険なのです。
対策としては、アイコンのvalue値をチェックし、『..』が含まれていれば削除(置換)してやる等が考えられます。
 →[Wikipedia]ディレクトリ・トラバーサルの脆弱性です。

『HTMLタグが使えるチャットが良いの!』という人へ

 といった感じの対策を取る事で安全なチャットにすることができます。

安全なチャットスクリプトは? 危険なチャットスクリプトは?

 がる・ザ・ジョーカーが確認した物を挙げておきます。

比較的安全なチャットスクリプト

危険なチャットスクリプト

対策案の色々(プログラミングができない人向け)

 Perl/PHPなどを自分で書き換える事のできない人は、『スクリプト面を見直さずに対策できないものか』と思ったかもしれません。
 では、『外部からの見直し』について考えてみましょう。
 ゆいちゃっとやIcon Chat/Light Chatのように『method="get"』でも投稿できてしまうスクリプトに対しては、『リファラー(REFERER・リンク元・参照元)URLをチェックしてやれば対策に』なります。
 以下、有効かもしれないPerlライブラリを紹介します。

 上に何度書いている『GET投稿できる』のはXSRF(Cross Site Request Forgeries)の脆弱性を孕んでいます。JavaScriptによるPOST投稿であってもXSRFの脆弱性を突かれる事は有り得ますが……。
 掲示板ではXSRFの脆弱性を制限するが、チャットのようにリアルタイム・流動的な物の場合、発言の度にCaptchaや認証等を設けるのは難しい・機能性に問題を生じさせる事になるので、入室時にトークン等を記録してチャット参加者を管理する手法を取るのが良いだろう。ほとんどの配布Webチャットでは採用されていないが、それが理想である。
 [Wikipedia]クロスサイトリクエストフォージェリ開発者のための正しいCSRF対策などを参照すると良い。


 Whocares?(フーケアーズ)、かにチャット(kanichat.com)といったレンタルチャットは問題無いかもしれませんが。
アイコンチャット『ElDorado Chat-PHP』Perl/CGI
http://shelle.galle.jp.net/chatlinks/ シール.サクラ.エヌイー.ジェイピー/チャットリンクス
Copyright © 2007- Shecqesia Ellelunphoece, Galle[the Joker]. All rights reserved.
Author&MailAddress: がる・ザ・ジョーカー <******@nifty.com>
WebSite since: January 01st, 2007 (Mon.) / This page created: January 01st, 2007 (Mon.)