クロスサイトスクリプティング

昨日8日に「今までで最も「特定の話題に関するリンク集」がほしいと感じました。」と書いたのですが、そのものすばりのページがありました。

一応確認したつもりだったのですが、私は何を見ていたのでしょうか。

これだけでは何なので、今回の記事とも直接関係しませんし、将棋からも離れてしまいますが、ウェブセキュリティについて具体的なことを少し書いてみようかと。セキュリティについて多少調べたことのある方にとっては常識的なことですが、将棋関係ではあまり知られていない話だと思うので。

このページで利用しているはてなダイアリーではHTMLタグが利用できますが、JavaScriptは利用できないようになっています。例えば「<script>」と書くと、<が&lt;に、>が&gt;に変換され、HTMLソースがそのまま見えてしまう結果となります。JavaScriptを使う方法はこのほかにもたくさんありますが、どのように記述してもJavaScriptが使えてしまうことはありません。(もし使えてしまえたら、それは想定外の事態なのではてなに報告して下さい。感謝されるはずです。)

なぜJavaScriptを禁止しているのかというと、それははてなのユーザ認証と関係があります。はてなではユーザ認証にクッキーを利用しており、クッキーが保持されている限りログイン状態が保たれます。ということは、仮に他のはてなユーザのクッキーを盗むことができれば、その人になりすまして勝手に日記を書いたり勝手に質問したり勝手にポイントを送金したりすることが可能になります。あってはならないことです。

JavaScriptにはクッキーを扱う機能があります。仮にはてなダイアリーJavaScriptが利用可能だったとしましょう。すると、悪者は次のようにして他人のクッキーを盗むことができます。

  1. まず悪者は自分のはてなダイアリーを開設し、他のはてなユーザを呼び込みます。
  2. そのはてなダイアリーには、罠のJavaScriptが記述されています。そのJavaScriptはクッキーを悪者の利用する別のサーバに送信してしまいます。
  3. 送信されたクッキーをコピーして、そのクッキーをセットしてはてなにアクセスすればユーザ権限を奪取できることになります。

この方法が怖いのは技術力がほとんど不要なことです。ウェブセキュリティを脅かすのは「ハッカー」の仕業というような俗説がありますが、現実には高度な技術力とはあまり関係ない世界です。(念のため書いておくと、これを実行したら不正アクセスになると思います。違法行為ですので、もし可能だとしても決して実行してはいけません。)

このシナリオを回避するには、JavaScriptそのものを禁止するのではなく、JavaScriptのクッキーを利用する部分だけを禁止すればいいのではないかと思われるかもしれません。しかし、技術的にクッキーを利用する部分だけ禁止というのはほとんど不可能です。JavaScriptが利用できないのは不便ですが、はてなダイアリーを利用する限りはどうしようもありません。

このような形でアカウントの乗っ取りが可能になってしまう脆弱性は一般にクロスサイトスクリプティング脆弱性XSS脆弱性)と名付けられています。ここで紹介したようなJavaScriptやクッキーに関係するものだけではなく、様々な形態の脆弱性が様々なサイトで報告されています。ポータルサイトのように非常に多くの人が利用するサイトや、オンラインバンキングのように金銭に直接関わるサイトも例外ではありません。

そんな中ではてなXSS対策をしっかり行っている稀有な存在です。その内容は、キーワード「はてなダイアリーXSS対策」やhoshikuzu|stardustの書斎の過去ログなどで確認することができます。

上のページをご覧になった方は、どうしてこのように複雑な対策が必要なのかといぶかしく感じられたかもしれません。これはHTMLでJavaScriptを利用する手段が多岐に渡っていることが原因です。JavaScriptを使うにはscriptタグを利用するのが最も一般的な方法ですが、他にもリンク中にjavascript:で始まるURIを記述するとか、イベントハンドラを利用するなど多種多様な方法があり、一つ一つつぶしていったのでは対策漏れが起こりがちです。具体的にどうすればいいかは、http://www.ipa.go.jp/security/awareness/vendor/programming/a01_02.htmlなど、検索すれば有用なページが多数見つかると思いますので、そちらを参照して下さい。

クロスサイトスクリプティングの危険性は4年ほど前から危険性が認識されはじめ、2,3年からは多くのサイトの欠陥が指摘され続けてきましたが、現在でもこの脆弱性を抱えたまま運用されているサイトが数多く残されているのが現状です。セキュリティを重視する機運は年々高まっているものの、本当に安全になる見通しは全く立ちません。

ユーザ側でできるせめてもの対策は、ブラウザのセキュリティ設定を厳しくしておくことです。それでも完全ではありませんが、しないよりはずっとましでしょう。セキュリティ設定をゆるめないと閲覧できないページも数多くありますが、そんなページは見ないという決断もときには必要かもしれません。

それでは、もしあるサイトの脆弱性を偶然発見してしまったらどうすればいいのでしょうか*1。サイト管理者のセキュリティに関する認識が甘く、報告してもまともに取り合ってもらえない場合にはどうすればいいのか。自分がそのサイトから離れて知らんぷりするしかないのか。困ったことに、これは未だに解決されていない問題です。解決されていれば、今回のような事態も起きなかったことでしょう。*2

セキュリティは人間の問題です。本当に。

*1:偶然発見することがあるのかと疑問に思われる方もいらっしゃるかもしれません。例えばhttp://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/diary/200401.htmlの1月8日付を参照していただくと、理解していただけると思います。

*2:個人情報漏洩を指摘された側が何も行動を起こさないということは珍しくないそうですが、今回のケースには当てはまりません。それでも、定まった手順があれば今回のようなことにはならなかったはずです。蛇足ですが、念のため。