先日、勤め先の先輩の結婚式二次会に出席させていただく機会を得た。その先輩は、筆者が新入社員として今の勤め先に入社した際の先生役であり、これまでとてもお世話になっている。同時に「永遠の独身貴族」とも噂されていたが、このほど遂に人生の伴侶を得たということで、同先輩を慕う大勢の参加者が加わった、とても盛大な会になった。そして、そこではとても懐かしい面々と再会できた。私の同期入社の方々である。

私が今の勤め先に入社したのは折しも就職氷河期のまっただ中、2000年のことである。当時、勤め先はお台場に所在しており、通勤の足には新交通ゆりかもめを観光客やカップルの波にもまれながら使っていた。また、ガンダムが降り立つことなどいっさい想像できないような空き地だらけの風景が広がっていた。海が近かったことで、毎日のようにお昼はお弁当を買って浜辺で食べていた。同期入社の面々との再会を通じてそんな日々を過ごしていたことを久しぶりに思い出した。

「私のディケイド」に関する回想はさておき、前回の続きである。前回つまびらかにしたのは、Adobe Readerの脆弱性が発生する箇所についてであった。今回は、脆弱性を発生させるPDFファイルを分析し、その対策について考えていきたい。当該脆弱性を発現させるPDFファイルに含まれるJavaScriptを図に示す。このJavaScriptでは、シェルコード本体とHeap Sprayingテクニックを使うコードの両方が含まれている。

攻撃を発生させるPDFファイルに含まれるJavaScriptコード

このシェルコードで特徴的な点のひとつにDEPを避けるためのReturn Oriented Programming (ROP)という手法が使われていることがあげられる。ROPについては、現在の脆弱性攻撃手法を語る上での大きなトピックであるために、稿を改めて用意することで詳細に説明したい。よってここでは詳細には触れないが「新しい手口」が使われていると思っていただきたい。

Heap Sprayingについてはこのアライ出しで何度か扱っているトピックであるために、記憶されている読者の方も多いだろう。Heap Sprayingはあらかじめ大量のメモリ領域を確保し、確保した領域に大量のNOP(意味のない命令)を書き込んでおくことで攻撃の成功率を高める手段のひとつである。ブラウザの脆弱性を攻撃する攻撃コードによく用いられる手法でもある。

まとめると、このPDFファイルについては次のことがいえる。

  • Heap Sprayingとシェルコードを用意するためにJavaScriptが使われている。よって、JavaScriptを無効にすると、この攻撃が発現することはない
  • Heap Sprayingが使用されている。よって、これを無効にするような保護機構があれば、攻撃を止めることができる可能性がある

このように、ゼロディ脆弱性と言っても脆弱性の悪用法を詳細に調査することで"Workaround"すなわち回避法が見いだせることもあるのだ。

次に、後者の可能性を検討してみると、前々回に紹介したEMETの存在が浮上する。実際にEMETを使用してAcrobat Readerを保護対象にするには、EMET_conf.exeに次のようなパラメータを与えればよい。

EMET_conf.exe --add acrord32.exe

このような設定を行ったものと、行っていないものとで、Heap Sprayの影響があるかどうかを比較してみる。すると、以下の図の通りとなった。

EMETオフ

EMETオン

EMETがオフの場合には、メモリアドレス0x0c0c0c0c周辺にはシェルコードが書き込まれている。一方で、EMETをオンにし場合にはシェルコードはなく、NULLの羅列が見て取れる。このようにEMETの効果は明らかであり、攻撃コードが書き込まれるより前にメモリ領域を確保しているため、シェルコードが書き込まれてしまうことを予防してくれている。このため、EMETがオンになっているとシェルコードが実行されることなく、脆弱性の発生箇所ではNULL間接参照が発生することになり、結果としてAcrobat Readerが異常停止するはずである。

とはいえ、うまくEMETが守ってくれるとはいえ、このような分析をしなければ見た目上はただのソフトウェアクラッシュにしか見えない。そこで今回はこのような分析を行い、その効能を明らかにしてみた。