どのブラウザだとExploitコードが実行されてしまうのか確認してみる

Web サイトの改ざん事件を追っていると、「どのサイトが改ざんされた」や「どこどこのサイトに誘導される」、「どういったマルウェアに感染する」といった解説記事をよく見ます。しかし、「どうやって Exploit コードが実行される」とか、「どのブラウザだと Exploit コードが実行される」のかといった解説記事をあまり読んだことがありません(単に僕が読んだことがないだけかも)。Exploit コードの起動処理を調べるたびに、Wepawet (alpha)からサンプルを探すのも面倒なので、Wepawet からサンプルをピックアップして、それらをまとめてみます。

いつも以上にニッチなテーマなので(汗)、長々としたまとめを読みたくない場合、結論だけどうそ。

注意事項

この日記を読む際には、以下の点をご理解ください。

  • Adobe Reader脆弱性を悪用する攻撃コードのみまとめています
  • Wepawet のレポートを基に攻撃コードを作成したため、実際にインターネット上で確認された攻撃コードとは異なる可能性があります

結論

攻撃コードによっては、ブラウザおよび Adobe Reader の設定次第で Exploit コードの実行まで至らないと言えます。Internet Explorer を使用する場合、Adobe Reader の環境設定において、[インターネット] - [Web ブラウザオプション] の [PDF をブラウザに表示] を無効にすることで、Adobe Reader脆弱性に対する Exploit コードが読み込まれることを回避できる場合があります。Internet Explorer を多用する方は、この [PDF をブラウザに表示] を無効にすることをオススメします。


【2010年6月14日追記】
なお、この日記のサンプルでは Exploit コードの実行に至らなかったブラウザがありますが、このことは「このブラウザを使えば安心」ということを示唆するものではありません。ご注意ください。

この日記における動作環境

この日記では、Windows XP SP3 で動作する 5 つのブラウザ、Adobe Reader 9.3.2 で動作確認しています。ブラウザのバージョン、Adobe Reader の設定(初期設定以外のもの)については以下を参照してください。

ブラウザ バージョン
Internet Explorer 8.0.6001.18702
Mozilla Firefox 3.6.3
Opera 10.53
Safari for Winodows 5.0
Google Chrome 5.0.375.70

サンプル1

まず 1 つ目のサンプルは、「http://wepawet.cs.ucsb.edu/view.php?hash=6223f79cf6f195fc5589e50f8544bbbc&type=js」です。これは、Web Exploit の典型的なコードだと思います。このサンプルでは、脆弱なソフトウェアがインストールされているか確認した上で Exploit コードを読み込んでいます。Exploit コードを読み込んだかどうかに関わらず、1 つの脆弱性に関する処理が完了したら、次の脆弱性に関する処理にうつります。なお、Wepawet にアップロードされたファイル名(fragus.txt)から Fragus exploit pack のコードである可能性があります。

このサンプルに基づいて、以下の HTML ファイルを作成しました。この HTML ファイルをローカルネットワークの Web サーバに設置して、スクリプトを有効にした各ブラウザでこの HTML ファイルを閲覧しました。この HTML ファイルを閲覧した結果、Adobe Reader が起動するか否かを確認しました。この HTML ファイルでは、make-pdf tools で作成した警告ダイアログを起動するだけの PDF ファイルを使用しました。

なお、同じファイルをここに設置しています。自分で確認してみたい方はどうぞ。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sample 1</title>
<script>
function pdf(){
  var isInstalled = false;
  if (navigator.plugins && navigator.plugins.length){
    for (var x = 0; x < navigator.plugins.length; x ++ ){
      if (navigator.plugins[x].description.indexOf('Adobe Acrobat') !=- 1){
        isInstalled = true;
        alert("info: Adobe Acrobat plugin exist");
        break ;
      }
      if (navigator.plugins[x].description.indexOf('Adobe PDF') !=- 1){
        isInstalled = true;
        alert("info: exist Adobe PDF plugin exist");
        break ;
      }
    }
  }
  else if (window.ActiveXObject){
    var control = null;
    try {
      control = new ActiveXObject('AcroPDF.PDF');
    }
    catch (e){
    }
    if (!control){
      try {
        control = new ActiveXObject('PDF.PdfCtrl');
      }
      catch (e){
      }
    }
    if (control){
      isInstalled = true;
      alert("info: ActiveXObject instanced");
    }
  }
  if (isInstalled){
    var ua = navigator.userAgent.toLowerCase();
    if (ua.indexOf("firefox") !=- 1){
      var cnq = document.createElement('embed');
      cnq.setAttribute('src', './dummyExploit.pdf');
      cnq.setAttribute('href', './dummyExploit.pdf');
      cnq.setAttribute('type', 'application/pdf');
      cnq.setAttribute('width', 200);
      cnq.setAttribute('height', 200);
      cnq.setAttribute('style', 'display:none;');
      document.body.appendChild(cnq);

      alert("info; embed element was appended in DOM tree");
    }
    else {
      var cnq = document.createElement('iframe');
      cnq.setAttribute('src', './dummyExploit.pdf');
      cnq.setAttribute('width', 200);
      cnq.setAttribute('height', 200);
      cnq.setAttribute('style', 'display:none;');
      document.body.appendChild(cnq);

      alert("info; iframe element was appended in DOM tree");
    }
    return ;
  }
  else {
    alert("error; exploit was not executed");
  }
  return ;
}
</script>
<body>
Sample 1
<script>pdf();</script>
</body>
</html>
HTML ファイルを閲覧した結果

前述の HTML ファイルを 5 つのブラウザで閲覧した結果を以下にまとめます。

ブラウザ 結果 備考
Internet Explorer × -
Mozilla Firefox × -
Opera [開く]、[保存]等を求める確認ダイアログが起動した
Safari for Windows × Adobe Reader が起動する際にエラーが発生した
Google Chrome -
閲覧結果から分かること

Exploit コードが読み込まれていたブラウザが意外に少なかったです。すんなり Adobe Reader が起動すると思っていた Internet ExplorerMozilla Firefox では Adobe Reader が起動しませんでした。

Internet ExplorerAdobe Reader が起動しなかった点に関しては、Adobe Reader の環境設定における [インターネット] - [Web ブラウザオプション] の [PDF をブラウザに表示]の値が影響していました。この [PDF をブラウザに表示] を無効にしていると、Adobe Reader の AcitiveX オブジェクトが無効になる*1模様です。[PDF をブラウザに表示] を有効にすると、Adobe Reader で dummyExploit.pdf が開くことを確認しました。

Mozilla FirefoxAdobe Reader が起動しなかった点に関しては、HTML ファイル内の「cnq.setAttribute('style', 'display:none;');」が影響しているようです。このコードを削除すると、Firefox のスレッドとして Adobe Reader が起動することを確認しました*2W3C 勧告において、embed 要素が 未定義の要素であるため、style 属性を反映できずに Adobe Reader が起動しなかったということかな。

サンプル2

2 つ目のサンプルは、「http://wepawet.cs.ucsb.edu/view.php?hash=26dd9248f86db75afc9425b706fd85c1&t=1272216941&type=js」です。このサンプルの最初に、PDF Exploit だと思われる /grep/pdf.php を読み込むコードを確認できます。このコードでは、CLSID「CA8A9780-280D-11CF-A24D-444553540000」を object 要素として生成しています。この CLSID は Adobe ReaderActiveX コントロールAcroPDF.dll)を指しています。この object 要素を使って、Adobe Reader のバージョンが 7.1.4 未満 or 8.17 未満 or 9.3 未満であるか確認しています。その条件が真であった場合、iframe 要素を生成して、Exploit コードを読み込みます。

このサンプルに基づいて、以下の HTML ファイルを作成しました。バージョンチェックの条件式は、最新版*3でも条件が真となるように修正しています。サンプル 1 と同様に、この HTML ファイルを閲覧した結果、Adobe Reader が起動するか否かを確認しました。

なお、同じファイルをここに設置しています。自分で確認してみたい方はどうぞ。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sample 2</title>
<script>
document.write('<OBJECT id="jdf1" height="0" width="0" classid="clsid:CA8A9780-280D-11CF-A24D-444553540000"></OBJECT>');
var ver = jdf1.GetVersions();
ver = ver.split(",");
ver = ver[1].split("=");
ver = ver[1];
if ((ver < "7.1.4") || (ver < "8.1.7") || (ver < "9.4")){
  document.write('<iframe src="http://192.168.0.250/dummyExploit.pdf" width="178" height="79" frameborder="0"></iframe>');
}
</script>
<body>
Sample 2
</body>
</html>
HTML ファイルを閲覧した結果

前述の HTML ファイルを 5 つのブラウザで閲覧した結果を以下にまとめます。

ブラウザ 閲覧した結果 備考
Internet Explorer × JavaScript エラーが生じた
Mozilla Firefox × JavaScript エラーが生じた
Opera × JavaScript エラーが生じた
Safari for Windows × -
Google Chrome × -
閲覧結果から分かること

5 つのブラウザすべてで、Adobe Reader が起動しませんでした。

この HTML ファイルでは、object 要素の classid 属性において、clsid スキーム(clsid; の部分)を使用しています。HTML 4.01 に関する W3C 勧告を見てみると、clsid スキームでは ActiveX アプレットを使うよう記述しています("may use" と表現しているため、必須ではないと思いますが)。この classid 属性の設定から、ActiveX に対応していないブラウザ(Internet Explorer 以外)は、Exploit コードの読み込みに至らなかったと考えます。

Internet Explorer については、サンプル 1 と同様に、Adobe Reader の環境設定における [インターネット] - [Web ブラウザオプション] の [PDF をブラウザに表示]の値が影響していました。[PDF をブラウザに表示] を有効にすると、iframe 要素で Adobe Reader が起動することを確認しました。[PDF をブラウザに表示] を無効にして不自由がなければ、[PDF をブラウザに表示] を無効にした方がよいと考えます。

2 つのサンプルから思うこと

Web サイトの改ざん事件があると、あたかもその Web サイトを閲覧する全員がマルウェアに感染するかのような解説記事を見かけますが、この日記で確認したように必ずしも Exploit コードが読み込まれるわけではないです(その結果、マルウェア感染にも至らない)。Web サイト改ざんの影響範囲をきちんと理解するために、「どうやって Exploit コードが実行されるのか」という点に目を向けることも必要だと感じます。

*1:実際にどのように無効にしているか分かりません

*2:Process Explorerfirefox.exe の [Threads] プロパティにて確認しました

*3:この日記を書いている時点では、9.3.2 です