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 Manager 而非獨立平台工具,請務必將 SDK 的
platform-tools
目錄新增至$PATH
,以便進行指令列開發作業。
- 如果您使用 Android Studio 的 SDK Manager 而非獨立平台工具,請務必將 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")
透過adb install
安裝在裝置上的應用程式或服務 APK,並由主機端測試啟動。應用程式或服務也可以包含自己的 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
。詳情請參閱 Security Test Suite 參考文件和 Tradefed 參考文件。
我的概念驗證攻擊不需要測試應用程式或原生執行檔
大多數測試都不需要同時使用裝置端應用程式和原生執行檔。
如果測試不涉及使用某項功能,請刪除不必要的 Gradle 子專案目錄。
我的概念驗證攻擊涉及第二個應用程式/服務
您可以使用 AutoRepro 外掛程式新增任意數量的 Gradle 子專案。
提交 AutoRepro 測試
如要將裝置的測試結果納入提交內容:
- 您可以選擇執行 Gradle
clean
工作,藉此刪除任何舊的測試執行作業。 - 執行適當的 AutoRepro 執行設定,為測試叫用 Tradefed,並收集記錄和結果。
- 執行
copyInvocationResultsToSubmission
工作,將記錄和結果複製到提交來源目錄。
執行 assembleSubmissionZip
即可建立 submission/build/autorepro-submission.zip
檔案。請將該檔案與提交至 Android 安全漏洞獎勵計畫的內容一併上傳。請確認附件符合 *autorepro-submission*.zip
模式,且已隨初始報表上傳。上傳內容的時間若過晚,我們就無法妥善審查您的回報。