昨年のBlack Hat Briefingsでは、WhiteHat SecurityのJeremiah Grossman氏が「外部からイントラネット内のWebサイトをハッキング (Hacking Intranet Websites form the Outside)」というタイトルの講演を行った。一般的に安全と思われているイントラネット内の環境であっても、XSS (Cross-site Scripting)攻撃が仕掛けられたWebサイトにアクセスするだけで外部からアクセスされてしまう可能性を指摘した。今年のBriefingsでも同氏は同じテーマを取り上げた。ただし「JavaScriptマルウエアを使わなくても……(Fun With and Without JavaScript Malware)」という副題がついている。

WhiteHat SecurityのJeremiah Grossman氏(左)とSecTheory CEOのRobert Hansen氏(右) CSRF/ XSS攻撃の歴史

昨年の講演で紹介された手法を簡単に説明すると、まずXSSの脆弱性のあるWebサイトを訪れた人(イントラネット内からという設定)にJavaScriptマルウエアを実行させ、(1)ブラウザの履歴を盗み、ターゲットのWeb利用の傾向や過去にログインしたサイトの記録、ブラウザの情報などを収集、(2)次にJavaアプレットを用いてプライべートアドレスを取得し、さらにターゲットのWebブラウザから、(3)JavaScriptを使ってポートスキャンを実施し、イントラネット内でプライベートアドレスが割り当てられたマシンのIPアドレスを特定する。これで攻撃に必要な情報が揃う。

上記の手法はターゲットのWebブラウザがJavaScriptを実行できるのが前提であり、昨年の講演ではJavaScriptを無効にするのがユーザー側の対策として挙げられた。今年の講演は副題の通り、JavaScriptを使わずに同様の攻撃を実現するという。以下は、その手法だ。

(1)の履歴の取得ではCSSのpseudo-classeとdisplay classを利用し、リンクに条件ロジックを作成する。訪問済みのリンクの場合、CSSがバックグラウンド画像をロードするように設定され、画像のURLに組み込まれたスクリプトを通じて訪問したリンクのデータが攻撃者に返される。リンクが未訪問の場合は何も起こらない。

JavaScriptを無効にしても、前回同様にアクセス履歴が盗み取られた

(2)のプライベートアドレスについては、RFC1918準拠のアドレスであるケースがほとんどであり、一般的なネットブロックで連続するクラスCアドレスをスキャンするだけならば短時間で完了する。

(3)のポートスキャニングは、SCRIPT SRCをイントラネット内部のIPアドレスにリクエストし、Webサーバの反応(エラー有無)で判断していた。JavaScriptを用いない方法では、LINKタグによってHTTPリクエストが完了するまで構造分析が行われなくなる点を利用し、さらにIMGタグを用いてWebページのロード時間を確認するタイマーと攻撃者へのデータ転送を可能にする。特定のIPアドレスをロードし、その時間が短ければホストが存在すると判断される。

後ろ向きではソリューションに非ず

JavaScriptを使わずにイントラネット内への攻撃が可能だとしても、ほとんどのWebブラウザ利用者がJavaScriptを有効にしているのが現状であり、攻撃を受けるリスクがグンと高まるわけではない。今回の講演の狙いは、むしろXSS攻撃への対策促進にある。

前回の講演でJavaScript無効をソリューションの1つとして挙げたことで、「それでいいじゃないか……」という反応が目立ったそうだ。だが、リッチな体験が追求される今日のWebにおいて、JavaScript無効は現実的なソリューションではない。安心感は、むしろ危険である。

そこでWebサイト側のXSS対策の徹底、そしてWebブラウザのセキュリティの根本的な見直しを求めるために、あえて"Web 0.9時代のテクニック"と呼べるような方法を用いて、前回のソリューションを潰した。残されたのは、全てのWebブラウザ利用者がリスクに晒されているという厳しい現実だ。