Devign
4295 ワード
Devign: Effective Vulnerability Identifification by Learning Comprehensive Program Semantics via Graph Neural Networks
NIPS 2019
データセットhttps://sites.google.com/view/devign
識別された粒度は関数レベルで、関数を図にマッピングします.(V,X,A).mは図中のノードVの総数であり、dは各ノードvjの特徴ベクトルxjの次元数である.Xはすべてのノードの特徴ベクトルからなるノード特徴行列X∈Rmである×d.A ∈{0*,* 1}k×m×mは,隣接行列であり,kはエッジのカテゴリ数であり,eps,t∈Aは,ある2つのノード間のエッジがタイプpのエッジに属する場合,その値は1であり,そうでなければ0であることを示す.
著者らは4つのエッジ表現タイプを融合させた.まず最も基本的なASTノードを図のノードとし,次にASTエッジの属性,制御フローチャートのエッジ属性,データフローチャートのエッジ属性,Natural code sequence(著者自身が定義したプログラミング論理順のエッジ属性)を加えた.各ノードには2つの属性codeとtypeがあり、codeはノードに含まれるコードのベクトル表現を指し、typeはこのノードのタイプのlabel符号化である.そして,この2つの表現をつなぎ合わせてノードのベクトルとして表す.△ここで疑問があります.①ここのノードのコード部分は、すべてのsourceコードfileにWord 2 vecが行われています.すなわち、トレーニングセットとテストセットが含まれています.では、新しい部分に出会ったら、これらのデータセットにないコードはどう処理しますか.②このtypeはいくつかの種類があります.③これは直接2つのベクトルをつなぎ合わせて、どのようにつなぎ合わせますか.
著者らはGated Graph Recurrent layerを用いた.ここでは、前述したノードの特徴ベクトルxjと、ノード状態ベクトルhjとのデータを強調する.これらのベクトルをnode state vectorに変換する.どうやって作ったの?Node state vectorの次元はz≧d(dは特徴ベクトルの次元)であり、node state vectorの前面部分は特徴ベクトルxjであり、その背面部分はゼロから補完される.hj1 = [xjT , 0]T ,
具体的な実施:
Devignコードロジック
主に3つのブロックに分けることができます
コード属性図create taskの生成
まず生成した元のデータファイルjsonフォーマットをデータ整理する.元のjsonフォーマットは、各関数にproject、commit_の4つのkeyがあります.id、target、func、jsonファイルをdataframeのフォーマットに変換します.その後dataframeを再クリーンアップします.プロジェクトとcommit_idの2つのcolumnsは削除され、funcとtargetのみが保持されます.
次に、joernはC/C++ファイルのみを処理し、jsonのfuncソースフォーマットはstringフォーマットであるため、これらの関数ソースを一括処理します.
その後、サブプロセス呼び出しjoernは、各関数のソースファイル生成コード属性図func{index}.bin
を解析するために呼び出される.次に、各コードプロパティマップのインデックスを作成します.subprocess.run()
。
https://www.liujiangblog.com/course/python/55
次に,生成したbinファイルをインデックス情報に基づいて解析し,解析スクリプトを実行して関連情報を抽出する.これらの情報にもインデックスが作成されます.情報格納フォーマットrunScript("graph-for-funcs.sc").toString() |> func{index}info.json
を実行すると,関数のコード属性図の情報ノードとエッジの情報が抽出される.
次に、データのフォーマットを調整し、各関数のプロパティマップ情報CPG、インデックスindex、関数ソースコードfunc、ラベルtargetをすべて1つのdataframeに統合し、シーケンス化pickleストレージを行う.
コード属性図をEmbed taskに埋め込む
pickleに格納されている情報を読み出してdataframeに変換します.次にfuncのcolumn,すなわち関数ソースコードをtoken解析する.解析が終わったらcolumnの名前をfuncからtokenに変更します.
次にcpgのノードを処理する.新しいnodeのcolumnを作成します.ここでのnode情報はcpgを解析し、codeのあるnodeとlineのみを保持する.numberプロパティのnode.
その後nodeのcodeを語に埋め込み、前trainしたWord vectorを使います.次にnodeをつなぐタイプlabelがノードの特徴ベクトルであり,その後この特徴ベクトルをtensorに変換する.
最後にnodeのedgeを埋め込み、
図ニューラルネットワークは学習過程で主に2つの処理があり,1つは中間aggregationと最後のreadoutである.Aggregationとは,ノード状態の更新を行うことである.ネットワークの各層では、各ノードにも異なる特徴ベクトルfeature vector(CNNのfeature mapに類似)がある.Readoutは、すべてのノードの特徴ベクトルを1つの図に統合する特徴ベクトルである.主にspatial-based modelと
図には多くのノードがあり、LSTMと同様に各層
DeepGraphLibrary
NN4G (Neural Network for Graph)
DCNN(Diffusion-Convolution Neural Network)
DGC(Diffusion Graph Convolution)
MoNET(Mixture Model Network)
GraphSAGE
GAT(Graph Attention Networks )
GIN(Graph Isomorphism Network)
T(Mixture Model Network)
GraphSAGE
GAT(Graph Attention Networks )
GIN(Graph Isomorphism Network)
subprocess.run()
。
https://www.liujiangblog.com/course/python/55