开源!iOS 应用安全分析工具 Passionfruit

开源!iOS 应用安全分析工具 Passionfruit

Github 项目地址 chaitin/passionfruit

前情提要

虽然没有 Android 平台那么多的攻击面和利用姿势,iOS 应用依然有安全审计的需求。移动平台的安全目前采用的策略基本上都是扫描器加上一部分人工的逆向和动态分析。

针对 iOS 应用攻击面分析,目前笔者了解或使用过的相关工具如下(除去逆向工程使用的调试器和反汇编工具):

在使用中笔者多多少少遇到了一些问题,例如 needle 在设备上需要部署过多依赖包,idb 不兼容 iOS 10,Introspy 虽好但查询日志数据库有一些麻烦……忍不住开始造轮子。

审计工具所需功能大体有如下几个方面:

  • 分析应用是否开启了必要的编译器保护
  • 分析应用沙盒内的文件内容和权限
  • 分析应用使用到的 framework 和动态链接库
  • 分析应用存储的数据,如 UserDefaults, BinaryCookie 和 KeyChain
  • 分析剪贴板的使用
  • 动态拦截和分析 Objective C 运行时方法
  • 动态拦截和分析本地代码的参数调用和堆栈追踪
  • 分析 UIView 的层级结构和属性
  • 一些基于 hook 实现的修改功能,如设备特征伪造、绕过越狱检测、绕过 SSL Pinning 等

应用目前仍然在开发中,可能会有 bug 或功能缺失。

设计

在实现方案上,笔者选择了功能极为强大的 hook 框架 frida.re。关于这个框架不需要我再过多介绍,它在 iOS 平台上支持对 native 函数、Objective C 运行时的 hook 和调用,可以满足多种移动安全运行时分析的自动化需求。

Passionfruit 通过 frida 注入代码到目标应用实现功能,再通过 node.js 服务端消息代理与浏览器通信,用户通过访问网页即可对 App 实现常规的检测任务。

安装和使用

请访问 GitHub 上的项目主页 chaitin/passionfruit 来获取最新的版本和更新信息。

Passionfruit 的编译和安装依赖如下软件:

  • node.js 用于运行服务端。可根据个人喜好使用 yarn 或默认的 npm 作为包管理

安装步骤

  1. 安装 node.js,版本推荐使用 LTS
  2. 使用 npm 安装命令行工具:npm install -g passionfruit
  3. 在越狱 iOS 设备上安装 frida
  4. 在非越狱设备上使用 ipa 重打包注入 fridagadget.dylib
  5. 执行 passionfruit 运行服务端
  6. 在浏览器中访问 localhost:31337

解决安装错误

在国内的网络可能会遇到软件源访问困难,导致无法完成安装的问题。

对于 npm,可使用淘宝的镜像服务和命令行工具 cnpm:npm.taobao.org/

npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install -g passionfruit

即使使用了 cnpm,由于部分预编译包需要从 GitHub 或者 AWS 下载,也可能遇到网络障碍。

请观察安装日志中类似如下的内容:

prebuild-install info begin Prebuild-install version 2.5.1
prebuild-install info looking for local prebuild @ prebuilds/frida-v10.7.1-node-v59-darwin-x64.tar.gz
prebuild-install info looking for cached prebuild @ /Users/username/.npm/.cache/cnpm/_prebuilds/https-github.com-frida-frida-releases-download-10.7.1-frida-v10.7.1-node-v59-darwin-x64.tar.gz
prebuild-install http request GET https://github.com/frida/frida/releases/download/10.7.1/frida-v10.7.1-node-v59-darwin-x64.tar.gz
prebuild-install http 200 https://github.com/frida/frida/releases/download/10.7.1/frida-v10.7.1-node-v59-darwin-x64.tar.gz

日志表示将现在本地查找缓存的预编译包(prebuilt),失败则从 GitHub 的 release 下载一个。如果命令行下载失败,请记录下这个地址和本地的路径,使用可靠的代理工具下载源文件到缓存路径。

重新执行 cnpm install -g passionfruit,问题解决:

$ cnpm install -g passionfruit
npm WARN deprecated babel-preset-es2015@6.24.1: ????  Thanks for using Babel: we recommend using babel-preset-env now: please read babeljs.io/env to update!
/usr/local/bin/passionfruit -> /usr/local/lib/node_modules/passionfruit/bin/cli.js
+ passionfruit@0.2.1
updated 1 package in 


功能和演示

https://www.zhihu.com/video/902688743067090944

Passionfruit 最大特点就是基于 Web 的图形界面,所以服务端当然是支持跨平台的!

完全图形化的界面可以快速地找到需要 hook 的函数。由于 C 函数缺少运行时参数类型信息,因此对于这些库函数您需要手动设置一下函数原型。Objective C 可以直接根据反射打印出参数和返回值。

其他工具实现的 checksec 是基于 otool 检查应用的可执行文件,需要在设备上安装额外的依赖,或将文件从设备中同步到本地执行命令。Passionfruit 直接分析内存中映射的内容,因此要快上很多。在文件查看方面,Passionfruit 直接读取应用沙盒内的 Plist、SQLite 数据库,相比先 scp 下载然后查看可以节约一些时间。

Passionfruit 在不少界面都添加了搜索功能,如模块列表、导出符号、Objective C 类,甚至 Plist 这样的序列化数据。

在 iOS 10 中有一个非公开 API UIDebuggingInformationOverlay 可用来在设备上分析界面层级,您可以在 Passionfruit 的 UIDump 面板中点击按钮来激活这个界面。

如果您有单步、界面分析等更高级的调试需求,建议还是使用 debugserver 等专门的调试工具。

FAQ

需要越狱吗?

更新:项目发布后收到了 frida 作者本尊贡献的代码,现在已经不需要越狱了!

Frida 可以通过对已砸壳的 ipa 添加 fridagadget.dylib,重打包、重签名后在非越狱设备上试用,具体步骤可参考:

iOS App的Patching和Resigningwww.jianshu.com图标

使用 MonkeyDev 集成 Frida:

AloneMonkey/MonkeyDevgithub.com图标

为什么不支持 NSLog 查看?

本工具使用的界面是基于浏览器的,对于 NSLog 日志这种快速刷新的内容,实时展示会造成显著的性能问题。在现有工具(Xcode,macOS 自带的 Console,libimoviledevice 的 idevicesyslog 命令)足够强大的情况下,没有必要再开发一个(更难用的)了。

编辑于 2018-03-14

文章被以下专栏收录