最新AI論文をキャッチアップ

コードの難読化を解除するAI

コードの難読化を解除するAI

深層学習

3つの要点
✔️ プログラミング言語のための新しい学習モデル
✔️ CodeBERTと比較して大幅な性能向上
✔️ いくつかのタスクで興味深い応用

DOBF: A Deobfuscation Pre-Training Objective for Programming Languages
written by Baptiste RoziereMarie-Anne LachauxMarc SzafraniecGuillaume Lample
(Submitted on 15 Feb 2021 (v1), last revised 16 Feb 2021 (this version, v2))
Comments: Accepted to arXiv.

Subjects: Computation and Language (cs.CL)

code: 

はじめに

コード難読化とは、ソースコードの内部的な動作の手続き内容・構造・データなどを人間が理解しにくい形にすることです。これにより、人間がコードを理解することが難しくなり、コードの目的を隠蔽・改竄などを阻止することができます。また、コードを圧縮してネットワークのペイロードサイズを小さくすることもできます(Javascriptの場合)。ただし、これは一方通行の処理であり、元のソースコードに復元することは難しいです。経験豊富なプログラマーでも、徹底的に調査した後ならばある程度はソースコードを理解することができますが、時間がかかり煩雑になります。

BERTのような言語モデルは、主に自然言語処理タスクに焦点を当てており、テキストの一部(~15%)がマスクされ、これらのマスクされた単語を予測するようにモデルが学習されます。これはMasked Language Modelling(MLM)の学習目的に基づいているものです。この手法は、プログラミング言語では問題なく動作するように見えますが、動作はするだけで最適ではありません。本論文はプログラミング言語を対象とした新しい学習目的(DOBF)を提案し、MLMを用いて学習されたモデル(BERT、ALBERT)を大幅に上回ることができることを示唆しました。

プログラミング言語におけるMLM問題点

自然言語とは異なり、プログラミング言語は非常に構造的・構文的です。すなわち表現の自由度はかなり制限されています。そのため、MLMのように入力をランダムにマスキングしても、一般的なMLMタスクほどの課題を与えることはできません。ソースコード中のカンマ、カギ括弧、キーワード(while、ifなど)を予測することは非常に簡単です。なぜなら上述したように、MLMは変数(「queue」や「graph」)のすべての出現箇所をマスクしておらず、いくつかの情報の漏洩(リーク)を許しています。

例えば、変数'queue'は4行目でマスクされていないため、2行目の時点で宣言しなければならないことが容易に推測できてしまいます。すなわち、構文に制限があるため、コード理解がなくてもルールだけで答えを導き出せてしまいます。これらの原因で、モデルの学習パターンが減少する(Javaのような冗長な言語ではなおさらです)。そのため、モデルがコードの意味を"正しく"理解できず、汎化性能が悪くなります。そこでMLMとは違った、別の目的を導入する必要があります。  

Deobfuscation Objective(DOBF)(難読解除の目的)

上の図に示すように、DOBFでは、変数名や関数名のすべての出現箇所が同じマスクで難読化(置換)されます(例:「queue」のすべての出現箇所が「V3」に置換されている)。学習目的は、ソースコード内の元の名前を復元することです。各識別子(クラス名、変数名、関数名)は、pobf ∈ [0,1]の確率で、特別なトークンに置き換えられます。

pobf = 1の場合、すべての識別子が難読化され、pobf = 0の場合、ランダムに1つの識別子だけが難読化されます。i番目のクラス、関数、変数は、それぞれCLASS_i、FUNC_i、VAR_iというトークンで置き換えられます。

実装

DOBFの目的を利用して、sequence-to-sequenceモデルを学習します。難読化されたソースコードが与えられると、モデルは元の名前と、デリミタで区切られた識別子の辞書を予測します。上の図の予測値は次のように表されます。

 

'FUNC_0 bfs | VAR_0 graph | VAR_1 root | VAR_2 visited | VAR_3 queue | VAR_4 neighbor | VAR_5 node'

実験と評価

モデルアーキテクチャは、標準的なエンコーダ-デコーダです。モデルの学習には,19GBのpythonコードと26GBのJavaコードからなるGitHubの公開データセットを使用しています。モデルは、3種類の難読度pobf = {0,0.5,1}、すなわち{1つの識別子:0、半分の識別子:0.5、すべての識別子:1}の難読度で学習されています。

結果

上の表は難読化の度合いを変えて、学習させた結果を示しています。明らかに、ある1タイプの難読化は、別のタイプの難読化には対応できません。すなわち、pobf = 0で学習されたモデルは、pobf = 1で評価するとパフォーマンスが悪くなり、その逆も然りです。ただMLM+DOBFは一緒に使うとモデルの性能が良くなるので、プログラミング言語には相性が良いようです。

上の図は、いくつかのベンチマークおよびタスクにおいて、DOBFとCodeBERTおよび標準的なTransformerとの比較を示しています。DOBFとDOBF+MLMは、python<-->javaコード変換やNatural Language Code Search(NLCS)を含むほとんどのケースで他のモデルを上回っています。しかし、クローンコードの検出(Clone Det)では、CodeBERTが他のモデルを上回っています。

上の図は、完全に難読化されたbreadth-first-search関数をモデルに与えた場合の難読化解除の例です。モデルが意味のある名前を提示することができるので、コードの理解が容易になっています。

単一識別子の難読化解除の応用例

この方法は、現在のソースコードを使って変数名を提案するIDEで使用することができます。PyCharmのようないくつかのIDEがこの方法を採用していますが、彼らのアプローチは単純なヒューリスティックなアルゴリズムに基づいています。

全識別子の難読化解除の応用例

すべての識別子を難読化解除するようにモデルが学習されると、圧縮やセキュリティ上の理由で識別子が変更されたファイルを元に戻すのに使用できます。これにより、コードの可読性が高まり、理解しやすくなります。

結論

このモデルにはいくつかの興味深いユースケースがありますが、簡単に悪用される可能性があることにも注意する必要があります。これらの難読化解除モデルは、変更されたコードを意味のある識別子名を持つ元のコードに戻すことができる可能性を秘めています。システムにマルウェアを導入するために、一旦このモデルで難読化を解除することでマルウェアの導入を容易にしてしまいます。とはいえ、DOBFの目的はMLMを補完するものであり、モデルがプログラミング言語のセマンティックな特徴を理解するのに役立っています。更なる詳細は原文をご覧ください。 

Thapa Samrat avatar
今大阪大学の電子情報工学科で学習している2年生のネパールからの留学生です。 機械学習・深層学習に興味あります。だから、暇なときにそれらについて記事を書いています。

記事の内容等について改善箇所などございましたら、
お問い合わせフォームよりAI-SCHOLAR編集部の方にご連絡を頂けますと幸いです。
どうぞよろしくお願いします。

お問い合わせする