Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

MARX: Uncovering Class Hierarchies in C++ Programs

论文下载

INTRODUCTION

  • 设计与实现了 MARX,一个可以直接重构没有RTTI信息和使用任意编译选项编译的二进制文件的class hierarchies 的框架
  • 使用超过80M的二进制代码进行实验,vtables可以以很高的精确率恢复出来
  • 实现了两个安全相关的应用:vtable protection; type-safe object reuse

TECHNICAL BACKGROUND

  • RTTI: 指向metadata数据结构的指针
  • Offset-to-Top: 多继承的时候需要的选项
  • vcall 结构 in Itanium C++ ABI on x86-64

    mov RDI, thisptr call [vtblptr + x]

Fig

Fig

ANALYSIS APPROACH

Vtable Extraction

采用了以下六个特征帮助提取vtable:

  • H-1 Vtables 在只读段上
  • H-2 只有最前面的function entries会被vtblptr引用
  • H-3 Offset-to-Top 有一个范围,而且其不是relocation entry
  • H-4 RTTI 指向数据段或者是0
  • H-5 function entry 指向代码段或者是 relocation entry
  • H-6 前两个function entries 可能是0

Static Analysis

Overwrite Analysis

  • 构造时,基类A的构造函数率先调用,之后C的构造函数调用,所以A的vtblptr会被C的vtblptr重写
  • 析构时,C的析构函数县调用,所以C的vtblptr会被A的vtblptr重写

利用以上的特点:

  • 通过观察一个vtblptr是否被另一个vtblptr重写,来判断两个类的关系。
  • 观察 构造函数和析构函数

Fig

Vtable Function Entries

  • 虚函数并不需要重写
  • 所以对于基类和继承类的vtables,可能有多个entries指向同一个函数
  • 通过判断vtables是否指向同一个函数,来判断两个类是否关联
  • 由于编译器优化,可能导致误报

Inter-Procedural Data Flow

  • Forward Edge
    • 虚函数通常是间接调用
    • 通过上下文关系来解析间接调用指令
    • 如果一个vcall被不同的vtable的对象引用,那么这些vtable是相关联的
  • Backward Edge
    • 考虑返回值,可能返回不同的对象

Fig

Inter-Modular Data Flow

首先分析共享库,并根据返回值和vtblptr重写关系建立数据流信息。如果一个共享库的函数被调用,那么这些信息被添加到当前相关的context中辅助分析。

IMPLEMENTATION

  • VEX-IR from the Valgrind project
  • table extraction: IDAPython CFG
  • static analysis: data tracking engine (基于中间语言)

确定入口点

Path Creation and Convergence

  • 值得深入分析的basic block(interesting block),满足三个条件中的一个:

    • an indirect call (i.e., a possible vcall)
    • a (direct) call to a new operator
    • an instruction operating on a vtblptr
  • 设立阈值t,一个函数有t个及以上的interesting block,生成路径深入分析

  • 保证循环只访问一次

Virtual Callsite Identification

  • conservative mode: an indirect call is only identified as vcall if the thisptr holds a known object and a vtable is involved when computing the target address

  • non-conservative mode: an indirect call is considered to be a vcall simply if the vtable is involved in the computation of the target address

APPLICATIONS

VTable Protection for Binaries

类似于CFI

在vcall之前会插入一个标签检查,检查函数类型是否一致

  • Dynamic Analysis
  • Slow Path:当函数类型检查失败时,深入分析

使用Dyninst进行插桩

Type-safe Object Reuse

  • an allocator with type-safe object reuse support
  • a library to instrument object allocations

保证同一个类型才能重用相同类型的内存pool

预先分析建立(location, size, type)信息,在runtime时并保存在hash table里,(location, size)为key,劫持new new[]对象

EVALUATION

  • GCC 4.8.5
  • Ubuntu 14.04 LTS
  • Intel Core i7- 2600 CPU with 16 GB of RAM.

Class Hierarchy Reconstruction

the ground truth is obtained by parsing the RTTI of the target application

Fig

Virtual Callsite Targets

使用 VTV (Virtual Table Verification) GCC pass 生成ground truth,MySQL Server 和 VBoxManage 在编译的时候失败,因此没有数据

Fig

VTable Protection And Type-safe Object Reuse

Fig