Android 安全 AutoRepro

AutoRepro Gradle 插件基于 Android Trade Federation 自动化测试框架构建而成,用于对所有 Android 设备进行安全补丁测试,以针对Android 安全公告中的漏洞进行测试。此类测试专门用于与(或将与)常见漏洞和风险 (CVE) 相关联的修复程序。

借助该插件,您可以使用 Android Studio 或标准 Android SDK 在 Android 源代码树之外开发 Tradefed 测试。它包含构建和运行 Tradefed 测试所需的所有实用程序。

它主要用于向 Android 漏洞奖励计划提交自动可重现的概念验证。

下载 AutoRepro 示例

前提条件

我们提供了适用于 64 位 Linux PC 的说明。

  • Android Studio Ladybug 或更高版本 - 也可以通过发行版的软件包管理器安装。
  • Android SDK 平台工具adbfastboot)- 需要安装并将其置于 $PATH(也就是说,您应该能够从命令行运行 adb)。安装平台工具的最简单方法是通过发行版的软件包管理系统安装。
    • 如果使用的是 Android Studio 的 SDK 管理器,而不是独立平台工具,请记得将 SDK 的 platform-tools 目录添加到 $PATH 中,以便进行命令行开发。
  • 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 插件:

  1. Gradle 插件 id("com.android.security.autorepro.javahosttest") 单个主机端 Tradefed 测试,该测试通过 ADB 与设备交互。示例在 submission/hostTest/ 目录中使用它。
  2. Gradle 插件 id("com.android.security.autorepro.apptest") 应用或服务 APK,通过 adb install 安装到设备上并且由主机端测试启动。该应用或服务还可以包含自己的一组 JUnit 断言,这些断言会报告给主机端运行器。示例在 submission/appTest/ 和目录中使用了它。
  3. Gradle 插件 id("com.android.security.autorepro.ndktest") 可选的基于 NDK 的概念验证攻击,通过 adb push 推送到设备,并由主机端测试执行。此示例在 submission/ndkTest/ 目录中使用了该文件。

典型的 AutoRepro 测试流程通常遵循以下两种模式之一:

  • 插桩测试应用:

    1. 主机端测试将包含插桩应用或服务的 APK 推送到设备上。
    2. 主机端测试通过 runDeviceTest() 启动与 APK 捆绑在一起的设备端 JUnit 测试
    3. 设备端 JUnit 测试使用 UIAutomator 来点按按钮和观测应用,或者通过会披露安全漏洞的方式访问 Android API。
    4. 设备端 JUnit 测试的成败结果会返回给主机端测试,用于确定测试是否通过。失败消息应包含有关断言失败原因的详细信息,以及任何特定对象、值、异常、堆栈轨迹或其他制品作为漏洞证明。
  • NDK 概念验证:

    1. 主机端测试会推送并在设备上启动 Linux 可执行文件。
    2. 原生程序崩溃或返回特定的退出代码。
    3. 主机端测试会检查崩溃情况,查看 logcat 回溯,或查找特定的退出代码以确定攻击是否成功。失败消息应包含有关断言失败原因的详细信息,以及任何特定的结构体、值、堆栈轨迹或其他制品作为漏洞证明。

也可以结合使用这两种模式(例如,将原生程序与设备端测试一起运行)。您也可以使用某些其他插桩框架,例如 frida-inject。 如需了解详情,请参阅安全测试套件参考文档Tradefed 参考文档

我的概念验证攻击不需要测试应用或原生可执行文件

大多数测试都不需要设备端应用和原生可执行文件。

如果您的测试不涉及使用某个功能,请删除不必要的 Gradle 子项目目录。

我的概念验证攻击涉及第二个应用/服务

您可以根据需要添加任意数量的包含 AutoRepro 插件的 Gradle 子项目。

提交 AutoRepro 测试

如需在提交内容中包含设备的测试结果,请执行以下操作:

  • (可选)运行 Gradle clean 任务以删除所有旧的测试运行。
  • 运行适当的 AutoRepro 运行配置,以便为您的测试调用 Tradefed 并收集日志和结果。
  • 运行 copyInvocationResultsToSubmission 任务,将日志和结果复制到提交源目录中。

运行 assembleSubmissionZip 以创建 submission/build/autorepro-submission.zip 文件。将此文件连同您提交的内容一起上传到 Android 漏洞奖励计划。确保附件符合 *autorepro-submission*.zip 模式,并且随初始报告一起上传。如果您延迟上传提交内容,我们将无法妥善审核您的举报。