ニュース
web

Webのセキュリティ努力のゴールにあるのは「絶望」のみ

次の記事

またまた出ましたChrome OSのスクリーンショット, 今度のはアイコンがでっかい

sleeping-policeman

現代人は、Web上に平気で個人的な情報や仕事上の重要データを置くようになっている。人に見せたくない写真、人に知られたくないソーシャルグラフ、財務データ、仕事の重要文書などなど、なんでも置いてしまう。お気に入りのサービスを毎日のように使って使い慣れてくると、情報をそれらのサイトに置くことも平気になってくる。でも、実際には、Webは昔に比べてますます危険な場所になりつつある。無防備なサイトが増えているから、攻撃の感染拡大もやりやすくなっている。またユーザに関しては、自分が危険な目にあったこと/あっていることを全然自覚しないユーザが最近はとても多い。

Webの初期には、セキュリティ対策といえば、サーバにたえずパッチをあてて最新バージョンに保つ、ベンダからの忠告や勧告に従う、フィルタやファイアウォールでよくあるタイプの攻撃を防ぐ、といったものだった。だいたいこれらのシンプルな処理の99%が、デベロッパやアドミニストレータが書いたスクリプトによって自動化されていた。しかし数年前に登場したセキュリティの新しい脅威は、Webアプリケーションのコードの不注意による欠陥を突いて大量のユーザデータを盗むものが多い。そういう新しい種類の脆弱性は、攻撃のベクターそのものも、そのために特別に作ったWebアプリケーションの中にあることが多く、たとえばWebの各種のFORMにJavaScriptの呼び出しを渡し、それを何も知らぬユーザが(というかそのユーザのブラウザが)が実行するといったものが典型的だ…このタイプの攻撃はクロスサイトスクリプティング(Cross-Site Scripting, XSS)と呼ばれ、単純にWebサイトを表示するというユーザ(犠牲者)のブラウザのごく当たり前の機能を利用して、その100%善人であるブラウザに、結果的に悪意あるコードを実行させてしまうのだ。

クロスサイトスクリプティングやその親戚であるクロスサイトリクエスト偽造(Cross-Site Request Forgery, XSRF)は、かつてはワーム(worm,虫)SammyとしてMySpaceをダウンさせ、韓国のオークションサイトから1800万人のユーザデータを盗みGmailの弱点を利用してドメインオーナーを恐喝し、あるいはユーザ自身のブロードバンドルータの設定を変えて目標の攻撃に利用した。これらは、どの場合も、ユーザは何も知らずにふつうの(ふつうに見える)リンクをクリックしたり、メールを開いたりしただけである(画像のimgタグ中に犯行コードが隠されていることもある)。あるいはまた、毎日なにごともなく訪れている安全なサイトのページに、ある日悪者コードが書かれていた、ということもある。どれもこれも、リンクをクリックしたり、ページを訪れたりするユーザ自身が何も知らない間に、それらのコードが実行されてしまう。

各種の調査データによると、過去2年間のセキュリティ被害の80%はXSSまたはXSRFによるものである。また、Webサイトの70%以上はXSSまたはXSRFに対して無防備、というデータもある。これらの攻撃の原理ややり方を知っている人(たとえばWebアプリケーションのどこかに'alert('y0');'などのコードを書いて実行させるといった「無防備性テスト」ができる人)なら、現実にほとんどのサイトが無防備であることを知っているだろう。

XSRFやXSSという問題が今とくに複雑化している理由は、デベロッパがまだそれらをよく理解していないからだけではなく、最先端のWebアプリケーションやブラウザがそれらにやられるときの手口が、まだ十分に解明されていないからでもある。それどころか、新しい手口が次々と見つかっている。アプリケーションのデベロッパは数年前に見つかった単純なベクター対策としてのコードの掃除(入力テキストを…PHPの…addslashes()でエスケープするとか)を熱心にやっているが、しかし今セキュリティの専門家たちが目にしているのは、ユーザとWebサイトとブラウザとのあいだの、ふつうの信頼関係に黙ってつけ込む手口だ。そういう新しい手口は毎日のように見つかっているが、Webアプリケーションのセキュリティに関するこれまでの考え方の外にあるから、比較的自由に好き放題に犯行ができるのだ。

たとえば今日、Ajaxiandalmaerが教えてくれた記事には、最近見つかったXSS/XSRFの新しい手口として、ブラウザにHTTPをHTTPでないサーバに送らせ、返ってくるそのコードのリスポンスを解釈させ、実行させる、というやり方が紹介されている(ぼくのこんな短い文を読むよりは、元のこの優れた説明を、アプリケーションのデベロッパ全員が読むべきだ)。このように、日常的な信頼関係につけ込んでユーザをだます新手(あらて)のやり口に、数週間に一回は出会ってる気がする。

こういう攻撃が困るのは、ユーザとサーバとのあいだの信頼関係という、Webの根幹につけ込んでいることだ。だからセキュリティ対策としては、データはほとんどの場合に安全という従来の一般的な通念を捨てること、Web上のデータ伝送の方法を根本的に考え直すことが必要になる。また、この種の攻撃は、ユーザが気づかないうちに行われるし、ふつうのユーザはブラウザが悪いことをする(させられる)とは夢にも思っていないから、攻撃が最後まで成功してもユーザの認知と報告がまったく生じない。ユーザは、昨日と同じく今日も無事平和だった、としか思っていない。ユーザからの報告がないことに加えて、悪党たちは自分が編み出した手口をTwitterなどでうっかり公表したり共有化したりはしないから、デベロッパやセキュリティ担当者たちが毎日神経をとがらせていなければならない。

新しいWebアプリケーションのベアボーンテスト(本体のみのランテスト)や、自分が使うWebアプリケーションのセキュリティ表明リストの網羅的な監視を、何度もやった経験から言うと、今のWebアプリケーションのデベロッパたちは過去1年以内に‘発明’された新しい手口については完全に無知だ。また、ブラウザの制作者たちも、この新しい厄介な問題にまだ正面から取り組んでいないから、さらに状況は悪いと言える。彼らが、前進どころか後退している場合すらある(最新のIE8は異なるポート間のXmlHttpRequestができる)。だから現状は、まったくおそろしいとしか言えない。対策としては、教育と、そして、犯罪の最先端のテクニックにつねに敏感に気をつけていること、これしかない。

アップデート: この記事には皮肉なおまけがある。ご覧のようにこの記事中にはJavaScriptの現物コード(XSSをテストするためのもの)があるが、それがこのブログを動かしているCMS〔WordPress〕を通ってしまい、記事をプレビューしたり公開するたびに実行されてしまうのだった!。〔訳注: この訳稿ではHTMLエンコードしてある。〕

[原文へ]

(翻訳:iwatani(a.k.a. hiwa))