Program Surfing I プログラム解析いろいろ • Inference of Field Initialization 未初期化オブジェクトの使用を推論 • Taming Reflection リフレクションを通常のコードに変換する動的解析 • Patching Vulnerabilities with Sanitization Synthesis XSSなどを引き起こす入力文字列の自動特定 石尾 隆 [email protected] 2011/06/29 1 Inference of Field Initialization ❖著者:Fausto Spoto and Michael D. Ernst ❖提案手法: プログラムの各時点で,オブジェク トのフィールドが初期化されているか推論 静的解析 Java バイトコードを解析 オブジェクト型の変数について以下の情報を出力 null でないことが保障されるか否か(@NonNull) フィールドに未初期化のものがあるか(@Raw) 2 2011/06/29 研究の背景 ❖未初期化のフィールドを知らずに使ってしまう と,間違いのもとになる class X { public X() { this.field = 0; // フィールド初期化 init(); // 他のフィールドを初期化 } public void init() { … } … class Y extends X { public void init() { // ここで this は未初期化 super.init(); } … } ❖未初期化のオブジェクトを識別したい 未初期化のnullと意図的なnull値も区別したい 3 2011/06/29 提案手法 ❖各バイトコードに Operational Semantics を定義 各命令位置でのローカル変数,スタック,フィールドの状態を 求める 各変数の値が他のどの変数の値と同じか,また null かどうか Path-sensitive, Interprocedural ❖各命令時点で変数に格納されているオブジェクトの 「未初期化フィールドの集合」を計算 前段で求めた変数間の関係から,各命令位置での未初期 化フィールドの集合をグラフ表現に落とし,最小解を求める 未初期化フィールドが1つでもあるオブジェクトを格納する変 数は @Raw とする 4 2011/06/29 評価実験 ❖4つのソフトウェアに適用し既存ツールと比較 @NonNull は94~98%ぐらい 多いほどnon-nullと断定することに成功=良い メソッドの仮引数,戻り値が対象 @Rawは1%未満 少ないほど未初期化でないと断定=良い メソッドの呼び出し対象が @Raw であるものも検出 ❖Plume という人間が @Nullable などのアノ テーション付きコードと比較 人間が間違っていた場所を数か所発見 5 2011/06/29 解析の特徴 ❖Sound な静的解析 Constraint Graph を解くところの正しさの議論は 別論文 制御フローが複雑な場所は追い切れないことも @NonNull としないだけで,嘘の結果は出さない ❖読むときは…… バイトコードの命令セットの知識が必要 エイリアス解析など一般的なデータフロー解析系 の知識があれば比較的簡単な Semantics 6 2011/06/29 Taming Reflection: Aiding Static Analysis in the Presence of Reflection and Custom Class Loaders ❖著者: Eric Bodden, Andreas Sewe, Jan Sinschek, Hela Oueslati, and Mira Mezini ❖提案手法: 実行時情報を使ってリフレクション の振る舞いをプログラムに変換 動的解析 入力: Java バイトコード,実行テストケース1つ以上 出力: リフレクションが実行する処理をコードとして 表現した Java バイトコードを出力 7 2011/06/29 研究の背景 ❖静的解析では,リフレクションは難敵 たとえば,動的解析のベンチマーク DaCapo で は,main からリフレクションで色々な処理を起動 静的なコールグラフが役に立たない. 静的解析ツールから正しい結果を得られない. ❖リフレクションの文字列引数を静的に調べる 方法もあるが,リフレクションの引数は設定 ファイル等に依存することも多い 8 2011/06/29 提案手法 ❖リフレクション呼び出しのログを取る ❖実行時に作られたクラスの内容を書き出しておく 実行時に作られるクラスの名前は,中身のハッシュ値で正規化 ❖リフレクションに対応する呼び出しをコードに追記 Connection c = new Connection(); Class clazz = Generator.makeClass(); // returns Foo$42 Method m = clazz.getMethod("foo", Connection.class); m.invoke(null, c); // calls Foo$42.foo(..) if (Opaque.false()) Foo$H1.foo(c); else m.invoke(null, c); // 元の呼出し 条件節のOpaque.false()は 常にfalseを返すメソッド. 静的解析に Foo$H1.foo へ の呼び出しを認識させる. 実行はelse節の 元の呼び出しを実行する.9 2011/06/29 評価実験 ❖DaCapo のバイナリ&実行ログを使用 静的コールグラフの辺が 30本~3000本増加 ベンチマークの設定(3通り)による実行トレースの変化で, 見つかる辺の数が20%程度変動(期待ほど大きくない) 時間オーバーヘッド +10%程度.リフレクション多用した1 つだけ+100% ❖GUI アプリケーションを人間が操作して実験 Eclipse や JEdit では,特定機能の実行で大幅に辺が増 える.本数は3000本程度 10 2011/06/29 解析の特徴 ❖解析は Sound ではない けれども Sounder (本人談) 動的解析なので,リフレクションの「代表的な動 作」をコード化している 既存ツールの変更が不要というのがポイント ❖TAMIFLEX という名前で公開中 http://tamiflex.googlecode.com/ 論文はツール実装の細かい戦略と実験がメイン 11 2011/06/29 Patching Vulnerabilities with Sanitization Synthesis ❖著者: Fang Yu, Muath Alkhalaf, and Tevfik Bultan ❖提案手法: XSSやSQLインジェクションの問題検出, 修正方法の自動分析 静的解析 対象:PHP プログラム,攻撃パターン 攻撃パターン = printf や SQL 実行の引数としては不適切な文字 列の正規表現. たとえば HTML 出力時にスクリプトを出す可能性をチェックするに は “ Σ* <SCRIPT Σ* ” と指定 出力(1): 入力されるとまずい文字列の正規表現 出力(2): 入力されるとまずい文字列を,安全な文字列にす るために,どの文字(記号)を削除したらよいか提示 12 2011/06/29 提案手法 (1/2) 脆弱性の確認 ❖文字列間の依存関係をグラフ化 ❖オートマトンで取りうる文字列を計算 攻撃パターンを指定 $name $addr Σ* Σ* echo など出力命令に, 到達するとまずい文字列を指定 ユーザからの入力は Σ* (任意文字列)と仮定 出力命令の引数が 攻撃パターンを満たすか “Name: “ . $name . “Address: “ . $addr Name: Σ* Address: Σ* echo [攻撃パターン Σ* <SCRIPT 13 Σ*] 2011/06/29 提案手法 (2/2) 危険な入力の特定と,修正の提示 ❖危険な文字列を構成しうる入力を求める 例: $name . “Address: ” . $addr $name,$addr のそれぞれが “<SCRIPT” を含むと危険 例: $name . $addr $name の終わりが “<SCR” で $addr の先頭が “IPT” と いう場合でも危険,というところまで計算 各入力変数の読み込み位置での条件を計算 ❖受理状態への遷移を防ぐように,文字の削除 を開発者に提案 14 例: $name, $addr それぞれからの “<” の削除 2011/06/29 評価実験 ❖5つの既知の脆弱性を分析 MyEasyMarket-4.1, BloggIT-1.0, proManager-0.72 “<” を削除する,という最適解が出ることを示した ❖3つのOSSを解析 Webchess 0.9.0, EVE 1.0, Faqforge 1.3.2 サイズは最大で 3400 行 解析時間 2分~5分,メモリは最大で140MB程度 XSSの可能性 55個(うち2入力以上 11個)検出 SQLI の可能性 60個(うち2入力以上 9個)検出 15 2011/06/29 解析の特徴 ❖解析は Sound 複数の入力から構成される文字列によって引き 起こされる脆弱性を扱えることが新しい 文字列置換の操作にも対応 ❖適用上の制限:攻撃パターンの指定が必要 正規表現で書かなければいけない 文字コードの数値などから作られる文字列もサ ポートが明確ではない 16 2011/06/29
© Copyright 2024 ExpyDoc