(转) Xcode 7 Bitcode

Xcode 7 Bitcode的工做流程及安全性评估

2015-12-18 06:13 编辑: suiling 分类:iOS开发 来源:FreeBuf黑客与极客

7427ea210a1712a7bcb941.jpg

简介html

随着 Xcode 7 的发布,苹果为 Xcode 增长了一个新的特性 Bitcode [1]:前端

302.png

新的特性每每意味着新的攻击面。本文首先介绍什么是 Bitcode 及 Bitcode 相关的工做流程,在熟悉了 Bitcode 的工做流程后,接下来是评估 Bitcode 相关的攻击面,最后介绍针对各个攻击面的测试方法及目前的测试结果。ios

什么是 Bitcode后端

简单来讲,Bitcode 是 LLVM-IR 在磁盘上的一种二进制表示形式。关于 Bitcode 详细描述,请参考[2],这里会用例子来让你们对 Bitcode 有个感性认识。安全

先写一个简单的 C 程序,功能是计算两个数的和,代码以下:服务器

1
2
3
4
5
int add(int a, int b)
{
       int c = a + b;
       return  c;
}

将如上程序保存为 add.c,而后咱们将源程序编译成 Bitcode:app

1
clang -emit-llvm -c add.c -o add.bc

执行如上命令会生成 add.bc,咱们使用二进制编辑器打开生成的文件,查看文件内容:编辑器

14502379081971.png

因为 Bitcode 是 LLVM-IR 的二进制表示形式,如上图,在不了解编码方式的前提下基本不可读。下面咱们把 Bitcode 转换成文本形式:ide

1
llvm-dis add.bc -o add.ll

用文本编辑器打开 add.ll,能够看到 add 函数的 LLVM-IR 内容以下:函数

303.png

对比源码与已经注释过的 add() 函数的 LLVM-IR 表示,你们应该对 LLVM-IR 有个感性认识了,下面咱们一块儿看下 Bitcode 的工做流程。

工做流程

苹果关于工做流程的描述:

“ When you archive for submission to the App Store, Xcode compiles your app into an intermediate representation. The App Store then compiles the bitcode down into the 64- or 32-bit executables as necessary.”

如上的工做流程能够分为两个阶段:

  1. 在将应用上传到 AppStore 时,Xcode 会将程序对应的 Bitcode 一块儿上传。

  2. AppStore 会将 Bitcode 从新编译为可执行程序,供用户下载。

下面会将 Bitcode 相关的完整的工做流程分解为以下几个问题或子过程并分别作说明:

  1. Where is the Bitcode?

  2. 嵌入 Bitcode 的方法

  3. 从 Bitcode 生成可执行程序的方法

Where is the Bitcode?

参考苹果的描述,只有在 Archive 时才会生成 Bitcode,因而创建了一个测试工程:

304.png

执行 Archive,而后查看生成的包结构:

305.png

通过分析在如上的目录中并无直接找到 Bitcode,接下来检查生成的 MachO。使用 MachOView 加载生成的 MachO,结果以下图:

306.png

从上图能够看到最终的可执行程序中多了 LLVM 相关的 Segment 与 Section。继续查看对应的 Section 的信息:

307.png

如上图,Section __bundle 中保存的是一个 xar 文档,提取出 xar 文档,而后使用以下命令解开文档:

1
解开:xar -x -f XXX.xar

解开后,能够看到 Bitcode 文件。

总结:程序对应的 Bitcode 被 Xcode 打包成 xar 文档,嵌入的 MachO 中。

下面咱们看下在 MachO 中嵌入 Bitcode 的方法。

嵌入 Bitcode 的方法

方法一

经过对比 Archive 与非 Archive 时的编译参数,发现只要在以下图所示的位置添加编译参数:-fembed-bitcode,便可让 Xcode 普通编译时也在 MachO 中嵌入 Bitcode:

方法二

方法一虽然很方便,可是 IDE 作了太多工做,不便于理解具体过程,接下来咱们本身编译可执行文件。从源代码生成可执行程序主要分为:编译、连接两个过程,为了控制这两个过程,下面会讲解 Makefile 的配置,及这两个过程用到的参数。

在使用 Makefile 编译 iOS 程序时,有些通用的配置,以下的通用配置,供你们参考:

308.png

以 main.m 为例说明编译须要的参数:

309.png

将 main.o,AppDelegate.o,ViewController.o 连接成可执行程序的参数:

310.png

你们把如上的 Makefile 片断稍加修改,整理到一个 Makefile 文件中,就能够经过 make 命令嵌入 Bitcode 到可执行程序。

方法三

在这个方法中咱们会将上面的步骤进一步分解,具体过程为:

源码→Bitcode→xar→可执行程序

源码→Bitcode

在这个过程当中咱们将 iOS 应用的源码编译成 Bitcode,下面会 main.m 为例来讲明使用的参数:

311.png

完成这个过程后,咱们能够获得三个Bitcode 文件:

  • main.bc

  • AppDelegate.bc

  • ViewController.bc

Bitcode→xar

在这一步咱们会将如上获得的三个 Bitcode 文件打包到一个 xar 文档中。打包没什么特别,须要注意的是须要与 Xcode 生成的 xar 保持兼容,具体参数以下:

生成:xar –toc-cksum none -c -f BC.xar main.bc AppDelegate.bc ViewController.bc

xar→可执行程序

为了简化过程,这里咱们会跳出 Makefile,使用 Xcode,首先清除以下的编译参数:

312.png

将刚刚生成的 BC.xar 拷贝到测试工程的根目录:

313.png

编辑工程设置的 Other Linker Flags,添加:-Wl,-sectcreate,__LLVM,__bundle,$(SRCROOT)/BC.xar,以下图:

314.png

编译程序,查看生成的 MachO 文件,能够看到 Bitcode 已经被添加到了 MachO 中。

如上咱们介绍了在 MachO 中嵌入 Bitcode 的方法,对应的是第一个过程:“在将应用上传到 AppStore 时,Xcode 会将程序对应的 Bitcode 一块儿上传”,下面咱们说明第二个过程。

从 Bitcode 生成可执行程序的方法

第二个过程为:“AppStore 会将 Bitcode 从新编译为可执行程序,供用户下载”。第二个过程是在苹果的 Server 上进行的,咱们无法直接得到细节,可是应该都是基于相同的工具链,咱们能够模拟这个过程。

从 MachO 中提取 Bitcode

AppStore 拿到咱们上传的 IPA 后,首先须要从 IPA 内的 MachO 文件中提取出包含 Bitcode 的 xar 文档。在 Xcode 的工具链中有个工具 segedit 能够用来从 MachO 提取 Section,提取 xar 的具体参数以下:

315.png

提取到 xar 后,解开 xar:

316.png

获得以下几个 Bitcode 文件:

317.png

还可使用 llvm-dis 工具将如上文件处理成可读形式,从而了解每一个文件的内容。

生成可执行程序

在有了 Bitcode 后,接下来须要将 Bitcode 编译成可执行程序,分为两个过程:将 Bitcode 编译成 Object 文件;连接 Object 文件到可执行程序。

  • 将 Bitcode 编译成 Object 文件

Makefile 片断以下:

318.png

  • 连接 Object 文件到可执行程序

319.png

如上咱们已经从 Bitcode 从新生成了可执行程序 XBCTest。

攻击面

咱们先回顾下 Bitcode 在本地的工做流程:Xcode 将嵌入了 Bitcode 的 MachO 上传到 AppStore。经过分析能够发现这里存在两个问题:

1.MachO 与其中嵌入的 Bitcode 的一致性问题。即:可否把 程序B 的  Bitcode 嵌入到 程序A中。

2.AppStore 是否信任了 Xcode,而没有检查一致性问题,从而容许将   Malformed MachO 上传到 AppStore。

在分析了可能存在的问题后,咱们认为若是 Bitcode 流程与功能存在缺陷,即可以对两个目标造成威胁:普通用户、苹果。

普通用户

因为 Bitcode 对普通用户是透明的,所以没法经过其弱点直接攻击用户。可是一致性问题是可能对普通用户形成威胁的,试想:若是提交 AppStore 审核的 程序A 中嵌入了含有恶意代码的Bitcode,普通用户就有可能从AppStore 下载到含有恶意代码的程序。

对于这种攻击方式咱们将其叫作 Bitcode Injection,下文会详细介绍这种攻击的实施方法,及咱们的测试结果。

苹果

若是 Malformed MachO 能够被上传到苹果的服务器,苹果的服务器相较于以前,主要须要进行两个额外的操做:解开 xar;编译 Bitcode。若是这两个过程出现问题,轻则能够在苹果的服务器上形成 DoS,重则能够在苹果的服务器上形成任意代码执行。

另外,Bitcode 本来是 LLVM-IR 的一种序列化形式,而 LLVM-IR 是一种中间形式,以前没有被直接暴露出来,如今彻底开放了,并且又是二进制格式,这是很容易出问题的。从 Bitcode 生成可执行文件的过程主要由以下几个子过程组成:

1.基于平台无关的 IR的代码优化。

2.IR的平台相关化、合法化。

3.平台相关的优化、代码生成。

这些本来是编译器的内部过程,因为各类缘由,传统的对编译器的测试主要集中在前端的 Parser 与 Lexer,如今借由 Bitcode 如上的一些中间或者后端过程也暴露了出来,若是如上的过程出现问题最糟糕的结果是能够控制编译器的指令生成。

以上是关于攻击面的分析,后文会介绍测试 xar 及 Bitcode 的思路,以及发现的问题。

Bitcode Injection

上文在介绍 Bitcode 工做流程时已经介绍了实施 Bitcode Injection 的方法,可是上面提到的方法不够简练,这里咱们再介绍一种更简单的方法,主要的思路就是最大限度的利用 Xcode,这个方法的具体实施步骤为:

  1. 用 Xcode 创建工程XBCTest:

320.png

2. 复制工程XBCTest,获得工程XBCTest2:

321.png

3. 修改工程XBCTest2的源码,嵌入恶意代码:

322.png

4. Archive 工程XBCTest2:

324.png

5. 得到 MachO,利用 segedit 从 MachO 中提取出含有 Bitcode 的 xar:

325.png

提取xar: segedit ./XBCTest -extract "__LLVM" "__bundle" BC.xar

6. 修改工程XBCTest的连接标记,将提取的 xar: BC.xar 嵌入到工程XBCTest的 MachO文件中。

7. 禁用工程XBCTest的 Bitcode 特性,Archive 并上传 AppStore:

327.png

咱们在测试的过程当中并无嵌入恶意代码,而是从网上找个两个彻底不一样的应用,将其中一个的 Bitcode 嵌入到另外一个的 MachO 中,并提交到AppStore。

在将应用提交到 AppStore 的过程当中主要会进行两个方面的检查:Xcode 在本地进行静态分析;提交后,苹果的服务器还会进行检查。可是使用 Bitcode Injection 构造的应用能够经过这两项检查:

328.png

通过漫长的审核后,咱们的应用被拒了,理由是:咱们的应用与描述不符。在描述中咱们的应用应该长成以下样子:

329.png

可是苹果的审核人员安装后,程序却长成这个样子:

330.png

这至少能够说明三个问题:

1.咱们使用的 Bitcode Injection 方法没有问题。

2.苹果的审核人员审核的是从 Bitcode 编译出来的程序。

3.一致性是靠人肉区分的。若是嵌入对 UI 没有影响的恶意代码,仍是有可能绕过审核的。

测试xar

思路

对 xar 进行模糊测试,生成数据的方法是基于标准的 xar 文档进行变异。

测试结果

目前主要 Fuzz 出一些空指针解引用问题。

测试 clang

思路

对 clang 中的Bitcode 到 Object 的功能进行模糊测试,也是采用变异的方法生成测试数据。

测试结果

经过对 clang 的 Fuzz 咱们发现了一些堆损坏相关的问题。

总结

1. The Xcode 7 bitcode feature has opened a huge attacking surface, Apple should do something to narrow it, for example: checking the bitcode is identical to the related MachO file.

2. 在上文中咱们详细介绍了所考虑到的攻击面,及针对每一个攻击面的测试思路,但愿这些对你们研究 Bitcode 相关的攻击面及安全性有帮助。

参考资料

[1] What’s New in Xcode

[2] LLVM Bitcode File Format

做者:360NirvanTeam(企业帐号)

相关文章
相关标签/搜索