2000P's Blog

最初のページ

nlp技術はプログラム分析にも役立ちますか?

著者 puzio 時間 2020-03-26
all

「SIGAI」に注目して、「星標」または「置頂」を選択します。

オリジナル技術文章、第一時間取得

SIGAI特約作者

陳さんの庚

南京大学

周知のように、マシン学習の分野では、コンピュータ視覚、自然言語処理、音声認識の技術はすでに非常に成熟しています。また、システムの安全の分野では、多くの研究者が、非常に多くのデータを使って分析を試みています。

プログラムの分析を例にとって、ソースコードをコンパイルして、中間言語、送金コードを獲得してから、バイナリまで、最終的に実行するのは複雑なプロセスです。研究者は、バイナリから直接関連情報を得て、自身の研究目的を達成することを望んでいます。これはいわゆる「逆工程」です。しかし、逆工程の中で、自身は非常に多くの問題を持っています。例えば、情報の欠落、情報の不等さ、ひいては人が判断できない条件と選択肢は、常に研究者を困らせています。したがって、私たちは機械学習を通じて、より多くの情報を発掘し、より巧妙な方法で最終的な結果を得たいと思います。

バイナリ類似度はプログラム分析において非常に重要な一環であり、その応用範囲は非常に広く、該当するプログラムの類似度を知っていれば、コードクローニング検出、悪意のあるプログラム検出に対しても良好な補助を与え、さらに決定的な役割を果たすことができる。しかし、プログラムは商用化の過程で、ソースコードが逆輸入されるのを防ぐために、簡単に入手できます。そのため、19年のS&P(CCF-A)では、NLP分野のPV-DMのアルゴリズムを利用して、巧みに移行し、バイナリ類似度比較において、混淆と情報欠落の問題を解決しました。

上の図のように、同じソースコードは異なるコンパイルオプションを通じて、異なる構造のバイナリ形態を得ることができます。左から右には、同じソースからgcc O 0、gcc O 3でコンパイルされ、LLVM混同制御ストリームとLLVMダミー制御ストリームのコンパイルの結果です。この4組のバイナリのコンパイル結果は全く違っていて、従来の方法や既存の方法が扱いにくく、非常に厄介であることが分かります。

したがって、構造化情報を保持することができ、意味情報を抽出することができるより良い方法が必要である。この文はT−SNEのクラスター法により,すべての動作指令と動作数を可視化した。

図から見ると、基本的には、同じクラスの操作数またはオペレータの「距離」が比較的近いものである限り、その意味的特徴が比較的近いことが証明されている。伝統的な方法を比較することによって、例えばwrod 2 vecは、このような問題をよりよく解決することができます。

しかし、意味の問題を解決する以外に、二進法の構造的な問題が早急に解決されなければならない。混淆と非混淆の二進法を類似度と比較するのは難しい問題である。幸いなことに、NLP領域にはすでに同様の問題が解決されています。PV-DMです。その中心的な考えは、構造化された情報を得るために、段落に関連するフィールドを多く格納することである。下の図のように、「The cat sat on a mat」という言葉を例にとって、「sat」という単語の対応ベクトルを抽出すると、段落IDと前の2つの単語と後の2つの単語のベクトル次元とを結合して平均値をとり、最後にsigmoidの関数で最終的なベクトル計算結果を得ることができます。

英語の自然言語の分野では、テキストとアセンブリ言語は非常に近いですが、直接PV-DMを用いてアセンブリ言語の処理に用いることはできません。しかし、参考になるところが多く、このような問題のモデリングを助けることができます。

図中のこの例示的なコードを例にとって、私達の目標は「push rbx」というコードを定量化し、PV-DMアルゴリズムの思想を参考にして、コンテキストに対する獲得、すなわち「mov rbp,rsp」と「sub」です。RSp、138 h」のベクトルは、対応して二段のベクトルを得て、それらのこのコンパイル文の2つの操作数に対応するベクトルに対して平均値をとり、オペレータに対応するベクトルをスペルします。これらの2つのアセンブルステートメントに対する量子化動作をそれぞれ完了した後、コアステートメントに対するマッピング関係を通じて、この3つのアセンブルステートメントに対してベクトル平均値をとり、さらにsigmoid関数を通じて、最終的な結果を得ることができ、最終的なベクトル表現を得ることができます。

周知のように、同じソースコードはO 2とO 3のコンパイルを経て、その二進法の表現は比較的似ているかもしれません。O 3はO 2より多く出ているコンパイルオプションで、多くはなく、条件が比較的厳しいです。しかし、O 0とO 3によってコンパイルされたソースコードを比較すると、類似度は人の目には分かりにくいです。全体の大きさだけではなく、Baicblockの個数と内在するロジックにも表れています。

図から見れば、前の仕事はO 2とO 3の比較では比較的納得できる比較結果がありますが、O 0とO 3では、その結果はほとんど受け入れられません。この仕事の結果から、それぞれの最適化レベルの表現において、その結果は納得できるものであることがわかる。このPV-DMベースの新しい表現は、やはり非常に効果的な結果があり、その意味と構造化情報を同時に表現できることがわかる。

更に驚くべきことに、LLVMなどのツールの混淆を経た後に、その類似度の検出率はやはり比較的に高くて、しかもその競争の方法と原始のPV-DMの方法だけあることができて、それが元の構造化の情報の還元の程度の高さに対して見ることができます。

対照的に、商用化ソフトについてはしばしば混淆があるが、最適化レベルは事前に判断できる。したがって、このような二進法類似度コントラスト問題に対しては、混淆に基づく問題を解決すべきであり、このような問題がより一般的に存在することを見ることができる。混淆されたバイナリの類似度を比較できると、より多くのシーンが適用されます。例えば、本論文では、公開された脆弱性データベースを比較しても、良い発見があります。異なるコンパイラ、異なる最適化等級、異なる工程におけるheartbledの脆弱性については、それぞれの程度の検出があり、その後の脆弱性検査作業に新たな啓発を与えた。

この文章は実際にはNLP領域におけるPV-DMの方法を利用して啓発されており、意味と構造化情報をバイナリの表現に取り入れる方法を巧みに解決している。しかし、既存の多くの仕事は、マシン学習の方法をプログラム解析の領域に導入するために、最も頭を悩ます点は、バイナリをどのように適切なベクトルに表現するかということであり、同時に、掘削が必要な関連語義を含む。既存の多くの方法は、プログラムを所定の長さのシーケンスセグメントに処理しながら、これらのフラグメントをword 2 vecに入力し、関連する情報以上の以下の確率の形式ベクトルを出力して結果を表現することである。しかし、筆者は、どのようにバイナリをより良く表現するかというと、より大きな点は適切なデータで適切なことをし、強い関連の内容をモデルの中に組み入れて、最も緊密なマッピング関係を得ることが一番ふさわしいと思います。

関連文献:

[1]Ding S H,Fung B C M,Charand P.As 2 vec:Boosting static representation robustness for binary clone search against code off scation[C]/As 2 Vec:Boosting Station:Boostic Station Representration Rosplation。

[2]Hu Y,Wang H,Zhang Y,et al.A Semantics-Based Hybirid Approach on Binary Code Simillary Comparrity Comparion[J].IEEE Transation on Software Engining,2019.

[3]Alon U,Levy O,Yahav E.code 2 seq:Generanting sequences from structred representation s of code[J].arXiv preprint arXiv:1808.01400,2018.

本文はSIGAIオリジナルです

もし転載するなら、本購読号にメッセージを送ってください。

全文PDF見http://wwww.tension finity.com/paper_201.

右下の「美しい」をクリックしてください。