徹底検証:Javaのネイティブレイヤに存在する脆弱性利用、2013年以降増加を確認

2013年に入り、Javaに存在する脆弱性が攻撃者により多用される事例を多く確認しています。そして、2013年8月下旬、複数のセキュリティ関係者により Java のネイティブレイヤに存在する脆弱性「CVE-2013-2465」および「CVE-2013-2471」を利用するエクスプロイトコードが明らかにされました。トレンドマイクロは、こうした Java のネイティブレイヤを狙うエクスプロイトコードが2013年に入り頻繁に確認されていることから、こうしたエクスプロイトコードについてより詳しく調査することにしました。また、2013年のセキュリティカンファレンス「CanSecWest」でのハッキングコンテスト「Pwn2Own」で、Joshua Drake 氏は、Windows 8 上で動作する Java 7 で利用可能な脆弱性「CVE-2013-1491」を指摘しました。さらに脆弱性「CVE-2013-1493」は、「Blackhole Exploit Kit」といったエクスプロイトキットに頻繁に利用される脆弱性となります。

こうしたエクスプロイトコードがなぜ一般的に攻撃に利用されているのでしょうか。それを知るためには、まず Java の構造を理解することが役に立ちます。Java を狙うエクスプロイトコードは、Java のレイヤに存在する脆弱性を利用するエクスプロイトコードと、Java のネイティブレイヤに存在する脆弱性を利用するエクスプロイトコードの 2つの種類に分けることができます。

図1:Java のセキュリティモデル
図1:Java のセキュリティモデル

図1 は、Java のセキュリティモデルを示しています。Java のレイヤ内の脆弱性を突くエクスプロイトコードは、実際には、Java のレイヤランタイムに存在する脆弱性を利用します。そしてこれによりアプリケーションは、セキュリティマネージャを回避することができ、高い権限の機能を呼び出すことが可能となります。これらのエクスプロイトコードには次の特徴があります。

  • 攻撃者たちは、オペレーティングシステム(OS)レベルの防御を回避する必要がないため、少ない労力で作成することができる。
  • クロスプラットフォームである。すなわち、複数の OS で動作が可能。
  • 同じように、Java のネイティブレイヤ内の脆弱性を突くエクスプロイトコードは、実際には Java のネイティブ・レイヤ・ランタイムに存在する脆弱性を狙います。これらのエクスプロイトコードは、「ASLR」や「DEP」といった OS レベルの防御システムを回避する必要があるため、作成がより困難です。それに加え、Java のネイティブレイヤに存在する脆弱性を利用するエクスプロイトコードの作成には、より高度な技術が必要となります。

    図2:頻繁に利用されるJava の脆弱性(時系列)
    図2:頻繁に利用されるJava の脆弱性(時系列)

    以前は、Javaの レイヤに存在する脆弱性がより一般的なものでしたが、現在は異なります。2013年以前は、Java ネイティブレイヤの脆弱性に対して、3 対 1 の割合で Javaのレイヤ内の脆弱性が利用されていました。しかしながら 2013年以降、より多くのネイティブレイヤの脆弱性が利用されるようになりました。この原因は何でしょうか。

  • 脆弱性の多くは、Java のネイティブレイヤのコード内に存在します。定例のセキュリティアップデート「Java SE Critical Patch Update Advisory – June 2013」では、更新した脆弱性すべての約半数が Java のネイティブレイヤのコード内に存在しました。
  • 攻撃者たちがエクスプロイトコードを作成する技術は、より向上しています。以前は、多くのネイティブレイヤ内に脆弱性が存在したものの、攻撃者たちがエクスプロイトコードの作成に必要な技術を持ち合わせていなかったため、エクスプロイトコードはあまり存在しませんでした。
  • しかしながら2013年は、攻撃者たちは、ネイティブレイヤの脆弱性を利用する能力を明らかに持っているように見受けられます。そして脆弱性を利用する 2つの手法が増えてきているのを確認しています。

    その 1つは、Java の配列の長さ(array length)のオーバーフローを利用し、java.beans.Statement オブジェクトのクラス「AccessControlContext」のメンバを変更する手法です。これを実行するには、以下の手順が必要です。

    手順 1. Java の Array オブジェクトをヒープ領域に作成する。

    図3:手順 1
    図3:手順 1

    手順 2. Java のネイティブレイヤ内の脆弱性をトリガする。Array オブジェクトの length プロパティは、非常に大きな値にオーバーフローされる。

    図4:手順 2
    図4:手順 2

    手順 3. 攻撃者は、Array オブジェクトを利用し、以下のバッファを正確に取得または設定することが可能になる。攻撃者たちは、以下の AccessControlContext オブジェクトを示す java.beans.Statement オブジェクトの ACCフィールドを変更することができる。一般に ACCフィールドは、AccessControlContext オブジェクトへの常時アクセス許可を示すために変更される。これにより、感染PC 上で任意のコードを実行させることができるようになる。

    図5:手順 3
    図5:手順 3

    この脆弱性利用の手法は、脆弱性を引き起こすために利用可能なバッファと、同じヒープ領域に上書きが必要なバッファの両方を必要とします。これを行うには、ある程度の知識と技術が必要です。これに加え、「Pwn2Own 2013」で情報漏えいおよび ROPシェルコード攻撃が実演されました。この攻撃は、Java のネイティブレイヤ内の脆弱性を狙い、ROPシェルコードを構築し、実行コンテキストを乗っ取ることでモジュール・ベース・アドレスを取得します。トレンドマイクロでは、2013年は同様のエクスプロイトコードが確認されると予想しています。

    弊社では、現在および将来の Java の脆弱性の影響を減らすため、ユーザに Java の使用を慎重に判断する必要性と、常に更新された Java を使用することを強く推奨しています。

    トレンドマイクロのサーバ向け総合セキュリティ製品「Trend Micro Deep Security(トレンドマイクロ ディープセキュリティ)」ををご利用のお客様は、以下のフィルタを適用することにより、今回記事で言及した各脆弱性「CVE-2013-2465」「CVE-2012-4681」「CVE-2012-1723」)を利用する攻撃から保護されます。

  • 1005598 – Identified Malicious Java JAR Files – 3
  • 1004870 – Identified Suspicious Jar File
  • 1005093 – Java Applet Field Bytecode Verifier Cache Remote Code Execution Vulnerability
  • 1005640 – Oracle Java storeImageArray() Invalid Array Indexing Vulnerability
  • 参考記事:

  • Java Native Layer Exploits Going Up
     by Jack Tang (Threats Analyst)
  •  翻訳:木内 牧(Core Technology Marketing, TrendLabs)