ブログサービスの XSS 脆弱性対策はいらない−のか?

発端

徳保さんはHTMLやCSSを初心者に教えていらっしゃるのですから…

HTMLやCSSを自サイトで初心者に教えていらっしゃる徳保さんが、よもやこのようなことを仰るとは思いませんでした。影響力が大きい徳保さんだけに憂いを感じます。

ブログは自由な個人の情報の発信基地

XSSは誰がブログに記事を書いたのかをわからなくします。はまちちゃんが被害者の日記に好き勝手に書いていることからも自明です。XSSを許容するブログでは(特定の種類ですが)、個人の識別を破壊されるでしょう。

誰だって。自分名義の日記に他人が土足で入ってきて、さも自分の顔をして記事を書かれたらすごく嫌な思いをすることでしょう。

便所のラクガキじゃないのですから、俺やアタイというアイデンティティーが識別できないようならば、ブログは死にます。RSSも死にます。パブリックなブックマークも死にます。コミュニティーも死にます。アンテナも死にます。アイデンティティー崩壊後に誰が狂乱錯綜の情報の渦を楽しめますか?

HTTPはステートレス、だからこそセッション管理が必要

HTTPはそもそもブラウザとサーバとの固定的なつながりがありません。回線を圧迫しないためです。これはHTTPがステートレスであるひとつの表れです。つながりがないので、【個の識別】の必要があれば、おのずとセッション管理が必要になってきます。

しかしながらXSSはセッション管理を容易に打破します。(管理画面や編集画面のドメインが日記ブログ表示画面のドメインと別な場合にはあてはまりませんが、この場合には別の深刻な危険性もありますので後述します)

銀行のサイトにXSSがあればセッション管理が不能ですから【個の識別】は出来ず、まともな取引は出来なくなること、徳保さんもお解かりかと思います。

はてなのようにポイント発行している場合のブログでは「お金が絡みますから」【個の識別】は絶対不可欠です。また、お金がかからないユーザであっても、自分の発信した情報が好き放題に変更されたらとっても嫌でしょうね。

XSS放置はセッション管理を突破し個の識別を破壊しますので、自由な個人同士の、まっとうなコミュニケーションを阻害してしまいます。

XSSがあるかJavaScript使用が好き放題ならDOMを通じてHTMLを好き放題に動的に変更できる

管理画面や編集画面のドメインが日記ブログ表示画面のドメインと別な場合について考察します。先程後述するとお約束したものです。この場合には、悪人が自分のブログに好き放題にJavaScriptを記述可能であるところが最大のネックになります。この弱点は意外と一般には認識されていないのかもしれませんね。

大部分のブログサービスでは、ユーザに好き放題のHTMLの要素記述を許していません。理由は明らかだと思います。IEなどの特定のブラウザの脆弱性が判明した時に、その脆弱性を突いたトラップをブログで仕込まれると、訪問者はタチドコロに罠にかかります。ですから、例えば、はてなダイアリーではobject要素は禁止です。object要素を通じて過去にウイルスやらフィッシングネタやらスパイウェアの仕込みが行われていることも、徳保さんならおわかりだと思います。

object要素ばかりではありませんが、可能な限り無害と思われる要素の記述のみを許すのが信頼されるブログサービスなのです。

ところが、せっかくHTMLの各要素に関して規制をかけても、JavaScriptに規制がかからなければ、DOMを通じていくらでも動的に要素を生成可能です。であればどんな罠でも作成可能です。昨日新しい脆弱性が発見されれば今日にも新しい罠ページが作られる時代です。ブログサービスで適当な注目を浴びそうな文章とタイトルとネタでページを作っておいて実は罠。ブログサービスは注目リンクや最新リンク、お友達リンク、なんであれみんなに紹介しまくります。そうであれば少なからぬユーザが気をひかれて訪問することでしょう。そしてやがて…

『なんだよ、あそこのブログサービスってよ、行っても罠だらけなんじゃね?』

そうなったらおしまいなんです、そのサービスは。

ブログサービスは横のつながりを強く意識しています。売りです。はてなで言えばキーワードやらトラックバックやブックマークやアンテナやRSSなど、いつでもおいでリンクでつながっています。行った先に罠が待ち構えていれば、それはアウトです。大通りでかっぱらいにあうようなものです。そんな治安の悪いところには人間、近づきたくもありません。

この世界が仮に、徳保さんのブログみたいに、正体のわかる独自ドメインを持っているブログばかりなら、JavaScriptを切ってから新しい遊び場に訪問しにいくのは悪いことではありません。しかしブログサービスではそのようなことは夢物語です。

技術で遊びたい試したい精神

徳保さんには以前、角を丸くするスタイルシートの件でこちらにコメントを頂きました。

その折に感じたことですので誤解があったら申し訳ないのですけれど。角を丸く出来るのなら多少HTMLの精神に反していても自由な装飾は許されてもいいのではないのか?というのが徳保さんのお考えであったかと思います。いえ、私は機械的DTDのみを気にしてValidなら許容範囲ではないか?というレベルで言っているのではありません。htmllintで100点とっても不思議マークアップは存在すると思います。w3cのvalidatorはDTD機械的に準拠していますから、たとえば、p要素の直下にobject要素があって、その下に再びp要素があっても、DTD的にはOKなんですよね?でもHTMLの精神で行けば、object要素は埋め込みリンクであって、いわば外部参照可能、その代替としてp要素の記述を許すのが仕様から読み取れることがらだったかと思います。換言すれば、object要素直下のp要素は、外部参照の補記にすぎず、object要素を含むp要素とは無関係です。遠足のお弁当の話を最近あちこちで読みましたが、本来ひとつながりのものを、object要素直下の外部参照の代替のp要素まで動員して語るなど、おかしいはずです。内側と外側が異なるからこそDTDでは許していますのに。ちょっと例示が悪いと思いますが、要はDTD機械的に判定OKでも駄目なものは駄目なんですよねぇ。

HTMLの精神を侵犯してまでも、機械的にvalidならば、角を丸くする汎用手順、ニフティーコーナーズを許容する、という徳保さんのお考えに私は同意しません。ただ単にCSSで遊びたい、楽しみたいだけなのではないかと思うからです。なんで余計なマークアップをスタイルのためだけに追加してやらなくてはいけないのでしょう。もともとある、論理的構造を補うためのdiv要素などを利用するのは構わないとは思いますけれど…それにユーザースタイルシートの利用者に迷惑がかかる場合もありえると思っていますし…CSSで遊びたいだけなのかなぁと…

同じ印象を、今回のご発言のブログサービスの XSS 脆弱性対策はいらないという御意見にも感じました。JavaScriptを使わせないブログなんてつまらんじゃないかという単純な御意見に見えました。技術的に面白いネタならどんどん使いたい使わせたい、公益についてはあんまり考えていない、そのような御意見に感じました。

参考文献

ブログサービスの XSS 脆弱性対策はいらない−のか?::葉っぱ日記(hasegawayosukeさん)
hoshikuzuは長谷川さんの感じている懸念が痛いほどによくわかります。小心者仲間。(失礼しました)
ブログサービスの XSS 脆弱性対策はいらない::備忘録2006-02-05::趣味のWebデザインの追記部分
追記された部分では、ブログサービスにおけるJavaScriptの許容の視点があります。この視点は訪問者=閲覧者の視点ではなく、製作者の視点となっています。すなわち、徳保さんの、製作者がJavaScriptを使えることが優先であるという思想がハッキリしたようです。…ブログサービスの健全な発展において、初心者が安心して巡回できることは必須ですけれど、そうでないようなブログサービスを擁護しています。HTMLやCSSを初心者に御指導されているのですからもっと現実的な公益性について考えていただければと思います。製作者サイドの技術的趣味の満足が優先であって訪問者の益については守らなくて良いというお考え、問題だと思います。…罠ページというと、程度の低いブラクラしかないように御主張なさっているかのように読める文章なのですけれども…ミスリードでしょう。ブラウザの脆弱性があればそれに対応したHTMLをDOM上で組み上げることはいとも簡単です。結果として閲覧者のブラウザを通じて、パソコンの管理者権限を盗られるか、データ破壊されるか、個人情報が無差別にネットワークに流れるか、そんなこともありますので。本来ならばこういった危険性について無自覚でいる多数の訪問者=ユーザを守らなければなりません。製作者サイドの需要は、その次の課題です。需要についての優先順位を履き違えていると思われます。徳保さんの文章を以下に引用させて頂きます。
100%の安全は「必須」ですか?

fc2 ブログでは任意のスクリプトが使えます。したがって fc2 ブログでは「極悪スクリプト」を貼ることができます。けれども、閲覧者が fc2 ブログで被害にあったとき、script 要素を許可している fc2 が悪いと思う人より、ブラクラを仕掛けたユーザが悪いと考える人が多いでしょう。iswebgeocities や cool でもそうだったように。

致命的問題は防ぐ必要があると思います。では、死守するべき領域はどこまでか。パスワードの入力を求めることで、個人情報管理・退会処理・ポイント操作は保護されています。プライベートモード閲覧とコメント記入もパスワード再入力でよさそう。一方、記事編集のたびにパスワードを打つのは面倒なので、これは編集画面の別ドメイン化で権限を保護します(注:fc2 ブログはパスワード式)。これで十分だと私は思う。

ブログサービスは横のつながりを強く意識しています。はてなで言えばキーワードやらトラックバックやブックマークやアンテナやRSSなど、いつでもおいでリンクでつながっています。行った先に罠が待ち構えていれば、それはアウトです。大通りでかっぱらいにあうようなものです。そんな治安の悪いところには人間、近づきたくもありません。

では fc2 は「危険」という理由で忌避されていますか? 有害ブログの出現を許すシステムであっても、取締りが追いつく限り、大多数のユーザが満足するレベルの治安は守られます。

大きな需要があるなら、妥協も考慮すべきです。テーブルレイアウト(崩れない段組)や object 要素のヘンな活用法(p 要素の中にリスト)も有条件で認めます。Nifty_Corners だって、どうしても使いたい人は使えばよい。サイドバーの折り畳みも、ブログペットの記事投稿も、「安全のためなら無視していい」需要だとは思いません。

Cookie 漏えいによるなりすましは生じないため、対応はしない

この判断に、私は賛同します。はてなの場合、単にスクリプトの制限を外すだけではまずい。しかし、いくつかの仕組みを変更すれば、なりすましの回避とスクリプトの利用許可は両立できるはずなのです。

グループ名のXSS 脆弱性について::はてなRSS日記 より発表

はてなRSSXSS脆弱性があり、現在修正済みとのこと

脆弱性はHamachiya氏が探していたが攻撃不可能と考え一時撤退した旨日記に書いていたもの。だが実際には攻撃可能であった模様です。なお、興味本位でHamachiya氏の日記を拝みにいくことは危険ですからおやめ下さい。

はてなRSSで使用しているグループ名の表示の際に任意のスクリプトを実行できる脆弱性が発見されましたので、先ほど修正を行いました。

Hamachiya氏によれば以下のような説明です。※Hamachiya氏の日記を見に行かないで下さい。見に行かせないでください。安易にブックマークしないでください。罠への誘引となります。

べんり機能があるんだけど (グループのところだよ)

 → http://r.hatena.ne.jp/危険なのでカット by hoshikuzu/

ここはあまりにも制約がきつすぎてあきらめました><

  • グループ名がはてなRSSJavascript部に展開される時にクォート類がバックスラッシュでエスケープされる (これは当然だけど…)
  • ひとつのグループに65文字 (これは複数つかえばなんとか)
  • スラッシュ、ドット、クエスチョンが使えない (これがきつい)

特にスラッシュが封じられてるのがどうしようもなくてぼくは投げちゃいました!
</script><script src=xx>とか、後ろをコメントアウトとかできれば簡単なんだけど…!

try catch使うとか後ろをregexpに見立ててしまうとか、色々ためしてみたものの、ぼくには無理だったので、だれか腕に自信のある人は、alert表示とかできるかやってみてね!

まず手始めに「\');」って名前のグループを作るところからはじめるといいですよ!

はてなのシステムが生成するjavascript記述領域にユーザ出力が混入されていてしかもスクリプトのインサーション対処が不完全だった模様。ステートメントをいったん終わらせて別のものを開始する手法であると思われます。同種のものが昔、Microsoft社のサイトにもありました。私ではありませんが同社に通報なさった人がいてことなきを得たことがあります。

中村屋(Flash)

お口直しに笑いでも。君のためだったら死ねる。