Javaバイトコード比較を用いた ライブラリ再利用検出ツールの提案

Slides:



Advertisements
Similar presentations
API 呼び出し列の差分を利用した Android アプリケーション比較ツールの 試作 井上研究室 神田 哲也.
Advertisements

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
シーケンス図の生成のための実行履歴圧縮手法
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
コンピュータプラクティス I 再現性 水野嘉明
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
ラベル付き区間グラフを列挙するBDDとその応用
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
アクセス修飾子過剰性の変遷に着目したJavaプログラム部品の分析
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
ギャップを含むコードクローンの フィルタリング手法の提案
類似するコーディングパターンの 利用状況調査ツールの提案
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
動的スライスを用いた バグ修正前後の実行系列の比較
動的依存グラフの3-gramを用いた 実行トレースの比較手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
限られた保存領域を使用する Javaプログラムの実行トレース記録手法の 提案と評価
Javaプログラムの変更を支援する 影響波及解析システム
社会シミュレーションのための モデル作成環境
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローンに対する一貫性のない変更に起因する欠陥の検出
ハッシュ値比較による Javaバイトコードに含まれる ライブラリの検出手法
ソースコードの静的特性を用いた Javaプログラム間類似度測定ツールの試作
UMLモデルを対象とした リファクタリング候補検出の試み
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
Webコミュニティ概念を用いた Webマイニングについての研究 A study on Web Mining Based on Web Communities 清水 洋志.
アスペクト指向言語のための 独立性の高いパッケージシステム
Parallel Setsによるライブラリの 組み合わせと利用状況の可視化
プログラム理解におけるThin sliceの 統計的調査による有用性評価
Javaソフトウェア部品検索システムSPARS-Jの実験的評価
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
類似度メトリクスを用いた Javaソースコード間類似度測定ツールの試作
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
ソースコードの差分を用いた関数呼び出し パターンの抽出手法の提案と実装
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア理解支援を目的とした 辞書の作成法
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
Presentation transcript:

Javaバイトコード比較を用いた ライブラリ再利用検出ツールの提案 〇矢野 裕貴,Raula Gaikovina Kula, 石尾隆,井上克郎 大阪大学 情報科学研究科

Javaにおけるコードの再利用 Javaでは,ソースコードの再利用よりもバイトコードの再利用が主流となっている  ライブラリは,JAR(Javaアーカイブ)という形式で配布,利用されることが多い Javaクラスファイル(バイトコード) プログラムが使用するリソース などが含まれる

ライブラリを含むJarファイル 通常は別ファイルとして使用 JARを展開して内部に含まれるファイルをコピーして使用しているソフトウェアも存在(Fat JAR) Maven Repositoryに登録されているライブラリのうち,約13%が他のライブラリを1つ以上含んでいた Library.jar Software.jar Library Software.jar

脆弱性を含むライブラリの再利用 Google Web Toolkit は多数のライブラリを内部に含んでいる ドキュメントには再利用されたという情報はあるが,バージョン番号が記述されていない Google Web Toolkit 2.7.0 Apache Ant Commons Codec Commons Collections Apache HttpClient Apache Xalan ・・・

脆弱性を含むライブラリの再利用 脆弱性が報告されているバージョンのライブラリが内部に含まれていた Commons Collections 3.2.1 Apache Xalan 2.7.1 Google Web Toolkit 2.7.0 Apache Ant 1.6.5 Commons Codec 1.8 Commons Collections 3.2.1 Apache HttpClient 4.3.1 Apache Xalan 2.7.1 ・・・ Vulnerability Note VU#576313 #2014-002 Xalan-Java insufficient secure processing

脆弱性を含むライブラリの再利用 利用者はこれらのライブラリの脆弱性の影響を受けるリスクがある Google Web Toolkit 2.7.0 Apache Ant 1.6.5 Commons Codec 1.8 Commons Collections 3.2.1 Apache HttpClient 4.3.1 Apache Xalan 2.7.1 ・・・ Vulnerability Note VU#576313 #2014-002 Xalan-Java insufficient secure processing

既存研究: バイトコード比較による 再利用元の特定 Jarファイル内に含まれるクラスファイルの比較によりコードの再利用を検出する手法 Software Bertillonage [1] 複数のライブラリからコードの再利用が行われたときに再利用元特定が難しい Software Ingredients [2] パッケージのリネームが行われた場合に再利用が検出不可 [1] J. Davies, D. M. German, M. W. Godfrey, and A. Hindle. Software bertillonage: Finding the provenance of an entity. In Proceedings of the 8th Working Conference on Mining Software Repositories, pages 183–192, 2011. [2] T. Ishio, R. G. Kula, T. Kanda, D. M. German and K. Inoue. Software Ingredients: Detection of Third-party Component Reuse in Java Software Release. In Proceedings of the 13th Working Conference on Mining Software Repositories, pages 339-350, 2016

パッケージのリネーム Javaでは,クラスファイル名の衝突を避けるため,パッケージという名前空間が用いられる 再利用が行われる際にパッケージ名を変更するような場合がある Package Y A.class B.class 再利用 Software.jar X Package lib A.class B.class Library.jar

研究概要 Javaバイトコードから計算したハッシュ値の比較によって,ソフトウェア内部に含まれるライブラリを検出 手法を提案 パッケージのリネームを検出可能 Target.jar X-1.0.jar X-2.0.jar Y-2.0.jar Y-1.0.jar 入力 出力 提案ツール データベース 入力: jarファイル 出力: 含まれるライブラリの一覧

提案手法の流れ クラスファイルからのハッシュ値の計算 データベースとの比較,再利用元の推定 入力したJarファイルに含まれるクラスファイルそれぞれに対して,クラスファイルから抽出した情報を元にハッシュ値を計算 データベースとの比較,再利用元の推定 入力ファイルをデータベース内に含まれるJarファイルと比較し,再利用元を推定する

1.クラスファイルからの ハッシュ値の生成 Jarファイル内部に含まれるクラスそれぞれに対して クラスファイルの特徴となるような情報を文字列として連結 クラス名,メソッド名,フィールド名, 演算命令の数 など パッケージ名に関する情報は取り除く 所属パッケージ名の変更による影響を無視できる ハッシュ値を計算  1 2 A.class A;MethodName;fieldname;... 7fabc... 情報の抽出 ハッシュ値を計算

1.クラスファイルからの ハッシュ値の生成 最終的に,jar ファイルをハッシュ値の多重集合として扱う パッケージ名を考慮しないことで,ハッシュ値が衝突する場合があるため多重集合としている Package X A.class B.class {7fabc..., 7fabc..., b93d6..., 07a51...} Target.jar [4] A.class C.class Package Y Target.jar

2.データベースとの比較 入力ファイルをデータベースと比較 以下の手順の繰り返しで行う 完全な形での再利用を優先的に検出するアルゴリズム  入力ファイルをデータベースと比較 完全な形での再利用を優先的に検出するアルゴリズム  以下の手順の繰り返しで行う 手順1: 再利用元候補の選択 手順2: 再利用元ライブラリの確定

手順1: 再利用元候補の選択 データベース内の各ライブラリに対して,入力ソフトウェアとハッシュ値が一致するクラス数の割合を計算 (オーバーラップ値) Target.jar [5] Hash af3bc... bf1dc... c20b4... da18e... e2cdb... Database A-1.0.jar [2] 368dd... A-2.0.jar [2] D-1.0.jar [3] B-2.0.jar [3] 4f231... C-1.0.jar [2] B-1.0.jar [2] 2a7cb... 入力ソフトウェア データベース

手順1: 再利用元候補の選択 データベース内の各ライブラリに対して,入力ソフトウェアとハッシュ値が一致するクラスの割合を計算 例) A-2.0.jar は2つのハッシュ値を持ち1つが入力と一致するため 1/2 = 0.5 Target.jar [5] Hash af3bc... bf1dc... c20b4... da18e... e2cdb... Database A-1.0.jar [2] 368dd... A-2.0.jar [2] D-1.0.jar [3] B-2.0.jar [3] 4f231... C-1.0.jar [2] B-1.0.jar [2] 2a7cb... 0.5

手順1: 再利用元候補の選択 全てのライブラリに対して計算する 1.0 0.5 0.5 1.0 0.7 1.0 Hash Database Target.jar [5] Hash af3bc... bf1dc... c20b4... da18e... e2cdb... Database A-1.0.jar [2] 368dd... A-2.0.jar [2] D-1.0.jar [3] B-2.0.jar [3] 4f231... C-1.0.jar [2] B-1.0.jar [2] 2a7cb... 1.0 0.5 0.5 1.0 0.7 1.0

手順1: 再利用元候補の選択 オーバーラップ値が最大のライブラリを再利用元候補とする {A-1.0.jar,B-1.0.jar,D-1.0.jar} Target.jar [5] Hash af3bc... bf1dc... c20b4... da18e... e2cdb... Database A-1.0.jar [2] 368dd... A-2.0.jar [2] D-1.0.jar [3] B-2.0.jar [3] 4f231... C-1.0.jar [2] B-1.0.jar [2] 2a7cb... 1.0 0.5 0.5 1.0 0.7 1.0

手順2: 再利用元ライブラリの確定 手順1で得られた候補中から再利用元となっているライブラリを確定する. 候補ライブラリ 入力ソフトウェア Hash af3bc... bf1dc... A-1.0.jar [2] Target.jar [5] D-1.0.jar [3] Hash af3bc... bf1dc... c20b4... da18e... e2cdb... Hash af3bc... bf1dc... c20b4... B-1.0.jar [2] Hash c20b4... da18e... Hash c20b4... da18e...

手順2: 再利用元ライブラリの確定 入力ソフトウェアに含まれる1つのクラスファイルは1つの再利用元に由来するとする ? ? 候補ライブラリ Hash af3bc... bf1dc... A-1.0.jar [2] Target.jar [5] ? D-1.0.jar [3] Hash af3bc... bf1dc... c20b4... da18e... e2cdb... Hash af3bc... bf1dc... c20b4... ? B-1.0.jar [2] Hash c20b4... da18e... Hash c20b4... da18e...

手順2: 再利用元ライブラリの確定 条件を満たし,要素数の和が最大の4となる {A-1.0.jar,B-1.0.jar}が結果として確定する Hash af3bc... bf1dc... A-1.0.jar [2] Target.jar [5] D-1.0.jar [3] Hash af3bc... bf1dc... c20b4... da18e... e2cdb... Hash af3bc... bf1dc... c20b4... B-1.0.jar [2] Hash c20b4... da18e... Hash c20b4... da18e...

手順2: 再利用元ライブラリの確定 入力ソフトウェアから,再利用元が確定されたクラスファイルに対応するハッシュ値を取り除き,手順1に戻る 再利用元候補がなくなり次第終了 Hash af3bc... bf1dc... A-1.0.jar [2] Target.jar [5] D-1.0.jar [3] Hash af3bc... bf1dc... c20b4... da18e... e2cdb... Hash af3bc... bf1dc... c20b4... B-1.0.jar [2] Hash c20b4... da18e... Hash c20b4... da18e...

手順1 (2回目) 入力が持つ残りのハッシュ値集合に対してオーバーラップ値を計算 Hash Database Target.jar [5] af3bc... bf1dc... c20b4... da18e... e2cdb... Database A-1.0.jar [2] 368dd... A-2.0.jar [2] D-1.0.jar [3] B-2.0.jar [3] 4f231... C-1.0.jar [2] B-1.0.jar [2] 2a7cb...

手順1 (2回目) データベース内の各ライブラリに対して,入力ソフトウェアとハッシュ値が一致するクラス数の割合を計算 0.5 0.0 0.0 Target.jar [5] Hash af3bc... bf1dc... c20b4... da18e... e2cdb... Database A-1.0.jar [2] 368dd... A-2.0.jar [2] D-1.0.jar [3] B-2.0.jar [3] 4f231... C-1.0.jar [2] B-1.0.jar [2] 2a7cb... 0.5 0.0 0.0 0.0

手順2 (2回目) 候補が1つしかないのでC-1.0.jarを選択 Hash Hash Target.jar [5] af3bc... bf1dc... c20b4... da18e... e2cdb... Hash e2cdb... 2a7cb...

手順1 (3回目) オーバーラップ値を計算 0.0 0.0 0.0 Hash Database Target.jar [5] af3bc... bf1dc... c20b4... da18e... e2cdb... Database A-1.0.jar [2] 368dd... A-2.0.jar [2] D-1.0.jar [3] B-2.0.jar [3] 4f231... C-1.0.jar [2] B-1.0.jar [2] 2a7cb... 0.0 0.0 0.0

手順1 (3回目) 再利用元候補がなくなったため (オーバーラップ値が全て0.0), 検出を終了する 0.0 0.0 0.0 Hash Target.jar [5] Hash af3bc... bf1dc... c20b4... da18e... e2cdb... Database A-1.0.jar [2] 368dd... A-2.0.jar [2] D-1.0.jar [3] B-2.0.jar [3] 4f231... C-1.0.jar [2] B-1.0.jar [2] 2a7cb... 0.0 0.0 0.0

検出結果 検出結果: {A-1.0.jar[2/2], B-1.0.jar[2/2], C-1.0.jar[1/2] } Hash Hash af3bc... bf1dc... A-1.0.jar [2] Target.jar [5] Hash af3bc... bf1dc... c20b4... da18e... e2cdb... B-1.0.jar [2] Hash c20b4... da18e... Hash c20b4... da18e... C-1.0.jar [2] Hash e2cdb... 2a7cb...

実験 性能評価 ケーススタディ(パッケージリネームの事例) 検出精度 実行時間 パッケージがリネームされている再利用を検出できているか パッケージ名を比較に用いなくても検出精度が落ちていないか 実行時間 検出にかかる時間はどの程度か ケーススタディ(パッケージリネームの事例) パッケージがリネームされている再利用を検出できているか

検出精度の評価 (実験方法) 約230,000個のライブラリから、ランダムに選択した5-100個を1つのjarファイルにまとめたものを作成 A-1.0.jar ランダムに 選択 コピー B-1.0.jar Target.jar データベース C-1.0.jar

検出精度の評価 (実験方法) ツールに入力し、出力結果として得られたライブラリのリストが正しいかどうかを評価 出力結果 提案手法 (ライブラリのリスト) 提案手法 Target.jar Software Ingredients

検出精度の評価 (結果) 再現率が向上している 検出アルゴリズムの違いによる ※提案手法によって30分以内に検出が完了したもの precision recall 提案手法 0.87 0.98 Software Ingredients 0.96 ※提案手法によって30分以内に検出が完了したもの

実行時間 提案手法は計算時間に大きなばらつきが見られる 候補数に対して指数オーダーで計算時間が増加するため 提案手法 Software Ingredients

ケーススタディ: パッケージリネームの検出  実験対象: Elasticsearch-0.90.5 既存研究のツール(Software Ingredients)ではライブラリの再利用は検出されなかった 9つのライブラリをパッケージ名を変更して再利用しているとの記述(pom.xmlより) 利用しているクラスファイルのみが含まれる trove4j mvel2 jackson-core jackson-dataformat-smile jackson-dataformat-yaml joda-time netty compress-lzf guava

ケーススタディ: 概要 Elasticsearch-0.90.5.jarを提案ツールに入力し,以下の観点で結果を確認 再利用している9つのライブラリを検出可能か クラスファイルを再利用元に対応付けられているか データベース: Maven Repositoryのスナップショット 239828個のライブラリが含まれる

検出結果 提案ツールによる検出結果: 18件 pom.xmlに記述されていた9つのライブラリ 〇 ・・・ 各1件 Google Guiceと 関連ライブラリ ? ・・・ 4件 Guavaの一部機能のみを持つライブラリ  × ・・・ 1件 その他 ×

検出結果: POMに記述されていた 9つのライブラリ バージョン番号はツールによる推定値 ライブラリ名 検出バージョン クラス数 検出クラス数 trove4j 3.0.3 691 98 mvel2 2-2.1.5.Final 349 253 jackson-core 2.2.3 69 63 jackson-dataformat-smile 2.2.2 12 8 jackson-dataformat-yaml 112 70 joda-time 2.3 157 144 netty 3.7.0.Final 546 239 compress-lzf 0.9.6 26 10 guava 15.0-rc1.jar 453 205

検出結果: POMに記述されていた 9つのライブラリ バージョン番号はツールによる推定値 ライブラリ名 検出バージョン クラス数 検出クラス数 trove4j 3.0.3 691 98 mvel2 2-2.1.5.Final 349 253 jackson-core 2.2.3 69 63 jackson-dataformat-smile 2.2.2 12 8 jackson-dataformat-yaml 112 70 joda-time 2.3 157 144 netty 3.7.0.Final 546 239 compress-lzf 0.9.6 26 10 guava 15.0-rc1.jar 453 205 検出対象(Elasticsearch)において,Trove4jが含まれるパッケージ中(org.elasticsearch.common.trove)のクラスファイル103個中,98個がこのバージョンに対応付けられていた 実際の再利用元バージョンがデータベース内に含まれていない可能性が高い

検出結果: Google Guiceと 関連ライブラリ 再利用されたという記述はなかったが,実際には再利用されている可能性が高い 一部機能のみを持つものが優先的に検出されてしまっている ライブラリ名 検出バージョン クラス数 検出クラス数 guice 2.0-no_aop 184 123 guice-multibindings 2-2.1.5.Final 4 guice-annotations 2.2.3 10 guice-assisted-inject 2.2.2 7 5 次に,guiceというライブラリとその関連ライブラリが検出結果として表れていましたが,このライブラリに関しては再利用されたということがドキュメントに記述されていませんでしたが,. 再利用されたと判定されたクラスファイルを確認した結果,実際に再利用が行われている可能性が高いことがわかりました. 3つの関連ライブラリに関しては欲しい結果とは違うのですが,juiceの一部機能を持つライブラリで,検出アルゴリズムの特性上,オーバーラップ値が高くなってしまうことによって優先的に検出してしまった可能性が高いです

検出結果: 誤検出について 小規模なライブラリが誤検出されやすい Guavaの一部機能のみを実装しているライブラリ 偶然数個のクラスファイルが一致したものなど ライブラリ名 検出バージョン クラス数 検出クラス数 Guava-annotations r03 4 Reader-files 1.1.2 2 1 hadoop-job-builder 1.0 6 3 jsr166y 1.7.0 9 jellydoc-annotations Guavaのannotationに関する機能のみが含まれるライブラリ 偶然一致?

まとめ Javaのソフトウェア内部に含まれるライブラリを検出する手法を提案した 今後の課題 パッケージ名が変更されていても検出が可能なことを確認した 検出アルゴリズムに関しては要改善 今後の課題 単純に一致するかどうかのみで判定を行うのではなく,ファイルの類似度などの情報を組み合わせることで精度を高められる可能性がある