Il plug-in Gradle AutoRepro è basato sul framework di test Android Trade Federation per testare tutti i dispositivi Android per i test delle patch di sicurezza rispetto alle vulnerabilità del Bollettino sulla sicurezza di Android. Questi test riguardano esclusivamente le correzioni associate o che verranno associate a una vulnerabilità ed esposizione comune (CVE).
Il plug-in consente lo sviluppo di test Tradefed al di fuori della struttura di origine Android utilizzando Android Studio o l'SDK Android standard. Include tutte le utilità necessarie per creare ed eseguire un test Tradefed.
Viene utilizzato principalmente per inviare prove di concetto riproducibili automaticamente per il Vulnerability Reward Program di Android.
Direct Download AutoRepro Example
Sfoglia l'esempio e i modelli di AutoRepro
Prerequisiti
Le istruzioni sono fornite per un PC Linux a 64 bit.
- Android Studio Ladybug o versioni successive: può essere installato anche dal gestore dei pacchetti della tua distribuzione.
- Strumenti della piattaforma Android SDK
(
adb,fastboot) - Devono essere installati e trovarsi in$PATH(ovvero devi essere in grado di eseguireadbdalla riga di comando). Il modo più semplice per installare gli strumenti della piattaforma è utilizzare il gestore di pacchetti della tua distribuzione.- Se utilizzi SDK Manager di Android Studio anziché gli strumenti della piattaforma
autonomi, ricordati di aggiungere la directory
platform-toolsdell'SDK al tuo$PATHper lo sviluppo da riga di comando.
- Se utilizzi SDK Manager di Android Studio anziché gli strumenti della piattaforma
autonomi, ricordati di aggiungere la directory
- AAPT2. - Può anche essere installato utilizzando il gestore di pacchetti della tua distribuzione.
- Java JDK 21 o versioni successive, compatibile con l'SDK Android e Gradle.
Iniziare a utilizzare Android Studio
Dopo aver estratto l'esempio o il modello, apri la directory in Android Studio come progetto esistente e attendi il completamento della sincronizzazione di Gradle. Esistono diverse configurazioni di esecuzione di Android Studio preconfigurate.
Attività Gradle:
assembleSubmissionSources- Assembla i file di origine per il file ZIP dell'invio.assembleSubmissionZip- Assembla il file ZIP di invio da caricare.copyInvocationResultsToSubmission: copia i risultati delle chiamate Tradefed precedenti nella directory delle origini di invio di AutoRepro per facilitare il processo di revisione. Tieni presente che questo file contiene log sia dell'host sia del dispositivo. Esamina i contenuti prima o dopo l'esecuzione.
Configurazioni di esecuzione di Android Studio per la chiamata di AutoRepro:
autorepro_nonroot_arm64autorepro_nonroot_x86_64autorepro_root_arm64autorepro_root_x86_64
Le configurazioni del launcher sono nel formato
autorepro_{device_root}_{device_arch}. In genere è preferibile utilizzare
nonroot perché le vulnerabilità che richiedono l'accesso root sono meno gravi. Tuttavia, l'utilizzo
di root per eseguire la configurazione o la pulizia può essere accettabile a condizione che sia chiaramente
documentato e sia generalmente accettato come stato non root valido. Ad esempio, è
accettabile utilizzare il root per simulare l'invio di messaggi di testo al dispositivo per evitare
di richiedere un secondo dispositivo e più schede SIM.
Questi avvieranno Tradefed per il test. Tradefed attende che venga connesso un dispositivo valido, quindi assicurati che uno sia connesso e che il debug ADB sia autorizzato.
Integrazione con gli agenti di codifica
L'esempio e i modelli forniscono un file di contesto AGENTS.md compatibile con
Gemini in Android Studio, Gemini CLI e altri agent di codifica. Contiene contenuti
con opinioni sulla strutturazione degli invii e istruzioni sull'utilizzo di AutoRepro. Puoi
utilizzarlo per:
- Eseguire automaticamente AutoRepro per il dispositivo
- Rivedi il codice di un invio esistente per individuare le modifiche che possono contribuire ad accelerare l'accettazione del report.
- Aiutare a strutturare una nuova prova di concetto in base alle informazioni sulla vulnerabilità
Scrivere un test AutoRepro
Un test AutoRepro è composto da tre parti e da tre plug-in Gradle corrispondenti:
- Plug-in Gradle
id("com.android.security.autorepro.javahosttest")Il singolo test Tradefed lato host che interagisce con il dispositivo tramite ADB. L'esempio lo utilizza nella directorysubmission/hostTest/. - Plug-in Gradle
id("com.android.security.autorepro.apptest")Un APK di app o servizio installato sul dispositivo tramiteadb installe avviato dal test lato host. L'app o il servizio può anche contenere un proprio insieme di asserzioni JUnit che viene segnalato al runner lato host. L'esempio lo utilizza insubmission/appTest/e nella directory. - Plugin Gradle
id("com.android.security.autorepro.ndktest")Un attacco proof-of-concept facoltativo basato su NDK che viene trasferito sul dispositivo tramiteadb pushed eseguito dal test lato host. L'esempio lo utilizza nella directorysubmission/ndkTest/.
Un tipico flusso di test AutoRepro di solito segue uno dei due pattern:
App di test strumentato:
- Il test lato host esegue il push di un APK costituito da un servizio o da un'app instrumentata sul dispositivo.
- Il test lato host avvia i test JUnit lato dispositivo inclusi
nell'APK tramite
runDeviceTest(). - I test JUnit lato dispositivo toccano i pulsanti e osservano l'app utilizzando UIAutomator o accedono alle API Android in modi che rivelano vulnerabilità della sicurezza.
- L'esito positivo o negativo dei test JUnit lato dispositivo viene restituito al test lato host, che può essere utilizzato per determinare se il test è stato superato o meno. Il messaggio di errore deve contenere informazioni dettagliate sul motivo per cui l'asserzione non è riuscita e su eventuali oggetti, valori, eccezioni, stacktrace o altri artefatti specifici come prova della vulnerabilità.
Proof of concept dell'NDK:
- Il test lato host esegue il push e avvia un eseguibile Linux sul dispositivo.
- Il programma nativo ha un arresto anomalo o restituisce un codice di uscita specifico.
- Il test lato host verifica la presenza di arresti anomali, esamina la traccia stack logcat o cerca il codice di uscita specifico per determinare se l'attacco è andato a buon fine. Il messaggio di errore deve contenere informazioni dettagliate sul motivo per cui l'asserzione non è riuscita e su eventuali struct, valori, stacktrace o altri artefatti specifici come prova della vulnerabilità.
È possibile anche una combinazione dei due pattern (ad esempio, l'esecuzione di un programma nativo in combinazione con test lato dispositivo). Sono disponibili anche altri framework di strumentazione, come frida-inject. Per maggiori dettagli, consulta la
documentazione di riferimento di Security Test Suite e la
documentazione di riferimento di Tradefed.
Strutturazione della dimostrabilità della proof of concept
Una PoC di alta qualità deve fare di più che attivare un bug: deve fornire una prova verificabile che un confine di sicurezza è stato superato. Per raggiungere questo obiettivo, i PoC possono seguire un modello specifico in tre passaggi "fallimento-successo":
- Configurazione:prepara il dispositivo installando le app necessarie, trasferendo i file e assicurandoti che il dispositivo si trovi nello stato specifico richiesto immediatamente prima dell'exploit. L'utilizzo della root è consentito per la configurazione se giustificato e rappresentativo di uno stato realistico dell'utente finale.
- Dimostra il limite:prima di attivare la vulnerabilità, tenta l'azione di destinazione e afferma che non va a buon fine. Ad esempio, se l'exploit consente la lettura di un file protetto, devi prima tentare di leggerlo e confermare di ricevere un errore "Autorizzazione negata".
- Attivazione e verifica:attiva la vulnerabilità, quindi ripeti immediatamente l'azione del passaggio 2. Su un dispositivo vulnerabile, questa azione ora dovrebbe riuscire. Per
verificare questo, devi utilizzare un'asserzione che non viene superata su un dispositivo vulnerabile con un
messaggio che inizia con il prefisso esatto
AUTOREPRO_VULNERABILITY_PROVEN:. Questo messaggio deve includere una descrizione concisa della vulnerabilità e degli artefatti acquisiti (come dati trapelati o stati imprevisti) per dimostrare in modo definitivo che l'exploit è andato a buon fine.
Esempio:
@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);
}
}
Il mio attacco proof-of-concept non richiede un'app di test o un eseguibile nativo
La maggior parte dei test non richiede sia un'app lato dispositivo sia un eseguibile nativo.
Se il test non prevede l'utilizzo di una funzionalità, elimina le directory dei sottoprogetti gradle non necessarie.
Il mio attacco proof-of-concept coinvolge una seconda app o un secondo servizio
Aggiungi tutti i sottoprogetti Gradle con i plug-in AutoRepro che preferisci.
Inviare il test AutoRepro
Per includere i risultati dei test dal tuo dispositivo nell'invio:
- (Facoltativo) Esegui il task Gradle
cleanper eliminare le vecchie esecuzioni di test. - Esegui la configurazione di esecuzione AutoRepro appropriata per richiamare Tradefed per il test e raccogliere log e risultati.
- Esegui l'attività
copyInvocationResultsToSubmissionper copiare i log e i risultati nella directory delle origini dell'invio.
Esegui assembleSubmissionZip per creare il file
submission/build/autorepro-submission.zip. Carica il file insieme
alla tua richiesta al Vulnerability Reward Program di Android. Assicurati che l'allegato corrisponda al pattern *autorepro-submission*.zip e che venga caricato con la segnalazione iniziale. Il caricamento tardivo delle richieste influirà sulla nostra
capacità di esaminare correttamente la tua segnalazione.