Android 安全测试¶
本章中,我们将深入探讨如何设置安全测试环境,并向您介绍一些用于测试 Android 应用程序安全性的实用流程和技术。这些是 MASTG 测试用例的基础。
Android 测试设置¶
您可以在几乎任何运行 Windows、Linux 或 macOS 的机器上设置一个功能齐全的测试环境。
宿主设备¶
至少,您需要 * Android Studio* (附带 * Android SDK*) 平台工具、模拟器,以及一个用于管理各种 SDK 版本和框架组件的应用程序。Android Studio 还附带一个 Android 虚拟设备 (AVD) 管理器应用程序,用于创建模拟器镜像。请确保您的系统上已安装最新的 SDK 工具和 平台工具包。
此外,如果您计划处理包含原生库的应用程序,可能还需要安装 * Android NDK*。
有时,从计算机显示或控制设备会很有用。为此,您可以使用 * Scrcpy*。
测试设备¶
为了进行动态分析,您需要一个 Android 设备来运行目标应用程序。原则上,您可以不使用真实的 Android 设备,只使用模拟器进行测试。然而,应用程序在模拟器上运行速度相当慢,而且模拟器可能无法提供真实的结果。在真实设备上测试可以使过程更流畅,环境更真实。另一方面,模拟器允许您轻松更改 SDK 版本或创建多个设备。下表列出了每种方法的优缺点。
特性 | 物理设备 | 模拟器/仿真器 |
---|---|---|
恢复能力 | 软砖化总是可能发生,但通常仍可刷入新固件。硬砖化则非常罕见。 | 模拟器可能会崩溃或损坏,但可以新建或恢复快照。 |
重置 | 可恢复出厂设置或重新刷机。 | 模拟器可以删除并重新创建。 |
快照 | 不可能。 | 支持,非常适合恶意软件分析。 |
速度 | 比模拟器快得多。 | 通常较慢,但正在改进中。 |
成本 | 可用设备通常起价200美元。您可能需要不同的设备,例如带有或不带有生物识别传感器的设备。 | 免费和商业解决方案都存在。 |
Root的简易性 | 高度依赖设备。 | 通常默认已Root。 |
模拟器检测的简易性 | 这不是模拟器,因此模拟器检查不适用。 | 会存在许多伪影,很容易检测到应用程序正在模拟器中运行。 |
Root检测的简易性 | 更容易隐藏Root,因为许多Root检测算法会检查模拟器特性。使用Magisk的无系统Root几乎不可能被检测到。 | 模拟器几乎总是会触发Root检测算法,因为它们是为测试而构建的,并且包含许多可被发现的伪影。 |
硬件交互 | 通过蓝牙、NFC、4G、Wi-Fi、生物识别、摄像头、GPS、陀螺仪等进行轻松交互。 | 通常相当有限,只有模拟的硬件输入(例如随机GPS坐标) |
API级别支持 | 取决于设备和社区。活跃的社区会持续分发更新版本(例如 LineageOS),而不那么流行的设备可能只会收到少量更新。在不同版本之间切换需要刷机,这是一个繁琐的过程。 | 始终支持最新版本,包括 Beta 版。包含特定 API 级别的模拟器可以轻松下载和启动。 |
原生库支持 | 原生库通常是为 ARM 设备构建的,因此它们可以在物理设备上运行。 | 有些模拟器运行在 x86 CPU 上,因此可能无法运行打包好的原生库。 |
恶意软件风险 | 恶意软件样本可能会感染设备,但如果您能够清除设备存储并刷入干净的固件,从而将其恢复到出厂设置,这应该不是问题。请注意,有些恶意软件样本会尝试利用 USB 网桥。 | 恶意软件样本可能会感染模拟器,但模拟器可以简单地移除并重新创建。也可以创建快照并比较不同的快照,以帮助进行恶意软件分析。请注意,有些恶意软件概念验证试图攻击管理程序。 |
在真实设备上测试¶
几乎任何物理设备都可以用于测试,但有几点需要考虑。首先,设备需要可Root。这通常通过漏洞利用或解锁 Bootloader 来完成。漏洞利用并非总是可用,Bootloader 可能永久锁定,或者只有在运营商合同终止后才能解锁。
最佳选择是为开发者构建的 Google Pixel 旗舰设备。这些设备通常带有可解锁的 Bootloader、在线可用的开源固件、内核、无线电以及官方操作系统源代码。开发者社区更倾向于 Google 设备,因为其操作系统最接近 Android 开源项目。这些设备通常具有最长的支持周期,提供 2 年的操作系统更新和之后 1 年的安全更新。
或者,Google 的 Android One 项目包含的设备将获得相同的支持周期(2 年操作系统更新,1 年安全更新),并提供接近原生的体验。虽然它最初是为低端设备启动的项目,但该计划已发展到包括中端和高端智能手机,其中许多都得到了修改社区的积极支持。
受 LineageOS 项目支持的设备也是非常好的测试设备选择。它们拥有活跃的社区、易于遵循的刷机和 Root 说明,并且最新的 Android 版本通常可以作为 Lineage 安装快速获得。LineageOS 还在原始设备制造商(OEM)停止分发更新后很长时间内继续支持新的 Android 版本。
使用 Android 物理设备时,您需要在设备上启用开发者模式和 USB 调试,以便使用 * adb* 调试接口。自 Android 4.2 (API level 16) 以来,设置应用程序中的开发者选项子菜单默认是隐藏的。要激活它,请在关于手机视图的版本号部分点击七次。请注意,版本号字段的位置因设备而异。例如,在 LG 手机上,它位于关于手机 -> 软件信息下。完成此操作后,开发者选项将显示在设置菜单底部。激活开发者选项后,您可以使用USB 调试开关启用调试。
在模拟器上测试¶
存在多种模拟器,它们各有优缺点。
免费模拟器
- Android 虚拟设备 (AVD) - 官方 Android 模拟器,随 Android Studio 分发。
- Android X86 - Android 代码库的 x86 移植版
商业模拟器
- Genymotion - 成熟的模拟器,功能丰富,提供本地和云端解决方案。提供免费版供非商业用途使用。
- Corellium - 通过云端或本地解决方案提供自定义设备虚拟化。
尽管存在多种免费的 Android 模拟器,但我们建议使用 AVD,因为它提供了比其他模拟器更适合测试应用程序的增强功能。本指南的其余部分将使用官方 AVD 进行测试。
AVD 支持一些硬件模拟,例如通过其所谓的扩展控制以及运动传感器进行 GPS 或短信功能模拟。
您可以通过 Android Studio 中的 AVD 管理器启动 Android 虚拟设备 (AVD),也可以通过命令行使用 `android` 命令(该命令位于 Android SDK 的 tools 目录下)启动 AVD 管理器。
./android avd
有几种工具和虚拟机可用于在模拟器环境中测试应用程序:
获取特权访问¶
建议在真实设备上进行测试时进行 *Root*(即修改操作系统,以便您可以作为 root 用户运行命令)。这使您可以完全控制操作系统,并绕过应用程序沙盒等限制。这些特权反过来又使您可以更轻松地使用代码注入和函数钩取等技术。
请注意,Root 具有风险,在您继续之前需要明确三个主要后果。Root 可能产生以下负面影响:
- 设备保修失效(在采取任何行动之前务必查阅制造商的政策)
- 使设备“变砖”,即使其无法操作和无法使用
- 产生额外的安全风险(因为内置的漏洞利用缓解措施通常会被移除)
您不应 Root 存储私人信息的个人设备。我们建议购买一个便宜的专用测试设备。许多旧设备,例如 Google 的 Nexus 系列,可以运行最新的 Android 版本,并且非常适合测试。
您需要了解,Root 您的设备最终是您自己的决定,OWASP 对任何损害不承担任何责任。如果您不确定,请在开始 Root 过程之前寻求专家建议。
哪些手机可以被Root¶
几乎任何 Android 手机都可以被 Root。Android 操作系统的商业版本(在内核级别是 Linux 操作系统的演进)针对移动世界进行了优化。这些版本删除或禁用了某些功能,例如非特权用户成为“root”用户(拥有提升权限的用户)的能力。Root 手机意味着允许用户成为 root 用户,例如,添加一个名为 `su` 的标准 Linux 可执行文件,它用于切换到另一个用户帐户。
要 Root 移动设备,首先要解锁其 Bootloader。解锁过程取决于设备制造商。然而,出于实际原因,Root 某些移动设备比 Root 其他设备更受欢迎,尤其是在安全测试方面:由 Google 制造并由三星、LG 和摩托拉等公司生产的设备是最受欢迎的设备之一,特别是由于它们被许多开发人员使用。Bootloader 解锁后,设备保修不会失效,Google 也提供了许多工具来支持 Root 本身。
使用Magisk进行Root¶
Magisk(“魔法面具”)是一种 Root Android 设备的方法。它的特点在于对系统进行修改的方式。其他 Root 工具会更改系统分区上的实际数据,而 Magisk 不会(这被称为“无系统”)。这使得能够将修改隐藏起来,不被对 Root 敏感的应用程序(例如银行或游戏应用)检测到,并且无需事先解除 Root 即可使用官方 Android OTA 升级。
您可以阅读 GitHub 上的官方 Magisk 文档来熟悉 Magisk。如果您尚未安装 Magisk,可以在文档中找到安装说明。如果您使用的是官方 Android 版本并计划升级,Magisk 在 GitHub 上提供了一个 OTA 安装教程。
此外,开发者可以利用 Magisk 的强大功能创建自定义模块,并将其提交到官方的Magisk Modules 仓库。提交的模块随后可以在 Magisk Manager 应用程序内安装。其中一个可安装模块是 * Xposed* 的无系统版本(适用于 SDK 27 及以下版本)。
Root检测¶
“在 Android 上测试反逆向工程防御”一章中介绍了 Root 检测方法的详细列表。
对于典型的移动应用安全构建,您通常会希望测试一个禁用 Root 检测的调试构建。如果无法获取此类构建用于测试,您可以通过本书后面介绍的各种方法禁用 Root 检测。