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 ,

具体的な実施:

  • データ.Linux kernel,QEMU,Wireshark,FFmpegから.主にこれらのプロジェクトのcommitsからデータ抽出を行う.具体的には、(A u t o mated identifification of security issues from commit messages and bug reports,fse 17)
  • を参照してください.
  • は、抽出された関数を図に変換する.オープンソースツールJoernを用いてASTとCFGを生成し,明らかに誤った関数と生成できないAST CFGの関数をフィルタリングした.DFGで修正しました.元のDFGは変数の依存関係に基づいてタグ付けされるため,edgeのタイプが急激に増加するため,これらのタイプをまとめ,3種類で表す.LastRead(DFG_R)the immediate last read of each occurrence of the variable(変数が現れるたびに最近の読み取りを表す)LastWrite(DFG_W)the immediate last write of each occurrence of the variable()ComputedForm(DFG_C)賦値操作では、等号左変数と等号右変数の関係はあまり理解されておらず、元のDFGのエッジのタイプがどのように決定されているか知りたい.
  • ネットワーク構築.埋め込み層では,初期ノードの次元数は100であり,これはWord 2 vecの次元数であると述べた.では、各ノードにはcode部分のほかにtype部分がありますが、そのtype部分はいくらですか.どうやって確定しますか.著者らはgated graph recurrent layerにおいて,隠蔽状態の次元数は200,time stepは6
  • であるとは言わなかった.

    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)