Proj THUDBFuzz Paper Reading: VulSeeker-Pro: Enhanced Semantic Learning Based Binary Vulnerablity Seeker with Emulation

Abstract

Learning based clone detection
优点: 某种程度上解决了传统dynamic search approach和static search approach存在的高time overhead的问题
缺点:精度受限,在工业使用中往往需要人工检查TopM search results

本文工作:
提出工具VulSeeker-Pro

  • 特点:在语义学习后端集成了function semantic emulation(函数语义仿真)
  • 优点:解决了需要人工检查的问题
  • 步骤:
    1. 使用基于predictor的semantic learning来快速预测top-M candidate function,这些function是最可能使得target binary产生漏洞的
    2. 将这些topM candidates放入emulation engine,再获取topN candidate functions
    这里,semantic learning起到了快速筛选作用,而emulation则实现了dynamic trace generation。
    效果:搜索精度提升,time overhead少
    实验:
    对象:6个工业软件,15个已知CVE
    结果:精度明显更高
    具体结果:
  • 在45次搜索中,top1中有40次真漏洞,top5则是43次
  • 比Gemini的精度高出12.33倍和2.58倍
  • 只需要多花大概0.22秒

1. Introduction

意义:使用第三方库+代码未打补丁使得漏洞容易传播,加上二进制程序不易获得->code clone detection
已有工作:

  • clone-based tech,fuzzing在跨平台软件上表现不好
  • 传统clone-based vulnerability search approaches可分为
    1. 静态: 通过分析控制流图(control flow graphs)来识别漏洞对应的二进制代码
    - 缺点:当编译配置不同时,尽管功能相同,cfg可能会有很大差别
    2. 动态:监控程序的runtime traces,并执行equivalence checking between two traces(这里的2traces从何而来)以克服编译配置不同的问题
    - 优点:受到编译配置影响小
    - 缺点:非常耗时,不实用
  • Semantic Learning: 基于学习的方法将低级指令特征转换为高级语义特征
    1. Genius:
    - 用spectral clustering来训练codebook,再通过测量(二分图匹配算法)指定function和codebook之间的语义相似性来detect clone
    - 效果:对于工业应用还不够高
    2. Gemini
    - 沿着function的CFG拓扑结构传递基本块特征
    - deep learning
    - 效果:更强大的函数语义和更高的搜索精度
    - 缺点:假阳太多

两个重要因素:

  1. 高搜索精度:不应该受到编译配置影响
  2. 低time overhead

本文: VulSeeker-Pro
基于语义学习的漏洞搜索工具,后端集成了函数语义仿真

基于学习的漏洞搜索

  1. Genius
  2. Gemini
  3. VulDeePecker: code gadgets + biLSTM,不再人工定义features

基于语义计算的漏洞搜索

执行二进制漏洞搜索实际上是在处理语义相似性检测问题。不过,该方法慢

  1. Bingo: selective inlining + length variant partial trace -> 比对函数语义;function models ->计算函数语义进而检测漏洞
  2. Binsim: 计算aligned system calls-> 更好解决code obfuscation(代码混淆)的问题; dynamic slicing + 最弱的precondition calculation->检测两条执行轨迹的fine-grained semantic
  3. CACompare: 提取semantic signature 同时 模拟执行

本文不同

两阶段

3. Design


主要模块:

  1. semantic learning predictor
  2. emulation engine
    目标:检测目标二进制程序是否包含类似已知漏洞的函数

3.1 Semantic Learning Predictor

Key: embedding vector of function semantics

  1. Feature Extraction:
    1. 用IDA Pro反编译,得到汇编代码
    2. 用IDA Python提取汇编代码的CFG
    3. 提取Genius中提到的6个块间特征和2个块内特征
  2. Semantic Learning
    • Tensorflow,为了公平用Gemini模型
    • DNN, T次迭代(e.g T=5),考虑的是在当前basic block之前可能被执行的代码,aggregation用到的是点特征加和
  3. Similarity Calculation
    • cos距离

3.2 Emulation Engine

  1. Argument Recognition
    • function arguments包括register argument和stack args。
    • 主要基于汇编
    • 前3个参数一般都存在EAX, EDX和ECX,可被IDA pro的伪代码模块处理
    • 每个函数都会有个stack pointer指向stack start position
    • 当使用IDApython时,若一个stack address在这个start pos之外,那么这就是个stack argument
  2. Function Emulation
    1. 生成随机数列,为两个function(target binary和已知漏洞的)分配相同随机数列
    2. 使用pyVEX将汇编转为VEX-IR,更易操作
    3. 记录dynamic execution trace,称为semantic signature
      • 如果调用其他函数,会试图也模拟这个函数并记下来
        - solves the predictive barrier of function inlining to the semantic learning approach(为何与inline有关?一个inline,另一个可能没有)
      • 如果遇到unknown memory reference,分配默认值
      • signature包含input values, output values, comparison opcodes/operands, library function calls
  3. Reordering Calculation
    • 用Jaccard相似度系数算距离

4. Results

实验环境:机器环境,GPU,系统,predictor模型,hyper pars的值
Benchmark: CVE网站选15个漏洞,6个广用程序,GCC4.8.4编译O0-O3四个优化级别,O3中的weak code为源。共计45个实验

4.1 Accuracy

4.2 Time Efficiency

5. Discussion

  • 认为工程师更喜欢不需要手动识别的工具
  • TODO: 增加来自多个二进制程序的离散样本来增强泛化能力
  • 需要防止过度拟合
  • 从x86转到其他架构不难

6. Conclusion

posted @ 2020-12-30 23:26  雪溯  阅读(326)  评论(1编辑  收藏  举报