Java Bytecode Modification and Applet Security

Java Bytecode Modification and
Applet Security
2001/05/16
Mizukami Tatsuo
概要
信頼できないJavaのプログラムをバイト
コードの変換によってより安全に実行する。
そのためのテクニックを発表。
注意
著者はJava2以前の仕様を前提にしている。
– Java2の正式リリースは1998年12月8日
– この論文は98にSubmit
問題背景
筆者がいうJavaアプレットのセキュリティの
主な問題
–
–
–
–
Denial of Service Attack
Disclosure of Confidential Information Attack
Spoofing Attack
Annoyance Attack
具体的にいうと……
Denial of Service Attack
CPUやメモリ等の占有
大量のウィンドウの表示
ファイルシステムの占有
Disclosure of Confidential
Information Attack
Java Applet内で得られた情報をもとのサー
バーに漏らす。
ファイルアクセス可能なアプレットA, Bがあ
り、ネットアクセス不可能なAがネットアクセ
ス可能なBとファイルを中継して、情報を漏
洩する。
Spoofing Attack
間違った情報を表示して、ユーザーに不適
切な選択をさせる。
– これへの対処は難しい。
– 論文では出力情報に対するインターフェース
を強固にし、その引数チェックを行っている。
Annoyance Attack
ユーザーにとって不快な操作を行う。
– 音を永久に鳴らしつづける
– 不快な画像を表示
– 大量のWindowを表示するのもこちらにも分類
できる
別な分類
Securityに対する攻撃は別な文献(Securing
Java)では次のように分類している
–
–
–
–
System Modification
Invasion of Privacy
Denial of Service
Antagonism
解決方法
ダウンロードするクラスファイルを解釈して、
危険な操作を行うクラスの修正or置換を行
う。
– WindowクラスをSafe$Windowに置き換え、ウィン
ドウの生成個数のチェック
– ネットワークアクセスの際に、接続先のマシン
名やポート番号を調べる。
テクニック
著者は2つの修正方法をとっている。
置き換え
個所
Class
Method
長所
短所
簡単
FinalやInterface
には不可能
どのようなもの 置き換え操作に
でもOK
時間がかかる
Class-level Modification
危険なクラスを、事前に検査を行うその子クラス
で置換する方法。
– Constant poolのクラス名を置き換える
Method-level Modification
危険な呼び出しを行うメソッドを、事前に検
査を行う別なクラスメソッドに置換する方法。
– 例えば、下記のように変換する
void foo(Thread t, int i) {
void foo(Thread t, int i) {
Safe$Thread
t.setPriority(i);
}
.setPriority(t, i);
}
Method-level Modification(2)
バイトコードを見比べると
void foo(java.lang.Thread, int)
void foo(java.lang.Thread, int)
aload_1
aload_1
iload_2
iload_2
invokevirtual #2
invokestatic #2
<void setPriority(int)>
return
<void setPriority(Thread,int)>
return
Method-level Modification(3)
修正前のコンスタントプール
Method-level Modification(4)
修正後のコンスタントプール
実装
サーバーとクライアントの間にバイトコード
の修正を行うプロクシをおく。
長所
– 実装が楽。
– 簡単にブラウザ等の拡張が可能。
短所
– 余計な時間が必要
– クラスファイルかどうかわからない時がある。
性能評価
実際にPythonでProxy serverを作成
仮想性能評価
仮にCでProxy serverを作成すると
実行性能評価
修正されたコードの性能評価
Safeguarding code
Overhead
Safe$Frame for Window Attack
4%
Safe$Socket for Network Accesses
4%
Safe$AppletContext for URL Spoofing
5%
Safe$AppletContext for Sound Object Control
55%
筆者の結論
ある種の危険な動作をあらかじめ予防し、
ユーザーがそれをカスタム化できる変換テ
クニックを提案した。
バイトコード変換はProxy Serverで行ったが、
将来的にはクラスローダで行うべきである。
意見
CPUやメモリのResource Control等が問題と
して提起はされているものの、全く解決さ
れていない。
Java2のAccess Controlを細かく設定できるよ
うに拡張したほうが、性能がよくなり、実装
上のバグも少なくなる。
JavaのReflection機能を使用しても大丈夫?