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- 組裝提交內容的來源檔案,並壓縮成 zip 檔案。assembleSubmissionZip- 組裝要上傳的提交內容 ZIP 檔案。copyInvocationResultsToSubmission- 將先前 Tradefed 呼叫的結果複製到 AutoRepro 提交來源目錄,協助審查程序。請注意,這包含主機和裝置的記錄檔;請在執行此作業前後檢查內容。
AutoRepro 叫用 Android Studio 執行設定:
autorepro_nonroot_arm64autorepro_nonroot_x86_64autorepro_root_arm64autorepro_root_x86_64
啟動器設定採用 autorepro_{device_root}_{device_arch} 形式。一般來說,最好使用非根目錄,因為需要根目錄的安全性漏洞較不嚴重。不過,只要清楚記錄,且一般認為是有效的非 Root 狀態,使用 Root 執行設定或清除作業是可以接受的。舉例來說,您可以使用 Root 權限,在裝置上模擬傳送簡訊,避免需要第二部裝置和多張 SIM 卡。
這些指令會啟動 Tradefed 進行測試。Tradefed 會等待連上有效裝置,因此請確保已連上裝置,並授權 ADB 偵錯。
與程式碼編寫代理程式整合
範例和範本提供與 Android Studio 中的 Gemini、Gemini CLI 和其他程式設計代理程式相容的 AGENTS.md 脈絡檔案。內容包含提交結構的意見,以及使用 AutoRepro 的操作說明。您可以使用這項功能執行下列操作:
- 自動為裝置執行 AutoRepro
- 檢查現有提交內容的程式碼,找出可加快報表核准速度的變更
- 根據安全漏洞資訊,協助建構新的 PoC
編寫 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。詳情請參閱安全性測試套件參考文件和 Tradefed 參考文件。
概念驗證可驗證性結構
高品質的 PoC 不僅要觸發錯誤,還應提供可驗證的證據,證明安全界線已遭突破。為此,PoC 可以遵循特定的三步驟「失敗後成功」模式:
- 設定:安裝必要應用程式、推送檔案,並確保裝置處於特定狀態,為利用漏洞做好準備。(如果使用 Root 權限進行設定是合理的做法,且代表實際使用者狀態,則允許使用)。
- 證明邊界:觸發安全漏洞前,請嘗試目標動作並確認失敗。舉例來說,如果該漏洞允許讀取受保護的檔案,您必須先嘗試讀取該檔案,並確認收到「權限遭拒」錯誤。
- 觸發及驗證:觸發安全漏洞,然後立即重複步驟 2 的動作。在有安全漏洞的裝置上,這項操作現在應該會成功。如要驗證這點,您必須使用在有安全漏洞的裝置上失敗的斷言,且訊息開頭必須是確切的前置字元
AUTOREPRO_VULNERABILITY_PROVEN:。這則訊息必須簡要說明安全漏洞,並附上任何擷取的構件 (例如外洩資料或非預期狀態),以明確證明攻擊成功。
範例:
@Test
public void testPoc() throws Exception {
// 1. Setup: Prepare the device.
setup();
// 2. Prove the Boundary: Assert the resource is protected BEFORE the exploit.
// This passes on all devices (safe or vulnerable) before the trigger runs.
assertDeviceIsSecure();
// 3. Trigger & Verify: Execute the exploit logic, then immediately repeat
// the action from Step 2. On a vulnerable device, this action should now
// succeed, causing assertDeviceIsSecure() to fail with an
// AUTOREPRO_VULNERABILITY_PROVEN message.
triggerExploit();
assertDeviceIsSecure();
}
private void assertDeviceIsSecure() {
try {
String content = readProtectedFile();
// Where possible, put the content in the assertion message.
// Start the assertion message with "AUTOREPRO_VULNERABILITY_PROVEN:".
Assert.fail("AUTOREPRO_VULNERABILITY_PROVEN: Successfully read protected file. Content: '" + content + "'");
} catch (ThisVulnSpecificException e) {
Log.i(TAG, "protected against reading protected file", e);
}
}
我的概念驗證攻擊不需要測試應用程式或原生可執行檔
大多數測試都不需要裝置端應用程式和原生可執行檔。
如果測試不涉及使用某項功能,請刪除不必要的 Gradle 子專案目錄。
我的概念驗證攻擊涉及第二個應用程式或服務
新增任意數量的 Gradle 子專案和 AutoRepro 外掛程式。
提交 AutoRepro 測試
如要在提交內容時附上裝置的測試結果,請按照下列步驟操作:
- (選用) 執行 Gradle
clean工作,刪除所有舊的測試執行作業。 - 執行適當的 AutoRepro 執行設定,為測試叫用 Tradefed,並收集記錄和結果。
- 執行
copyInvocationResultsToSubmission工作,將記錄和結果複製到提交來源目錄。
執行 assembleSubmissionZip 即可建立 submission/build/autorepro-submission.zip 檔案。請將該檔案連同提交內容一併上傳至 Android 安全漏洞檢舉計畫。請確認附件符合 *autorepro-submission*.zip 模式,並與初始報告一併上傳。如果延遲上傳,我們可能無法正確審查您的報告。