各社のJava VMに砂場の枠が外れる脆弱性 15
砂場に落し穴 部門より
jbeef曰く、"11月25日にBUGTRAQに流れた記事によると、 ポーランドのグループが、Netscape、Microsoft、SunのそれぞれのJava VMに、 bytecode verifierのチェック漏れやJITコンパイラのバグなどが原因の セキュリティホールを発見したという。 Netscape 4.0~4.8(Windows, Unix版)と Internet Explorer 4.0~6.0では、 sandboxセキュリティ制約が崩れ、その結果、ローカルファイルの読み出しや、任意コマンドのローカル実行などの脅威がもたらされる。 Netscape 4.xでは、JDBC関連のシステムクラスの実装ミスもあり、合わせ技によって、任意のネイティブコードの実行もできてしまうという。 SunのVMについては、発見者の報告では、JDK 1.1~1.4においてbytecode verifierのチェック漏れが見つかったが、Netscape 6およびappletviewerではexploitに成功しなかったという。しかし、Sunから12月12日付けでSun Alert ID: 49304「Java VM Allows Constructors not to Call Other Constructors」が出ている。発見者は9月にSun、Microsoft、Netscapeそれぞれにこれを伝えたが、MicrosoftとNetscapeからはなんら返事がなかったという。"
"bytecode verifierのチェック漏れはJavaが登場した当初からときどき発見されては修正されてきた(最近では2002年3月発表のものが最後だった)が、具体的にどんな手順で攻撃されるかはほとんど公表されないできた。そのため、高度な技術を持つものにしか攻撃できないとされ、現実的な脅威は低めに見積もられることがあった。しかし、 今回の発見者グループのサイトでは、今回のものと、過去に話題となったが公表されなかったものについても、具体的な方法を解説している。 こうした言語システムの設計、実装に携わっている者にとっては、 現実を知る上で参考になる資料となろう。 JITコンパイラのバグは、Netscape 4に採用されていたSymantec製のもの。 ある並びのbytecode列が誤ったコードに変換されるため、 指定した番地にジャンプさせることができてしまうという。
解決方法は、Sun Alert ID: 49304によると、
JREを最新版(1.4.1_01以降、1.4.0_03以降、1.3.1_06以降、1.2.2_014以降)へアップグレードせよとのこと。1.1.x 系列の対策版はないらしい。
Netscape 4.xとInternet Explorerについては今のところ
Javaをオフにして回避するしかない。
なお、日本のサンマイクロシステムズからは1か月が経過した現在も告知が出ていない。
日本HPからは既に日本語訳が出ているので日本サンはそれを参考にしたらどうか。"
Bug Parade (スコア:1)
このグループはよく調べていると思うけど、 現実の環境でこの資料にある穴をついてセキュリティを 破るのは難しいと思う。 少なくとも私にはすぐには考えつかない。 ただ PDFの full paper の方を 読みきると印象が変わるかもしれない。
あと、PowerPoint 資料中に という文があったが、 いちおう SUN の Java 関連製品に関しては その名も高き BugParade [sun.com] (閲覧には登録が必要)というのがある。
ここにはセキュリティ関係のものも含めて、 しこたまバグ報告が登録されている。 ここを読んでいると新しいバグ報告がきても驚かなくなる・・・
# bug parade なんていうネーミングもどうかと思うのだが、、、
コンタミは発見の母
Re:Bug Parade (スコア:4, 参考になる)
「実の環境で」といっても、Javaの上で起きることは環境によらず再現性があるのですから、type confusion攻撃が成功して、クラスローダ周りのclass spoofingができれば、あとはクラスローダに関連付けられたPermission情報をすり替えて、システムクラスと同じ何でもできる権限を得るというのはできそうに思えます。(というか、スライドにズバリその方法が書かれているような。) SunのVMでそれ(クラスローダのclass spoofingによる攻撃)ができなかったのがloadClass()メソッドがfinalだったためとも書かれていますよね。
セキュリティ関連のバグもBugParadeにありますが、脆弱性のことは公開していないと思いますよ。セキュリティ機能のバグと、セキュリティ脆弱性とは別ですね。ちなみに、過去に、bytecode verifierの検証漏れが引き起こす脆弱性の話題を扱ったものとしては、以下の本があります。(Webでも読めます。太っ腹。)
bytecode verifer の漏れ (スコア:1)
というのも JDK 1.2 系以前の JavaVM と較べて、 1.3.x 系の JavaVM は速度が圧倒的です。 Java を使っている人は SUN or IBM or BEA の J2SE 1.3 or 1.4 の JavaVM をダウンロードして載せているだろうと信じています。
# Java 屋の妄想家もしれませんが(涙)。
今回問題となっている bytecode verifer の漏れなのですが、 スライドの P.71 以降に解説があります。
この解説を読めば Symantec JIT compiler と MSIE の脆弱性は分かるのですが、 SUN の JDK 1.3 でどうやって type confusion を起こすのか、 1番肝になる部分が書いてないように読めます。 さすがに古いバグパターンがそのまま適用可能ということはないですよね。
あと、スライド中の 「SUN の VM では loadClass() メソッドが final にマークされていた」 が何を意味するのか悩んでいるのですが、誰か分かる人いますか?
セキュリティや bytecode verifer のバグが分かれば、 脆弱性を類推することは容易だと思いますが、、、、、、 という分けにはいかないでしょうね。
ただ現行の JavaVM の脆弱性は、 仕様自体にセキュリティホールがあるというわけではなくて、 実装が仕様から外れた部分で出ていますよね。
ですから、 BugParade 的な手法で丹念にバグを潰していくことがセキュリティ確保の近道だと思いますがどうでしょう?
コンタミは発見の母
Re:Bug Parade (スコア:1)
アセンブラ自体は前からありますし、携帯向けJavaでガリガリ触る人も増えてきて、悪用できるレベルの人は意外と居るのかもしれない、って気がしないでもない。
Re:Bug Parade (スコア:1)
>
> アセンブラ自体は前からありますし、携帯向けJavaでガリガリ触る人も増えてきて、
> 悪用できるレベルの人は意外と居るのかもしれない、って気がしないでもない。
JavaVM を学ぶのはいのですが、
バイトコード自体を勉強するのはお薦めしません。
2つ理由があります。
1つは Java バイトコードという技術は 面白くなくもないのですが、
スタックマシンという実世界にはあまりない仮想マシン上の
アセンブラ言語なので、これを学んでも応用力がありません。
携帯用 Java のアプリを書きたいとか、Ruby から Java バイト
コードに翻訳するコンパイラが書きたいとか、 なんか明確な目的
がない場合にはお薦めしません。
むしろガーベージコレクションの技術とかを学ぶ方が面白いですし、
役に立ちます。
もう1つは Java バイトコードを直接書くことによるメリットがほとんどない点です。
バイトコードのポテンシャルは、Java 言語のそれとあまり変わりません。
というのも、.NET の MSIL と違って、Java バイトコードは Java 言語からの変換のみを考慮して作成されたものなので裏命令みたいのはないですし、
バイトコードの制約から命令の並び方も決まってくるのでトリッキーな書き方で速度を稼ぐと言うようなことがほとんどできないのです。
C 言語のプログラムの一部をアセンブラで高速化というようなのりとは全然違います。
携帯用の Java の世界では、数バイトを削るために目的バイトコードを直接つかってガリガリ書くことがあるかもしれませんが、Java2 SE/EE の世界では、少々 バイトコードを最適化しても dynamic compiler が最適化すると同じになってしまいます。
# 次の Java2 ME には JIT コンパイラも入ります。
コンタミは発見の母
Netscape 4.x と IE (スコア:1)
使わないのがいいけど。
okome
蛇足。 (スコア:1)
OS/2版Netscape4.xは、ハナからIBM謹製JREを使っているので、とりあえずは対象外。同じ穴が無いとも言い切れないけど。
Re:Netscape 4.x と IE (スコア:0)
そこの設定に限らず強制的にMSのVMが使われた様な気がする…。
# 最近使っていないので自信なし…よってAC。
Re:Netscape 4.x と IE (スコア:1)
大丈夫なのかも?
JDK1.1はもう古すぎる。
okome
Re:Netscape 4.x と IE (スコア:1)
appletタグだと、Plug-in ではないっぽいですなぁ。
okome
120日で問題は解決です。 (スコア:0)
Re:120日で問題は解決です。 (スコア:0)
# と思うのだがいまだ詳細不明なのでAC
空目 (スコア:0)
各社のJavaVMってことは (スコア:0)
…あったらアップデートしてもらえるんかな?
Re:各社のJavaVMってことは (スコア:0)
だって携帯で動くクラスは既にクラスベリファイされたものだから
クラスベリファイアにバグがあった場合は、
全てのクラスを再ベリファイしないとだめですから。