Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

Control-Flow Restrictor: Compiler-based CFI for iOS

论文下载

Abstract

针对应用软件的运行时攻击很多,iOS上也不例外。对付这种攻击最好的技术就是CFI(Control Flow Integrity)。文章介绍如何在编译器中实现CFI,可使得该技术广泛的部署于iOS设备上。作者是扩展了iOS的编译器LLVM,在源代码中插入一些指令来实现这一目的。

Introduction

介绍了一runtime攻击,以及现有对付runtime攻击的方法。重点提到了针对iOS的MoCFI这篇文章。MoCFI最大的弱势在于其需要越狱,无法进行正常的部署。

Background

定义攻击模型:攻击者不能在程序编译时或加载时展开攻击。在程序运行时,攻击者如果不利用程序的指令,也不能个性代码内存区域或寄存器的值。但是,她可以读取代码内存区域,读写包括堆和栈在内的数据内存区域。此外,她还可以控制程序的所有输入。

其它背景知识包括苹果生态系统,ARM处理器中的跳转类型,CFR能够处理的jump包括constant jump,indirect jump,constant function calls、indirect function calls、returns 和objc_msgSend。文章中给出另外它不能支持的jump,包括exception、signals and interrupts、inline assembly。

General Approach

这一节是围绕如何抵御control-flow hijacking攻击,均围绕CFI展开,核心思想是各个指令只将control-flow转向指定的某个或某些位置,即可信的位置。

首先要正常编译和运行程序,记录这个程序的控制流。一个程序的运行是按照指令顺序运行,碰到跳转后指令顺序发生转移。因此每个指令都有若干个“允许”的后继者。顺序指令加上“允许”的后继者构成conftrol-flow wish(CFW)。利用CFW,对程序的CF进行建模,可以得出control-flow graph(CFG)。如果程序的运行按照CFG进行,那么这个程序的control-flow integrity(CFI)成立。在每个jump之前,如果根据CFW加上代码,那么程序的jump将参照CFW进行。

Implementation

文章利用了LLVM和Clang,即开发了若干个LLVM的pass(这里不理解)来提供所需的功能。为方便起见,编译时只实现了ARM指令集,不实现Thumb指令集。具体包括以下步骤:

  • 合并代码的模块
  • 提取CFW语义信息
  • 提取开发人员的CFW
  • 插入CFC
  • 汇编

Evaluation

  • 作者所使用的测试平台是 iPod Touch 4G iOS v4.3.3。
  • 作者描述了安全的原因,即jump之前有一个check,如果check失败,则禁止jump。
  • 接下来是使用benchmark进行测试,测试利用了5个应用程序,包括加密与quicksort(iOS的许多benchmark 测试都会使用)。
  • 测试结果表明对于jump特别频繁的程序,程序运行时间会迅速增加。
  • 但本节最大的缺憾是文章并未构造一个runtime攻击来检测方案的可行性。