# 应用审计指南

## 一． 概述&#x20;

### 1.1 前言&#x20;

提高安全测试的效率，配合业务方自查。在开发以及 QA 阶段就消除常见的安全 问题，提高安全审计的效率。&#x20;

### 1.2 适用范围和对象&#x20;

本文档用于 iOS 客户端的日常审计参考，提升安全审计的效率。&#x20;

## 二． iOS APP 通用审计方法&#x20;

### 2.1 静态检测&#x20;

静态检测主要是指通过扫描工具对 IPA 文件进行静态扫描和检查，尽快发现可 能存在的安全隐患。&#x20;

#### 2.1.1 配置文件完整性&#x20;

检测 Info.plist 和 embedded.mobileprovision 等配置文件中的关键项，判断 各项是否存在配置错误，缺失等。&#x20;

测试点：&#x20;

① 各项配置信息 人工审计，或通过静态审计工具获取配置文件的完整性信息，进 行核对。&#x20;

#### 2.1.2 二进制文件的安全性&#x20;

检测二进制文件中的基本安全保护机制是否开启。

测试点：&#x20;

① 是否开启 PIE \
② 是否开启 ARC \
③ 是否开启 Stack Canary

#### 2.1.3 存在安全隐患的函数&#x20;

检测 iOS APP 是否用到了存在安全隐患的函数&#x20;

测试点：&#x20;

① 纯 C 运行时库函数：如 gets，strcpy，vsprintf，memcpy 等。 \
② 弱伪随机数生成函数：如 srand，random，arc4random 等。 \
③ 弱哈希函数：CC\_MD5，CC\_MD4，CC\_MD2 等。\
④ 弱加密算法：Rc4&#x20;

测试方法： 通过静态检测工具或命令行工具，直接在二进制文件中搜索以上危险函数。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWOn2hM35kN3pdZV1K%2Fimage.png?alt=media\&token=c048bbf4-0464-4bd1-9bc1-a456fed20e26)

#### 2.1.4 检测 URL&#x20;

检测 iOS APP 中硬编码的所有 URL，检测其是否包含恶意或敏感信息。&#x20;

测试方法： 通过静态检测工具或脚本，遍历出当前 APP 包含的所有 URL，查看 UR 中是否有 例如 password 等敏感字段。

#### 2.1.5 第三方 SDK&#x20;

检测第三方 SDK 是否存在安全隐患&#x20;

测试方法：&#x20;

① 通过获取第三方 SDK 的版本等信息，结合当前已经存在的一些 SDK 的漏 洞，检测当前版本是否是有风险有漏洞的。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWP-xiLzuIvIYNkwvr%2Fimage.png?alt=media\&token=16584458-9e01-4a97-a7af-67ad979df044)

#### 2.1.6 敏感数据&#x20;

检测敏感数据，包括但不限于 IPA 配置文件，IPA 中非必要的文本文件等是否 有敏感信息。&#x20;

测试方法：&#x20;

② 通过解压 IPA 文件，查看 Info.plist，以及是否有一些涉及敏感信息 的 txt 等文本文件内容。&#x20;

#### 2.1.7 冗余代码检测&#x20;

检测方法：&#x20;

③ 检测当前代码中存在的但是没有被使用的类和函数。&#x20;

#### 2.1.8 恶意软件&#x20;

检测 IPA 文件中是否有被恶意软件或恶意 SDK 感染的风险。&#x20;

检测点：&#x20;

④ xcodeGhost \
⑤ 有米 SDK 检测方法： \
⑥ 通过静态扫描工具或以上恶意软件的标志，来判断是否感染病毒。

2.1.9 私有 api&#x20;

检测当前 APP 中是否调用了苹果官方不允许使用的私有 api。&#x20;

检测方法： \
⑦ 人工审计或通过私有 api 的检测工具来进行。

### 2.2 动态检测&#x20;

动态检测指 iOS APP 在运行时可能会存在某些安全隐患，弥补了静态审计的不 足，需要测试人员将 APP 安装在测试机上，进行常规操作后对产生的数据进行 分析，发现可能存在的更深层次的安全问题。&#x20;

#### 2.2.1 应用日志&#x20;

检测 iOS APP 在运行时有无包含敏感信息的日志输出。&#x20;

检测方法： \
⑧ 通过 Mac 自带的控制台。 \
⑨ xcode 自带的日志打印、 \
⑩ 手机本地安装 syslog 日志收集工具。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWPZ698o3Y9dVgx4Vy%2Fimage.png?alt=media\&token=520bbd14-e9ab-45bb-b6a8-9731f02753b3)

#### 2.2.2 网络请求&#x20;

检测 APP 在网络请求中是否涉及到敏感未加密的参数以及一些常见的 web 漏 洞。&#x20;

检测项：&#x20;

11 OWASP TOP10 漏洞 \
12 敏感明文信息或敏感的弱加密信息&#x20;

检测方法：&#x20;

13 通过 Charles 等工具抓包，（有证书检测的，需要安装 ssl-kill-switch 插件），或通过动态审计工具拦截 APP 所有网络请求，检测是否有未加密的敏感 字段。 \
14 在用户登录、找回密码、注册等处，通过拦截修改返回包，检测其有无常见的逻辑漏洞。 \
15 通过在 web 请求页面输入文本的地方，通过构造 xss 代码，检测其是否 有 xss 漏洞。 \
16 通过抓包修改，构建 SQL 注入指令，来检测是否有 SQL 注入漏洞。 \
17 结合当前网络请求的签名验证情况，修改其网络请求参数，查看其是否 有越权漏洞。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWPf3F4al4DFU2-jQw%2Fimage.png?alt=media\&token=61b6cb9c-e27b-4f04-ac77-ead18fb6942b)

#### 2.2.3 后台快照&#x20;

检测是否存在后台快照泄露敏感信息的情况。&#x20;

检测方法：&#x20;

18 在沙盒路径”Library/caches/snapshots”下，存放着当前 APP 切换进 程时当前界面的截图。在包含敏感信息界面切换后台，查看其保存的敏感截图。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWPkG8_XjYFp3qnIhn%2Fimage.png?alt=media\&token=60f5903a-a879-4c0c-82f0-4b5e0d2a091d)

#### 2.2.4 数据存储&#x20;

检测 APP 存储的敏感信息，例如沙盒目录、keychain 下面等。&#x20;

检测方法：&#x20;

19 在路径”/private/var/mobile/containers/data/application”下，存放当前所有 APP 的沙盒文件，在沙盒文件中，主要查看 Document 和 Library 目录下是否存 放一些含有敏感数据的 web 缓存、数据库文件，以及 plist 文件。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWPpvA-MIeT7rvcYK4%2Fimage.png?alt=media\&token=5322bcf9-5a3c-497f-9724-3b5a17c7b0a5)

20 通过工具 keychain dump，可以把 keychain 中的数据 dump 下来，用来 检测是否在 keychain 中明文存储了密码账号等敏感信息。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWPusyoxNhtNpM87eE%2Fimage.png?alt=media\&token=bfcc29a6-1574-4e59-939f-cf24214539f8)

21 检测沙盒文件中可以的敏感字段是否用到通用加密算法，以及秘钥是否 硬编码。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWQ-YDckcPNgTEZM4l%2Fimage.png?alt=media\&token=c70f041c-db4f-472f-b8a3-69761f9c8691)

#### 2.2.5 数据加密算法

主要检测涉及敏感信息的加密算法的安全性。&#x20;

检测方法：&#x20;

① 通过抓包等方法，找到加密参数，然后通过逆向分析等方法，检测是否 为弱加密算法。 \
② 通过逆向分析等方法，检测其加密算法是否有硬编码秘钥的风险。&#x20;

#### 2.2.6 WebView\&JS&#x20;

原生代码通过注册接口提供 web 界面中的 js 调用，调用者可能存在问题。&#x20;

检测方法：&#x20;

③ 检测其 webview 是否有涉及敏感信息的接口，如发送短信、获取定位、 付款等。 \
④ webview 加载第三方内容时，检测其是否对 native 接口的合法性做校 验。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWQ6thZZAkK695J0sx%2Fimage.png?alt=media\&token=6490c7cc-067b-485b-8bb4-a5d4f0a17b4b)

2.2.7 权限绕过&#x20;

APP 登录弱验证的问题 ，如果登录的基础采用读取沙盒内的问题件，就会在登 录等功能上有安全风险。&#x20;

检测方法：&#x20;

⑤ 通过文件查找的软件（pp 助手等），将 APP 的沙盒文件直接移植到另 一个手机上，查看其是否会自动登录，以此来检验 APP 是否设置合理的检验登录 标志。&#x20;

#### 2.2.8 旧数据未清除&#x20;

用户登录 APP 后未清除旧数据，导致 APP 卸载，重新下载后还能继续保持登录 状态。&#x20;

检测方法：&#x20;

⑥ 登录 APP，然后直接卸载。 \
⑦ 重新安装 APP，如果还能自动登录 APP，就存在安全隐患。 \
⑧ keychain 中的密码等信息未清除，假设 APP 有手势密码等功能，用上 述方法，可直接读取手势密码进行登录。

#### 2.2.9 功能性安全问题&#x20;

APP 中如果有扫描二维码等功能，假设没有对特殊二维码做处理，就可能导致 扫描了畸形二维码而发生拒绝服务。&#x20;

检测方法：&#x20;

⑨ 扫描畸形或恶意构造的二维码，看是否做了处理。&#x20;

#### 2.2.10 解压缩问题&#x20;

APP 中如果有对 rar、zip 等文件的解压缩功能，若未对特殊压缩包做校验，可 导致构造恶意压缩包直接覆盖本地文件。&#x20;

检测方法：&#x20;

⑩ 抓包，若发现请求中有下载 zip 等压缩文件，可直接构造恶意压缩包， 在指定路径直接覆盖原文件。&#x20;

#### 2.2.11 解析 word 字体&#x20;

APP 中如果有对 word、pdf 等文档的解析功能，若开发人员未对要解析的文件 进行解析校验，可导致恶意文档文件执行的问题。&#x20;

检测方法：&#x20;

11 分析 APP，构造恶意的文档文件，看 APP 打开时是否出错。&#x20;

## 三． 常见逆向工具使用&#x20;

### 3.1 frida&#x20;

是一款轻量级的 hook 框架，除了 frida 本身，还包含 frida-ps，frida-trace 等工具。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWQEKN_Md5uX-yRDkd%2Fimage.png?alt=media\&token=073501e2-0618-4b06-bc52-9f02be9c3aeb)

frida-ps 用来查看当前 pid 以及进程名

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWQJ6F2YpDBWPE1r4Z%2Fimage.png?alt=media\&token=c6f1739a-4d51-4a82-9747-4780c9869c2e)

frida-trace 用来动态 hook 指定的类，打印函数调用栈。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWQOcNmaYyAwlrucNb%2Fimage.png?alt=media\&token=d32c995c-1b3f-4911-a731-e11b0a82afef)

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWQRHwH1B27342fNDR%2Fimage.png?alt=media\&token=72fcb578-bf09-4aeb-9a6b-5849efd01508)

frida 可以用来加载 js 脚本，hook 指定的类和方法，打印目标参数以及寄存器 里的值。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWQVunmxQU4RRPXwXE%2Fimage.png?alt=media\&token=2a15d4ee-e6a8-457d-a940-9bfdad7b8d4f)

Frida-dump 可以在运行时 dump 解密后的内存，一般用来砸壳。 先在 Mac 上做端口转发

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWQbLVyIK1ecYosrK0%2Fimage.png?alt=media\&token=b8f01afd-918a-485e-9462-4772b674b439)

手机解锁，pc 端直接通过指令“dump.py <进程名>” ，进行脱壳

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWQf4ZRwsG_xrmclF7%2Fimage.png?alt=media\&token=6e1d7794-9558-43f5-8413-f96583e67736)

### 3.2 Cycript&#x20;

可以打印当前 APP 的沙盒路径，UI 层级，动态修改 UI 界面等。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWQkqLLgYKq7LYa_Uf%2Fimage.png?alt=media\&token=138872ac-8ef8-4faa-97c1-d018dda6e96e)

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MNWO2c4dfaRL6-Ygizm%2F-MNWQqLY6MC7kf3fKHH2%2Fimage.png?alt=media\&token=84179ea3-776d-45ef-88fd-9bd453ace527)

## 四． CheckList&#x20;

### 4.1 静态检测项&#x20;

#### 1) 文件完整性&#x20;

① 配置项缺失 \
② 配置项错误&#x20;

#### 2) 二进制文件安全性&#x20;

① 是否开启 PIE \
② 是否开启 Stack Canary \
③ 是否开启 ARC&#x20;

#### 3) 危险函数&#x20;

① 危险的纯 C 运行时库函数 \
② 弱伪随机数生成函数 \
③ 弱加密函数 \
④ 弱哈希函数&#x20;

#### 4) URL 检测&#x20;

① URL 包含敏感信息 \
② 恶意 URL&#x20;

#### 5) 第三方 SDK&#x20;

① 第三方 SDK 是否存在安全问题 \
② 是否有更新版本&#x20;

#### 6) 敏感数据检测&#x20;

① 是否包含常量敏感字符串 \
② 是否包含敏感类&#x20;

#### 7) 冗余代码检测&#x20;

① 冗余类和函数&#x20;

#### 8) IPA 包文件检测&#x20;

① 是否包含非必要的文本文件&#x20;

#### 9) 恶意软件感染&#x20;

① 是否感染 xcodeGhost \
② 是否包含恶意 SDK&#x20;

#### 10) 私有 api 调用&#x20;

① 是否存在私有 api 调用&#x20;

### 4.2 动态检测项&#x20;

#### 11) 日志输出&#x20;

① 日志文件是否包含敏感信息&#x20;

#### 12) 网络请求&#x20;

① 是否全部使用 https \
② 是否做双向证书校验\
③ 网络请求中是否包含敏感未加密数据 \
④ 是否含有 OWASP TOP10 漏洞&#x20;

#### 13) 后台快照&#x20;

① 敏感页面是否做了处理&#x20;

#### 14) 数据存储&#x20;

① 沙盒文件是否具有包含敏感信息的 db。Plist，web 缓存文件 \
② keychain 有无明文存储敏感信息
