バイナリ類似性検出技術の改善
新しい方法は、バイナリーコードの挙動に注目して、より良い類似性検出を目指してるよ。
― 1 分で読む
バイナリの類似性検出は、似たようなバイナリコードを見つけるための方法だよ。このテクニックは、元のソースコードが利用できない場合に重要で、バグを見つけたり、マルウェアを分析したり、コードの剽窃をチェックするのに使われるんだ。バイナリ間の類似性を検出する方法はいろいろあるけど、既存の方法は異なるコンパイラや最適化レベルが使われると悩ましいことが多いんだ。
バイナリ類似性検出の重要性
類似したバイナリを検出することは、いろんな現実のアプリケーションで役立つよ。例えば、ソフトウェアのバグや脆弱性を探すのに使える。ソフトウェアが更新されたり変更されたりしたときに、新しいバージョンが古いものと同じような脆弱性を持っているかチェックするのが大事なんだ。また、マルウェアの場合、似たバイナリを見つけることで、悪意のあるソフトウェアを理解したり対抗したりする手助けになるよ。
既存の方法の課題
現在のバイナリ類似性検出の方法は、特定のシナリオでは非効率的なんだ。例えば、バイナリが異なるオプションでコンパイルされていたり、コードの異なるバージョンを通ったりすると、既存の方法ではその類似性を正確に検出できないことがある。これは、これらの方法の多くがコードの構造(見た目)に重点を置きすぎて、その動作(何をするか)をあまり考慮していないからなんだ。
重要な観察
最適化やコンパイラによって生じる違いにもかかわらず、コードの基本的な動作は必ずしも変わらないんだ。つまり、バイナリが行う主要なアクション(関数を呼び出したり、値を保存したりすること)は、コードが違って見えても同じままであることが多い。これらの重要なアクションに焦点を当てることで、より良いバイナリ類似性検出の方法を構築できるんだ。
提案するアプローチ
バイナリ類似性検出を改善するために、バイナリコードの重要な動作を捉える新しい方法が提案されているよ。これには2つの主要なステップがあるんだ:グラフ生成とグラフ比較。
グラフ生成
主要な命令の特定: まず最初に、バイナリ内で重要なタスクを実行する主要な命令を見つけることが必要だ。これらの重要な命令がバイナリの動作を表す手助けをするんだ。
主要な表現の作成: それぞれの主要な命令を簡素化した形で表現できるようにするんだ。こうすることで、あまり重要でない命令と混同しにくくなるよ。
キーセマンティクスグラフの構築: 主要な命令とその簡素化した表現が揃ったら、グラフを作成できる。このグラフでは、ノードが主要な命令を表し、それらの間の接続がプログラム内での流れを表すんだ。
グラフ比較
グラフの直列化: 2つのグラフ(異なるバイナリからの)を比較するために、まずそれらをトポロジカルソートという技術を使ってシーケンスに変換するよ。このソートでアクションの順序を保つことができるんだ。
トークン化: 次のステップは、これらのシーケンスをトークンという小さな部分に分解することだ。これで管理が楽になるよ。
類似性の計算: 最後に、ローカリティセンシティブハッシングという方法を使って、トークンシーケンスを圧縮して比較することができるんだ。これによって、2つのバイナリがどれだけ似ているかを判断できるよ。
提案した方法の評価
この新しい方法の性能は、いくつかの既存のツールと比較して評価されているよ。実験では、さまざまなオープンソースプロジェクトが使われていて、新しい方法が異なるコンパイルオプションや最適化レベルでの類似性検出において既存ツールよりも優れた結果を示したんだ。
実験の設定
実験は、有名なオープンソースプロジェクトで行われて、この方法の性能を評価したよ。評価指標には以下のものが含まれているんだ:
- 精度: 検出されたペアのうち、実際に似ていたものの数を測るよ。
- 再現率: ツールによって検出された実際に似ていたペアの数をチェックするんだ。
結果
この新しい方法は、既存のツールよりも常に高い平均精度を達成したよ。異なる設定や異なる最適化のもとでコンパイルされたバイナリでも、成功裏に類似性を検出できたんだ。これは、従来の方法に比べてかなりの改善を示しているよ。
バイナリ類似性検出の応用
バイナリ類似性検出は、いろんな分野で使えるんだ:
- 脆弱性検出: 異なるバージョンのソフトウェア間で類似した関数を特定することで、脆弱性を追跡し、軽減することができるよ。
- マルウェア分析: バイナリコードの類似性は、悪意のあるコードを理解し、防御策を作る手助けになるんだ。
- 剽窃検出: 学問やソフトウェア開発において、コピーされたコードを検出するのはオリジナリティを保つために重要なんだ。
今後の方向性
今の方法は期待が持てるけど、改善の余地もあるよ。今後の作業では以下のことを探っていくといいかも:
- 広範なコンパイラ対応: もっと多くのコンパイラや異なるアーキテクチャ(ARMなど)で動くようにこの方法を強化する。
- 難読化への対応: 難読化技術が一般的になる中で、これらの変化に対応できる検出方法の改善が重要になる。
- 機械学習の統合: 機械学習技術を使って、検出プロセスにおけるさまざまなトークンの重要性を理解したり評価したりする。
結論
バイナリコード間の類似性を正確に検出する能力は、テクノロジーやセキュリティの多くの分野で重要だよ。提案された方法は、バイナリ内の重要な動作に焦点を当てていて、既存のツールの課題を克服する助けになるんだ。さらなる開発と応用を通じて、この方法はさまざまな領域でバイナリ類似性検出の効果を大幅に向上させることができるよ。
タイトル: SemDiff: Binary Similarity Detection by Diffing Key-Semantics Graphs
概要: Binary similarity detection is a critical technique that has been applied in many real-world scenarios where source code is not available, e.g., bug search, malware analysis, and code plagiarism detection. Existing works are ineffective in detecting similar binaries in cases where different compiling optimizations, compilers, source code versions, or obfuscation are deployed. We observe that all the cases do not change a binary's key code behaviors although they significantly modify its syntax and structure. With this key observation, we extract a set of key instructions from a binary to capture its key code behaviors. By detecting the similarity between two binaries' key instructions, we can address well the ineffectiveness limitation of existing works. Specifically, we translate each extracted key instruction into a self-defined key expression, generating a key-semantics graph based on the binary's control flow. Each node in the key-semantics graph denotes a key instruction, and the node attribute is the key expression. To quantify the similarity between two given key-semantics graphs, we first serialize each graph into a sequence of key expressions by topological sort. Then, we tokenize and concatenate key expressions to generate token lists. We calculate the locality-sensitive hash value for all token lists and quantify their similarity. %We implement a prototype, called SemDiff, consisting of two modules: graph generation and graph diffing. The first module generates a pair of key-semantics graphs and the second module diffs the graphs. Our evaluation results show that overall, SemDiff outperforms state-of-the-art tools when detecting the similarity of binaries generated from different optimization levels, compilers, and obfuscations. SemDiff is also effective for library version search and finding similar vulnerabilities in firmware.
著者: Zian Liu, Zhi Zhang, Siqi Ma, Dongxi Liu, Jun Zhang, Chao Chen, Shigang Liu, Muhammad Ejaz Ahmed, Yang Xiang
最終更新: 2023-08-02 00:00:00
言語: English
ソースURL: https://arxiv.org/abs/2308.01463
ソースPDF: https://arxiv.org/pdf/2308.01463
ライセンス: https://creativecommons.org/licenses/by/4.0/
変更点: この要約はAIの助けを借りて作成されており、不正確な場合があります。正確な情報については、ここにリンクされている元のソース文書を参照してください。
オープンアクセスの相互運用性を利用させていただいた arxiv に感謝します。
参照リンク
- https://github.com/SemDiff4BinaryDetection/SemDiff4BinaryDetection
- https://anonymous.4open.science/r/SemDiff4BinaryDetection-F12C/README.md
- https://zynamics.com/software.html
- https://github.com/googleprojectzero/functionsimsearch
- https://github.com/McGill-DMaS/Kam1n0-Community
- https://github.com/xiaojunxu/dnn-binary-code-similarity
- https://github.com/palmtreemodel/PalmTree
- https://github.com/mrphrazer/msynth