Video Screencast Help
Security Response

Java の脆弱性 CVE-2012-1723 の検証

Created: 31 Jul 2012 03:42:20 GMT • Translations available: English
Masaki Suenaga's picture
0 0 Votes
Login to vote

2012 年 7 月上旬、Oracle Java SE CVE-2012-1723 リモートでコードが実行される脆弱性を悪用する BlackHole ツールキットの例が公開されました。

この脆弱性は、静的変数とインスタンス変数の「データ型の混乱」によって引き起こされています。静的変数はクラス内で一般的に使用されますが、インスタンス変数はインスタンス化されたクラスでのみ有効です。例では、クラスによって多数の変数が定義されています。

 

class C2

{

  static ClassLoader static_field;

  C3 f0;

  C3 f1;

  C3 f2;

  … continues to f99

  C3 f99;
 

静的変数 static_field にアクセスするには C2.static_field を使用し、インスタンス変数 f0 にアクセスするには this.f0 を使用します。this.static_field は Java のソースコードで使用できますが、コンパイルするとバイトコードで C2.static_field になります。これは、静的変数がインスタンス変数とまったく異なるためです。javac.exe コンパイラでこのフィールドの型が混同されることはありません。

ところが、Michael ‘mihi’ Schierl 氏が指摘しているように、Java バイトコードアセンブラを使用したり、クラスファイルを手動でパッチすると、変数の「データ型の混乱」が生じるおそれがあります。例には、次のコードが含まれています。

 

  classloader2 = C2.static_field;

  this.static_field = classloader3;

この不正なコードが原因で、脆弱な Java VM は静的変数とインスタンス変数を区別できなくなり、正しくない変数(例では f0f99 のいずれか)を参照してしまいますがこれは安全性が確認されていません。その結果、Java VM サンドボックスによる制限が適用されることなく、悪質な C3 クラスが実行されることになります。

多くのセキュリティベンダーはこの例の検出機構を追加しましたが、当然ながら、マルウェア作成者は、検出を回避する目的で、悪質な Java プログラムを不明瞭化するようになりました。

1 年前は、不明瞭化の手口として、マルウェア作成者のソースコードに冗長コードを挿入し、クラス名をランダムに変更するというやり方が多用されていました。市販または無料の不明瞭化ツールが利用されることもありましたが、最近では、このような不明瞭化ツールを使用するのが主流になっています。Trojan.Maljava として最近検出された JAR ファイル(MD5: 2b65631bc1239838e7db52f1e623cc27)には、fawa という名前のパッケージに fawa.classfawb.classfawc.classfawd.class の 4 つのクラスのファイルが含まれていますが、これらはすべて、市販の不明瞭化ツールによって不明瞭化されています。

各クラスには、曖昧な名称のフィールドやメソッドが含まれています。fawa.class ファイルには、fawafawb という名前のフィールドと、fawa (fawa, String)fawc (fawa, String)fawa (fawa)fawb (fawa, String) というメソッドが含まれています。fawb.class ファイルには、fawaz という名前のフィールドと、fawc()fawa()fawa (String)fawb()、fawd() というメソッドが含まれています。fawc.class ファイルには、「faw」で始まる多数のフィールドと、fawa() などのメソッドが含まれています。fawd.class ファイルにも、同様の曖昧な名称のフィールドとメソッドが含まれています。唯一、識別できる名前が fawd.init() ですが、これは、Applet クラスを拡張するために必要なものです。

同じような意味のない名前が、パッケージ名、クラス名、フィールド名、メソッド名に共通して使われているため、プログラムは、ひと目見ただけでは容易に理解できません。

 


 


 


 

Java を有効にしたインターネットブラウザで JAR ファイルを含む Web ページを閲覧すると、まず fawd クラスが実行され、続いて fawd クラスによって fawc クラスが実行されます。Oracle Java Runtime Environment にパッチが適用されていない場合、fawc クラスによって、Oracle Java SE CVE-2012-1723 のリモートでコードが実行される脆弱性が悪用され、確認されていない fawa クラス(Java VM のサンドボックスを回避できる)が実行されます。次に、fawa クラスによって fawb クラスが実行されますが、fawb クラスには、市販の不明瞭化ツールによって暗号化されている長い文字列変数が含まれており、この変数は、fawb クラスが初期化されると復号されます。

fawb クラスに含まれる長い文字列は、「33r00yv66vgAAADIAwgcAAgEACGEvaGl」で始まり、静的フィールド z[0] に保存されます。文字列は、自身の BASE-64 デコーダに z[0].substring(5) として渡されるため、最初の「33r00」の 5 文字は削除されます。復号された文字列は、0xCA、0xFE、0xBA、0xBE で始まりますが、これが、「a」というパッケージに含まれている hidden.class ファイルを開始するためのコードです。

hidden.class ファイルは、現在のセキュリティマネージャを無効にする目的で、setSecurityManager(null) を呼び出しますが、サンドボックスを回避しているため、これが可能になります。これによって、hidden.class ファイルによって、暗号化されたファイルから、V.class という別のクラスが抽出されます。

fawd クラスは、最初に呼び出されると、HTML ファイルからパラメータ「sw」を取得します。パラメータの文字列は、fawa クラス、fawb クラス、hidden クラスを経由して、V クラスに引き渡されます。V クラスは、パラメータ「sw」をコロン(:)で分割した後、分割した文字列から各 URL を復号して、次の場所に保存します。

 

%Temp%\fest[数字]r_ot.exe
 

注: [数字] は 0 から始まり、ダウンロードされるたびに 1 ずつ増加します。

その後、取得したファイルが実行されます。ダウンロードされた URL を判断する HTML ファイルが不明なため、何がダウンロードされるかわかりませんが、危殆化されたコンピュータにダウンロードされるものが悪質であることは、ほぼ確実です。

クラス間の関係は複雑ですが、Oracle Java SE CVE-2012-1723 リモートでコードが実行される脆弱性への脅威を含んでいるのは、fawc クラスであることは判明しています。

 

    System.out.print(fawc.fawh);

    this.fawh = classloader1;
 

ここで、静的変数 fawc.fawh はインスタンス変数 this.fawh としてアクセスされています。作成者によって、classloader2 = C2.static_fieldSystem.out.print(fawc.fawh) に変更されていますが、基本的な概念は同じです。

シマンテックでは、Trojan.Maljava!gen23 という同様の例を検出しました。Oracle は最新の Java アップデートで、この問題を解消しています。この脆弱性が悪用されないよう、Oracle Java Runtime Environment を最新バージョンにアップデートすることを推奨します。

 

* 日本語版セキュリティレスポンスブログの RSS フィードを購読するには、http://www.symantec.com/connect/ja/item-feeds/blog/2261/feed/all/ja にアクセスしてください。