Modeling and Discovering Vulnerabilities with Code Property Graphs
S&P 14
提出代码属性图的建模方式,将抽象语法树、控制流图、程序依赖图结合在一起。
定义属性图(property graph):[V,E,λ,μ]
是由顶点(vertex/node)、边(edge)、标签(label)、属性(property)
V是图中的顶点集合,
E是图中有向边的集合, E ⊆ (V × V )
λ是给图中每条边分配标签的标记函数,λ : E → Σ
μ是给顶点和边分配属性的函数,μ : (V ∪ E) × K → S
构建代码性质图:
-
将AST转换。GA=[VA,EA, λA,μA]
顶点VA由AST中的树节点组成;边EA是AST中的边,由λA函数给其分配标签(这个标签是?);
对每个节点分配属性key{code,order}–value,code表示的是节点的value是operator(操作符)还是operand(操作数),order表示的是节点的在AST中的顺序(这个顺序是指什么顺序);key的value是表示节点的原本值(即是什么操作符或操作数)
-
转换CFG。GC=[VC,EC,λC,.]
顶点VC只是在AST中的statement(语句)和predicate(谓词)这两种 即 code 只有 STMT 和 PRED 两种。
每条边的标签是ΣC ={true, false, } 分别表示这个是TRUE条件判断还是FALSE条件判断,还是直接顺序执行的语句
-
转换PDG。 GP=[VC,EP,λP,μP]
顶点也是和CFG中的顶点一样,只考虑statement和predicate 这两种code。
每条边的标签就是 ΣC ={C,D} C表示 控制流依赖,D表示数据流依赖。
-
融合以上三种图 G =[V, E, λ, μ]
顶点就是AST中的顶点,V = VA
边是三种图中的边的并集 E = EA ∪ EC ∪ EP
属性和边的标签的映射规则当然也是并集 λ = λA ∪ λC ∪ λP and μ=μA ∪ μE,
作者通过对一个ssh的缓冲区溢出漏洞进行分析,总结了以下几个特征:
-
sensitive operations 敏感操作。
什么叫敏感操作?call protected function,copying into buffers or the allocation of memory need to be describable.
调用受保护的函数 ,分配内存的大小是可变的,拷贝到内存的数据是可变的 。AST
-
Type usage 数据的类型 。AST
-
Attacker control 能被攻击者控制。数据流分析 PDG
-
Sanitization 安全检查。对能被攻击者控制的数据缺乏安全检查 CFG
作者然后定义了从几种类型的漏洞模式:
-
syntax-only vulnerability 。
仅从语法,句法上就能表示出来的特征。
比如说格式化字符串中的不安全的参数(这些不是常量),比如整数溢出(数值与类型不匹配),
但仅从语法或句法上的这些特征来分析是无法知道哪些能够被攻击者控制,因为这些程序语句之间的关系,仅从语法角度上进行模式匹配是无法做到的。
-
control-flow vulnerability 。
结合控制流图的条件,可以知道程序内部各语句的执行顺序。这些与执行先后顺序联系强烈的漏洞可以容易被检测。
resource leaks、failure to release locks、UAF
-
taint-style vulnerability
先将源码中每行代码的通过注意力机制,重点关注在上述与漏洞特征相关的语句(定位),然后再将这些语句提取出来,通过卷积神经网络对这些程序的部分语句进行分类,是否有漏洞,以及属于哪种类型???