AutoRepro Gradle 插件基于 Android Trade Federation 自动化测试框架构建而成,用于对所有 Android 设备进行安全补丁测试,以针对Android 安全公告中的漏洞进行测试。此类测试专门用于与(或将与)常见漏洞和风险 (CVE) 相关联的修复程序。
借助该插件,您可以使用 Android Studio 或标准 Android SDK 在 Android 源代码树之外开发 Tradefed 测试。它包含构建和运行 Tradefed 测试所需的所有实用程序。
它主要用于向 Android 漏洞奖励计划提交自动可重现的概念验证。
前提条件
我们提供了适用于 64 位 Linux PC 的说明。
- Android Studio Ladybug 或更高版本 - 也可以通过发行版的软件包管理器安装。
- Android SDK 平台工具(
adb
、fastboot
)- 需要安装并将其置于$PATH
(也就是说,您应该能够从命令行运行adb
)。安装平台工具的最简单方法是通过发行版的软件包管理系统安装。- 如果使用的是 Android Studio 的 SDK 管理器,而不是独立平台工具,请记得将 SDK 的
platform-tools
目录添加到$PATH
中,以便进行命令行开发。
- 如果使用的是 Android Studio 的 SDK 管理器,而不是独立平台工具,请记得将 SDK 的
- AAPT2 - 也可以使用发行版的软件包管理器进行安装。
- Java JDK 21 或更高版本 - 与 Android SDK 和 Gradle 兼容。
使用 Android Studio
提取示例或模板后,将 Android Studio 中的目录作为现有项目打开,然后等待 Gradle 同步完成。有多个预配置的 Android Studio 运行配置。
Gradle 任务:
assembleSubmissionSources
- 组合提交 ZIP 文件的源文件。assembleSubmissionZip
- 组合提交 ZIP 文件以进行上传。copyInvocationResultsToSubmission
- 将之前的 Tradefed 调用的结果复制到 AutoRepro 提交源目录中,以协助审核流程。请注意,这包含来自主机和设备的两种日志;在运行此命令之前或之后查看内容。
AutoRepro 调用 Android Studio 运行配置:
autorepro_nonroot_arm64
autorepro_nonroot_x86_64
autorepro_root_arm64
autorepro_root_x86_64
启动器配置采用 autorepro_{device_root}_{device_arch}
的形式。通常最好使用非 root 权限,因为需要 root 权限的漏洞不太严重。不过,使用 root 执行设置或清理操作是可以接受的,只要明确记录并被普遍接受为有效的非 root 状态即可。例如,可以使用 root 伪造向设备发送短信,以免需要第二台设备和多个 SIM 卡。
这些命令将启动 Tradefed 以进行测试。Tradefed 会等待连接到有效设备,因此请确保已连接到设备并已授权 ADB 调试。
编写 AutoRepro 测试
AutoRepro 测试包含三个部分和三个对应的 Gradle 插件:
- Gradle 插件
id("com.android.security.autorepro.javahosttest")
单个主机端 Tradefed 测试,该测试通过 ADB 与设备交互。示例在submission/hostTest/
目录中使用它。 - Gradle 插件
id("com.android.security.autorepro.apptest")
应用或服务 APK,通过adb install
安装到设备上并且由主机端测试启动。该应用或服务还可以包含自己的一组 JUnit 断言,这些断言会报告给主机端运行器。示例在submission/appTest/
和目录中使用了它。 - Gradle 插件
id("com.android.security.autorepro.ndktest")
可选的基于 NDK 的概念验证攻击,通过adb push
推送到设备,并由主机端测试执行。此示例在submission/ndkTest/
目录中使用了该文件。
典型的 AutoRepro 测试流程通常遵循以下两种模式之一:
插桩测试应用:
- 主机端测试将包含插桩应用或服务的 APK 推送到设备上。
- 主机端测试通过
runDeviceTest()
启动与 APK 捆绑在一起的设备端 JUnit 测试 - 设备端 JUnit 测试使用 UIAutomator 来点按按钮和观测应用,或者通过会披露安全漏洞的方式访问 Android API。
- 设备端 JUnit 测试的成败结果会返回给主机端测试,用于确定测试是否通过。失败消息应包含有关断言失败原因的详细信息,以及任何特定对象、值、异常、堆栈轨迹或其他制品作为漏洞证明。
NDK 概念验证:
- 主机端测试会推送并在设备上启动 Linux 可执行文件。
- 原生程序崩溃或返回特定的退出代码。
- 主机端测试会检查崩溃情况,查看 logcat 回溯,或查找特定的退出代码以确定攻击是否成功。失败消息应包含有关断言失败原因的详细信息,以及任何特定的结构体、值、堆栈轨迹或其他制品作为漏洞证明。
也可以结合使用这两种模式(例如,将原生程序与设备端测试一起运行)。您也可以使用某些其他插桩框架,例如 frida-inject
。 如需了解详情,请参阅安全测试套件参考文档和 Tradefed 参考文档。
我的概念验证攻击不需要测试应用或原生可执行文件
大多数测试都不需要设备端应用和原生可执行文件。
如果您的测试不涉及使用某个功能,请删除不必要的 Gradle 子项目目录。
我的概念验证攻击涉及第二个应用/服务
您可以根据需要添加任意数量的包含 AutoRepro 插件的 Gradle 子项目。
提交 AutoRepro 测试
如需在提交内容中包含设备的测试结果,请执行以下操作:
- (可选)运行 Gradle
clean
任务以删除所有旧的测试运行。 - 运行适当的 AutoRepro 运行配置,以便为您的测试调用 Tradefed 并收集日志和结果。
- 运行
copyInvocationResultsToSubmission
任务,将日志和结果复制到提交源目录中。
运行 assembleSubmissionZip
以创建 submission/build/autorepro-submission.zip
文件。将此文件连同您提交的内容一起上传到 Android 漏洞奖励计划。确保附件符合 *autorepro-submission*.zip
模式,并且随初始报告一起上传。如果您延迟上传提交内容,我们将无法妥善审核您的举报。