Java Runtime Environment(JRE)の脆弱性:CVE-2008-5353

2009年12月2日に掲載されたIBM SOC レポートにおいて、「JustExploit による脆弱性を悪用した攻撃が増加している」ことを紹介されていました。この SOC レポートを読んでいて、悪用される脆弱性の 1 つに Java Runtime Environment(JRE) の脆弱性CVE-2008-5353)が挙げられていたことが気になりました。過去 JRE脆弱性が JustExploit のような Web Exploit ツール*1に悪用されていた例を知りません。CVE-2008-5353 について、よく知らなかったため、どんなものか確認してみます。

CVE-2008-5353 とは

インターネット上の公開情報を読み、私はこの脆弱性を次のように理解しました。
java.util.Calendar のデシリアライズ(deserialize)処理に問題があり、任意の Java プログラム、Java Applet が権限範囲(サンドボックス)を越えて、任意の Java コードを実行できる」。

wikipedia:シリアライズ(本記事執筆時点)によると、Java におけるデシリアライズ(deserialize)とは、バイト列または XML から Java プログラムのオブジェクトインスタンスを復元することを指します。プログラム上で作成したオブジェクトインスタンスをバイト列または XML に変換することを指す、シリアライズ(serialize)の対義語のようです。プログラムの実行状態を保存したい時等にシリアライズ・デシリアライズが使用されるのでしょうか。

脆弱性のある JREjava.util.Calendar の readObject(ObjectInputStream)では、ZoneInfo インスタンスを入力ストリームの readObject() の戻り値から作成しています(デシリアライズ)。そのデシリアライズ処理は、権限昇格した上で実行されます。Sami Koivu 氏のブログ記事から該当部分のコードを引用します(参考情報を参照)。

// If there's a ZoneInfo object, use it for zone.
try {
  ZoneInfo zi = (ZoneInfo) AccessController.doPrivileged(
    new PrivilegedExceptionAction() {
      public Object run() throws Exception {
        return input.readObject();
      }
  });
  if (zi != null) {
    zone = zi;
  }
} catch (Exception e) {
}

入力ストリームのreadObject() で任意の Java コードを実行させるよう工夫すれば、権限昇格した上でその Java コードを実行させることができてしまうようです。Julien Tinnes 氏の Proof of Concept(PoC)は /usr/bin/say を実行させるものです。

ここまで理解した限りでは、Microsoft Data Access Component(MDAC) の脆弱性CVE-2006-0003)と類似している印象を受けました。

MDAC の脆弱性(CVE-2006-0003)との類似性

MDAC の脆弱性(CVE-2006-0003)は、「MDAC の権限範囲を越えて、ブラウザ上でコンピュータ上の任意のファイルを実行できる」というものだと理解しています。MDAC の設計上における問題であり、MDAC の機能をそのまま使用すれば*2、任意のファイルをダウンロードさせて実行させることができてしまいます。バッファオーバーフローのように OS のバージョン・OS 言語により脆弱性の悪用の成功が左右されることがないことから、MS06-14で修正されているにもかかわらず、いまだこの MDAC の脆弱性が悪用されていると考えます。

CVE-2008-5353 も MDAC の脆弱性と類似していることから、脆弱性をかかえている JRE を使用していた場合、攻撃が成功する可能性が高いでしょう。JustExploit だけでなく、今後も様々な攻撃ツールや不正プログラムに悪用される気がします。。。*3

まとめ

CVE-2008-5353 は JRE の設計上の問題だと考えられるため、悪用された場合に攻撃が成功する可能性が高い脆弱性*4です。Secunia PSI(Personal Software Inspector)F-Secure Health CheckMyJVN バージョンチェッカJRE のバージョンをチェックして、JRE の特定バージョンが必要でなければ、すぐに JRE をアップデートしましょう。

*1:過去には、Mpack, IcePack, FirePack なんかがありました

*2:MILW0RM:2052等の公開されている Exploit コードを参照のこと

*3:変な話、なぜ悪用されなかった?という疑問もあります

*4:National Vulnerabilities Database(NVD)は、CVSS Base Metrics を 10.0 と評価していますね