Page 95 - 《软件学报》2020年第11期
P. 95

段旭  等:基于代码属性图及注意力双向 LSTM 的漏洞挖掘方法                                                3411


                    定义 2(关系特征张量).  设 G=(V,E,λ,μ)为代码属性图,它有 n 个节点 V={v 1 ,v 2 ,…,v n },T(G)=(t ijk )为 G 的特征
                 张量,则定义向量 K ij =(t ij1 ,t ij2 ,…,t ij144 )为 v i 和 v j 的关系特征向量.
                    本文将关系特征向量 K ij 拆分为 5 个字段,分别为 TYPE var (i),TYPE var (j),OP(i,j),TYPE ast (i)和 TYPE cfg (i),每个
                 字段都对不同特征进行编码.据此,可以得到关系特征向量 K ij 的另一种表达形式:
                                      K ij ={TYPE var (i),TYPE var (j),OP(i,j),TYPE ast (i),TYPE cfg (i)}  (2)
                 其中,{⋅}代表向量拼接.K ij 的每个字段是一个长度为|S|的向量,其中,S 是该字段编码的目标特征的集合.由于不
                 同字段对不同特征进行编码,因此不同字段的目标特征的集合 S 不同.
                    (1) TYPE var (i)和 TYPE var (j)
                    TYPE var (i)和 TYPE var (j)分别对 v i 和 v j 的数据类型进行编码,其均为长度为 19 的向量,并且目标特征集为 S=
                 {short,int,long,char,float,double,bool,const,static,*,void,unsigned,signed,struct,union,enum,function,constant,else}.
                 在 TYPE var (i)字段中的 t ijk 可表示成如下形式.
                                               ⎧ 1,  v 所述变量的数据类型包含     f  ( ) k
                                           t = ⎨  i                                                   (3)
                                           ijk
                                               ⎩ 0, v 所述变量的数据类型不包含      f  ( ) k
                                                  i
                 其中,0≤k≤18,f(k)为 K ij 中索引为 k 所对应的特征,f(k)∈S.
                    同理,可将在 TYPE var (j)字段中的 t ijk 表示成如下形式.
                                              ⎧ ⎪ 1,  v 所述变量的数据类型包含    f  ( ) k
                                                  j
                                           t = ⎨                                                      (4)
                                           ijk
                                              ⎪ ⎩ 0, v 所述变量的数据类型不包含     f  ( ) k
                                                  j
                 其中,19≤k≤37,f(k)为 K ij 中索引为 k 所对应的特征,f(k)∈S.
                    (2) OP(i,j)
                    OP(i,j)对 v i 和 v j 之间的运算符进行编码,其是长度为 29 的向量,并且目标特征集为 S={+,−,*,/,%,^,=,|,&,||,
                 &&,<,>,<=,>=,==,!=,+=,−=,=,/=,%=,^=,|=,&=,<<,>>,<<=,>>=}.在 OP(i,j)字段中的 t ijk 可以表示成如下形式.
                                                  v
                                            ⎧ ⎪ 1,  v 和 所述表达式之间的运算符为     f  ( )k
                                                   j
                                                i
                                        t = ⎨                                                         (5)
                                         ijk
                                                  v
                                            ⎪ ⎩ 0, v 和 所述表达式之间的运算符不为       f  ( )k
                                                   j
                                                i
                 其中,38≤k≤66,f(k)为 K ij 中索引为 k 所对应的特征,f(k)∈S.
                    (3) TYPE ast (i)
                    TYPE ast (i)对 v i 的父 AST 节点的所述表达式类型进行编码,其是长度为 57 的向量,其目标特征集 S 对应 CPG
                 中的 57 种 AST 节点的 type 属性值,例如 CallExpression 和 ConditionExpression.在 TYPE ast (i)字段中的 t ijk 可以
                 表示成如下形式.
                                                             v
                                          ⎧ ⎪ 1,  v 是 v的父 AST节点且 的 type属性为 f  ( )k
                                                 i
                                                                 j
                                              j
                                      t = ⎨                                                           (6)
                                       ijk
                                                               v
                                          ⎪ ⎩ 0, v 不是 v的父 AST节点且 的 type属性不为  f  ( ) k
                                                                   j
                                                   i
                                              j
                 其中,67≤k≤123,f(k)为 K ij 中索引为 k 所对应的特征,f(k)∈S.
                    (4) TYPE cfg (i)
                    TYPE cfg (i)对 v i 所在语句的 CFG 节点的所述语句类型进行编码,其是长度为 20 的向量,其目标特征集 S 对
                 应 CPG 中的 20 种 CFG 节点的 type 属性值,例如 ReturnStatement.需要注意的是,在 CPG 中,CFG 节点是 AST
                 节点的子集,因此,此处 CFG 节点的 20 种 type 属性值同样是 AST 节点 57 种 type 属性值的子集.在 TYPE cfg (i)
                 字段中的 t ijk 可以表示成如下形式.
                                             v
                                                                v
                                       ⎧ ⎪ 1,  v 是 所在语句的 CFG节点且 的   type属性为 f  ( )k
                                   t = ⎨   j  i                     j                                 (7)
                                    ijk
                                                                  v
                                               v
                                       ⎪ ⎩ 0, v 不是 所在语句的 CFG节点且 的    type属性不为   f  ( )k
                                                                      j
                                           j
                                                i
                 其中,124≤k≤144,f(k)为 K ij 中索引为 k 所对应的特征,f(k)∈S.
                    图 4 为图 3 所示代码属性图切片后的特征张量.
   90   91   92   93   94   95   96   97   98   99   100