导语:Sirius是Polidea团队推出的一个开源项目,用于保护 iOS 应用程序的开源代码混淆。现在Sirius可以完全访问,并随时可用,它支持最新的苹果产品以及Swift语言。

现在,我要向大家隆重的介绍一个安全工具——Sirius ,Sirius是Polidea团队推出的一个开源项目,用于保护iOS应用程序的开源代码混淆。现在Sirius可以完全访问,并随时可用,它支持最新的苹果产品以及Swift语言。

如何通过代码混淆来保护移动应用程序的安全性

安全性是移动应用程序开发时,重点要考虑的一个方面。虽然目前的安全工具箱中有多种工具,如SSL校验证书绑定(ssl pinning),数据库加密,双因素身份验证或设备之间的端到端加密。不过所有这些技术都集中在防止开发者数据被截获或被盗取,因为在处理开发者数据时,必须防止任何可能危及隐私的攻击。然而,还有一件事polidea团队可能也想要保护,即polidea团队的应用程序的逻辑,polidea团队编程的实际算法。我认为,这才是最重要的!虽然它不如开发者的数据安全那么重要,但对于某些应用程序(特别是在金融领域),它仍然是整个安全系统的一部分。虽然不可能完全阻止攻击者理解你的应用程序的逻辑,但采取一些阻碍防护措施还是有必要的。应用程序的逻辑还可以防止攻击者搜索开发者的程序代码并寻找可利用的漏洞,而解决这个问题的常见技术便是代码混淆。

有一种非常特别的代码混淆技术叫做符号重命名(symbol renaming),其基本思想就是将应用程序中的符号名(类名、方法名等)替换为随机字符串。这样做是为了让程序的符号失去意义,从而使得攻击者难以在应用程序中识别它们。当攻击者在读取反编译的应用程序时,可能不再利用名称携带的信息来推断应用程序的运行逻辑。

这就是为什么在Android平台上有一个被广泛使用的工具,叫做Proguard,它可以做到这一点。ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。常常用于Android开发用于混淆最终的项目,增加项目被反编译的难度,目前它已成为安全构建框架的一个重要组成部分。

然而,在iOS上,目前还没有像Proguard一样免费的开源解决方案。在使用Swift代码库时,开发者可以很明显的感觉到缺乏一个合适的混淆工具,因为目前大多数混淆解决方案都是为了Objective-C而设计的。

在Objective-C中进行程序开发时,通过符号重命名进行代码混淆尤为重要。原因是所有符号必须存储在二进制文件中,并且仅在运行时可见,这样它们就可以被字符串引用,这就是允许使用选择器传递消息或根据协议名称检查协议一致性的原因。虽然默认情况下,Swift不使用Objective-C运行,并且编译器会删除符号并应用一些使攻击者难以读取反编译应用程序的优化方法,但显然都不如混淆技术有用。虽然polidea团队可以通过NSObject演化出很多优化方法,但前提是自愿参与runtime(运行时机制),且必须遵守它的运行规则。

NSObject是大部分Objective-C类继承体系的根类。这个类遵循NSObject协议,提供了一些通用的方法,对象通过继承NSObject,可以从其中继承访问运行时的接口,并让对象具备Objective-C对象的基本能力。

1.png

开源代码混淆工具Sirius

以上的解释,就是为什么Polidea团队要开发Sirius混淆工具的原因,Sirius是一个开源工具,可以把你的Swift代码转换成以下这样。

转换前的代码:

class Sample: UIViewController {
  var value = 42

  override func viewDidLoad() {
    super.viewDidLoad()
    configure()
    foo(bar: 1)
  }

  func foo(bar baz: Int) {
    value += baz  }}protocol Configurable {
  func configure()}extension Sample: Configurable {
  func configure() { }}

转换后的代码:

class aqoxMfcPUXffEuurviH_ZPMDW2hCmXDR: UIViewController {
  var a0vLRcFFAQ1Lvw2sf4ZIigWKjXjpJpug = 42

  override func viewDidLoad() {
    super.viewDidLoad()
    A6PP2E5mcmjEsgOvTeXwy2G44vzYLa6H()
    xG1qrXIMEJC1Eoma2Qbp_ZWJ5y2lrGYX(KuT5vOLIISvSJyju6bYxsHO_vlWUU589: 1)
  }

  func xG1qrXIMEJC1Eoma2Qbp_ZWJ5y2lrGYX(KuT5vOLIISvSJyju6bYxsHO_vlWUU589 vjCKgTT7Cf0ZlEi9giLZstzgdC9XLQcd: Int) {
    a0vLRcFFAQ1Lvw2sf4ZIigWKjXjpJpug += vjCKgTT7Cf0ZlEi9giLZstzgdC9XLQcd  }}protocol dVUt_HSz_a1q1JsbyTJVfk0KeXej8a4z {
  func A6PP2E5mcmjEsgOvTeXwy2G44vzYLa6H()}extension aqoxMfcPUXffEuurviH_ZPMDW2hCmXDR: dVUt_HSz_a1q1JsbyTJVfk0KeXej8a4z {
  func A6PP2E5mcmjEsgOvTeXwy2G44vzYLa6H() { }}

Sirius混淆工具使用的是Xcode 9.2(Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由Apple Inc开发)和Swift 4.0。它易于使用一个命令行工具执行,并且很高兴与应用开发者的开发管道(development pipeline)集成,其中就包括CI/CD服务器。它是Swift编译器的扩展,并直接使用Swift AS,最为重要的是,它是完全免费的。

在这篇文章中,我将讨论创建Sirius工具背后的一些动机,期间所遇到的挑战以及开发者所选择的解决方案,以及由此产生的混淆过程以及未来的安全防御计划。

为什么Polidea团队要开发自己的代码混淆工具?

从技术角度来看,混淆工具的使用目的是增加攻击者对应用程序反编译后进行逻辑推测的难度。但是,一个人怎样才能准确的对应用程序进行反编译呢?让polidea团队快速浏览一下这个过程。

4.png

要进行反编译,还要从源代码开始,通过设计可读性,让人们理解其中的运行逻辑,最后再将源代码编译成二进制文件。如果应用程序是用Swift编写的,那么在以上反编译的过程中,程序的大多数符号可能会被删除,并且编译程序优化会对执行流程进行转换。然后将二进制文件上传到App Store,不过这些文件会受到苹果Fair Play DRM(数字版权保护技术)软件的保护,这与苹果在iTunes Store中使用的技术相同。

不过对于攻击者来说,他们会将应用程序从App Store下载到经过越狱的设备上。当应用程序启动并被加载到内存中执行时,系统就会对其进行解密。由于设备已越狱,攻击者可以将包含应用程序的内存转储回二进制文件中。然后可以在像Hopper这样的专用工具中对其进行反汇编和读取。此时,攻击者就可以读取反汇编的代码或伪代码,查找符号并沿着指定的执行路径进行攻击。

在整个代码混淆过程中,开发者是察觉不到应用程序行为的任何变化的。直到到了反编译二进制文件时,代码混淆的结果才会体现出来。

目前应用代码混淆的基本方法有三种:编译前(从源代码到源代码)、编译期间(从源代码到二进制)和编译后(从二进制到二进制)。它们在上图中都有对应的位置,如果在编译之前完成混淆处理,则它对文本源文件起作用,其输出由修改后的源文件组成,你可能认为这是一种奇怪的重构。如果在编译期间完成混淆处理,则它将成为编译过程中的一个步骤。这就是Proguard在Android构建系统中的工作方式(尽管它也可以看作二进制到二进制混淆工具,因为它适用于Java .class文件)。在iOS端有Obfuscator-LLVM项目,该项目提供了一个fork编译器,其中就包含了这个额外的步骤。OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个项目,该项目旨在提供一套开源的针对LLVM的代码混淆工具,以增加对逆向工程的难度。后期转向商业项目strong.protect。目前,OLLVM已经支持LLVM-4.0版本。

LLVM是一个优秀的编译器框架,它也采用经典的三段式设计。前端可以使用不同的编译工具对代码文件做词法分析以形成抽象语法树AST,然后将分析好的代码转换成LLVM的中间表示IR(intermediate representation);中间部分的优化器只对中间表示IR操作,通过一系列的Pass对IR做优化;后端负责将优化好的IR解释成对应平台的机器码。LLVM的优点在于,中间表示IR代码编写良好,而且不同的前端语言最终都转换成同一种的IR。

如果在编译后进行混淆处理,它将使用二进制文件并输出转换后的二进制文件,这样混淆后的代码就可以在编译之后和程序应用之前的任何时间内被发布、下载并加载到设备内存。然而,由于在将二进制文件上传到App Store后发生的一切都是由苹果控制的,所以代码混淆是在发布之前完成的。目前市面上的商业安全加固软件iXGuard,就是利用的这个原理。iXGuard的作用如下:1.iXGuard能够快速透明地在构建过程中整合;

2.命名混淆;

3.字符串加密;

4.算法混淆。

而polidea团队在开发Sirius工具时,选择的就是编译前(从源代码到源代码)方法,即读取源文件并生成转换后的源文件。目前,他们已经确定此方法是开发者体验最好的一种,因为它不需要开发者确认,安全工具是否没有向二进制文件中注入任何恶意代码。由于Sirius工具将会生成源代码,因此每个使用的开发者都可以轻松地进行差异化分析并可视化所有发生混淆的代码。

下一节中,我将介绍Sirius工具开发过程在的一些挑战及应对之策。

源链接

Hacking more

...