AutoRepro Gradle 外掛程式是以 Android Trade Federation 測試架構為基礎建構而成,可針對Android 安全性公告中的安全漏洞,測試所有 Android 裝置的安全性修補程式。這些測試專門用於與常見安全漏洞與資料外洩 (CVE) 相關聯或將相關聯的修正項目。
這個外掛程式可讓您使用 Android Studio 或標準 Android SDK,在 Android 來源樹狀結構外部開發 Tradefed 測試。其中包含建構及執行 Tradefed 測試所需的所有公用程式。
主要用於為 Android 安全漏洞獎勵計畫提交可自動重現的概念驗證。
必要條件
以下說明適用於 64 位元 Linux 電腦。
- 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
- Assemble the source files for the submission 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 權限,在裝置上模擬傳送簡訊,避免需要第二部裝置和多張 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 子專案目錄。
我的概念性驗證攻擊涉及第二個應用程式/服務
新增任意數量的 Gradle 子專案,並搭配 AutoRepro 外掛程式。
提交 AutoRepro 測試
如要在提交內容時附上裝置的測試結果,請按照下列步驟操作:
- (選用) 執行 Gradle
clean
工作,刪除所有舊的測試執行。 - 執行適當的 AutoRepro 執行設定,為測試叫用 Tradefed,並收集記錄和結果。
- 執行
copyInvocationResultsToSubmission
工作,將記錄和結果複製到提交來源目錄。
執行 assembleSubmissionZip
即可建立 submission/build/autorepro-submission.zip
檔案。將該檔案連同提交內容上傳至 Android 安全漏洞檢舉計畫。請確認附件符合 *autorepro-submission*.zip
模式,並與初始報告一併上傳。如果延遲上傳提交內容,我們可能無法正確審查您的報告。