
Helper per la valutazione di deeplink Android, Intent e bridge WebView per l'hacking etico.
Helper per la valutazione di deeplink Android, Intent e bridge WebView
apk-interceptor è un APK di test Android portabile per valutazioni di sicurezza applicativa autorizzate. Aiuta gli ingegneri della sicurezza a verificare come un'app Android gestisce i punti di ingresso esterni, come scheme URI personalizzati, deeplink, Activity esportate e bridge JavaScript WebView.
Lo strumento è volutamente limitato:
android.permission.INTERNETcontent://Durante le valutazioni di sicurezza di applicazioni Android, molti risultati dell'analisi statica necessitano ancora di una piccola prova di concetto sul dispositivo prima di poter essere confermati: registrare uno scheme URI personalizzato, inviare un Intent esplicito, servire un payload content:// locale o verificare se JavaScript può raggiungere un bridge WebView.
Creare una nuova app di test usa-e-getta per ogni caso è ripetitivo e soggetto a errori. Piccole differenze nelle voci del manifest, nelle authority, nelle grant URI, nei nomi dei pacchetti o nella costruzione degli Intent possono rallentare la verifica e rendere i risultati più difficili da riprodurre.
apk-interceptor è stato creato per rendere ripetibile questa fase di conferma. Invece di scrivere un nuovo APK PoC per ogni valutazione, costruisci questo strumento con lo scheme autorizzato o l'application ID di cui hai bisogno, esegui il test sul dispositivo e mantieni il flusso di lavoro volutamente limitato: nessun permesso INTERNET, nessuna trasmissione di dati esterni, nessuna esecuzione shell e nessuna dipendenza da root.
apk-interceptor è utile per queste attività di valutazione:
Approfondimenti dettagliati sulle vulnerabilità:
content://L'app mantiene un log di valutazione in memoria per Intent inviati, deeplink ricevuti, callback del bridge, risultati JavaScript ed errori. I log scompaiono quando il processo dell'app viene terminato. Poiché i log non vengono persistiti, acquisisci le evidenze con screenshot o registrazione dello schermo mentre lavori.
apk-interceptor è uno strumento di conferma, non un framework di scoperta o exploitation. Presuppone che tu sappia già cosa testare (scheme, classe Activity, nome del bridge) dall'analisi statica e offre un modo sicuro, sul dispositivo, per verificare la raggiungibilità e acquisire evidenze. È pensato per essere installato su un dispositivo di valutazione e persino condiviso con un cliente, quindi non include permesso INTERNET, nessuna esecuzione shell, nessuna esfiltrazione di dati e nessun requisito di root.
Dove si colloca rispetto ai soliti strumenti Android:
Le due aree in cui apk-interceptor ha il vantaggio più chiaro rispetto alle alternative:
adb/l'analisi statica non possono mostrare.content://: un provider non esportato, a file singolo, il cui payload viene consegnato solo tramite una grant di lettura Intent temporanea, più una WebView di auto-test locale per validare prima la sintassi del payload.apk-interceptor tratta l'invio e l'intercettazione in modo diverso, e questa è la cosa più importante da capire prima di usarlo:
| Azione | Modulo | Scheme personalizzato necessario in fase di build? |
|---|---|---|
| Inviare un Intent o un deeplink a un'altra app | Sender | No, inserisci qualsiasi URI, pacchetto o Activity a runtime |
| Intercettare (ricevere) un deeplink per uno scheme personalizzato | Interceptor | Sì, lo scheme viene fissato nell'APK in fase di build |
Per inviare un deeplink appositamente costruito all'app valutata, non è necessario ricompilare: usa la modalità Implicit Deeplink della scheda Sender e inserisci un qualsiasi URI.
Per intercettare un deeplink, cioè far sì che Android instradi uno scheme personalizzato verso apk-interceptor in modo da poter osservare un possibile scheme-hijack, devi compilare l'APK con quello scheme tramite --scheme. Lo scheme è fissato in fase di build deliberatamente (un guardrail di progettazione); apk-interceptor non registra mai scheme arbitrari a runtime. Se cambi lo scheme che stai valutando, ricompila e reinstalla.
adb per l'installazione sul dispositivo e test opzionali da riga di comandoCompila l'APK con lo scheme URI personalizzato che sei autorizzato a valutare:
./build-interceptor.sh --scheme <authorized_custom_scheme>
adb install ./out/apk-interceptor-<authorized_custom_scheme>-debug.apk
Flag di build opzionali:
./build-interceptor.sh \
--scheme <authorized_custom_scheme> \
--app-id <custom.application.id> \
--output ./out
--app-id imposta l'application ID installato (l'identità del pacchetto sul dispositivo e l'autorità content://<applicationId>.payload) in fase di build. Il valore predefinito è com.sterrasec.apkinterceptor. Puoi sovrascriverlo con --app-id quando hai bisogno di più build installabili separatamente per valutazioni diverse. L'equivalente Windows è build-interceptor.bat.
Lo scheme predefinito intercept-poc-example è un segnaposto innocuo. Lo script di build rifiuta di produrre un APK di valutazione con questo scheme predefinito.
Al primo avvio per ogni versione dell'app, apk-interceptor mostra un dialogo di uso autorizzato. Dopo aver toccato Ho capito, la stessa versione non mostra più il dialogo. La scheda Sender mostra comunque un avviso persistente perché può inviare Intent ad altre app.
| Sender | Payload | Interceptor |
|---|---|---|
![]() | ![]() | ![]() |
Usa questa scheda per verificare l'intercettazione di scheme URI personalizzati.
Cosa mostra:
Flusso di lavoro base:
Informazioni su Send Test Deeplink: invia sempre <scheme>://test?<i tuoi parametri> con un host test fisso, quindi serve a confermare che apk-interceptor riceva e registri lo scheme, non a pilotare le rotte deeplink specifiche dell'app valutata. Per inviare un deeplink appositamente costruito che corrisponda all'host o al path richiesto dall'app valutata, usa invece la modalità Implicit Deeplink della scheda Sender.
Esempio adb:
adb shell am start -W \
-a android.intent.action.VIEW \
-d 'my-authorized-scheme://test?source=adb\&message=hello%20world'
Usa \& quando invii più parametri query tramite adb shell; altrimenti la shell del dispositivo potrebbe trattare & come separatore di comandi.
Risultato atteso:
RECEIVEDUsa questa scheda per inviare Intent controllati durante un test autorizzato.
Modalità:
Intent(ACTION_VIEW, Uri.parse(uri))Campi e controlli:
Flusso di lavoro con deeplink implicito:
Flusso di lavoro con Activity esplicita:
Note:
content:// è utile quando si verifica se un'Activity target passa dati Intent non attendibili a una WebView.data dell'Intent, il che sovrascriverebbe l'URI digitato in modalità Implicit Deeplink, quindi l'opzione è nascosta in quel caso.PayloadProvider non è esportato. L'app valutata può leggere il payload content:// allegato solo perché l'Intent le concede un accesso temporaneo in lettura tramite FLAG_GRANT_READ_URI_PERMISSION. Mantieni questo flag abilitato e consegna l'URI tramite l'Intent. Un URI content:// aperto in qualsiasi altro modo non sarà leggibile da un'altra app.Usa questa scheda per creare un payload HTML locale e validare la sintassi del bridge JavaScript nella WebView di auto-test di apk-interceptor.
Cosa contiene:
content:// generatoFormato URI del payload generato:
content://<applicationId>.payload/current.html
Il provider serve solo questo file fisso:
filesDir/payloads/current.html
Flusso di lavoro di auto-test del payload:
localBridge.BRIDGE_RESULT, console.log e evaluateJavascript result nel log.Esempio di JavaScript per l'auto-test:
console.log("payload loaded");
window.localBridge.logResult(window.localBridge.getInfo());
Il bridge di auto-test espone:
window.<bridgeName>.logResult("message");
window.<bridgeName>.getInfo();
Limitazione importante:
La WebView di auto-test conferma che il payload locale e la sintassi delle chiamate al bridge funzionano all'interno di apk-interceptor. Non può osservare se la WebView di un'altra app ha eseguito il tuo payload o ha chiamato il proprio bridge. Per l'app valutata, verifica tramite l'interfaccia utente, i log, gli hook di test o Chrome DevTools se l'app è debuggable.
Rischio:
Un'app Android registra uno scheme URI personalizzato invece di un App Link verificato. Qualsiasi altra app può registrare lo stesso scheme, quindi Android potrebbe mostrare un selettore di app o instradare i link verso un'app diversa.
Usa apk-interceptor per verificare:
Passaggi:
Evidenze da acquisire:
Rischio:
L'app valutata si fida dei parametri dei deeplink per navigazione, caricamento di URL, feature flag, selezione dell'account o rendering senza una validazione sufficiente.
Usa apk-interceptor per verificare:
Passaggi:
Esempio segnaposto:
my-authorized-scheme://open?next=https%3A%2F%2Fauthorized-test.example%2Flanding
Non usare domini o account reali di terze parti a meno che non siano esplicitamente in scope.
Rischio:
Un'Activity esportata esegue azioni sensibili o mostra dati sensibili senza verificare il chiamante, lo stato dell'utente o l'autorizzazione richiesta.
Usa apk-interceptor per verificare:
Passaggi:
content:// locale.Evidenze da acquisire:
content://Rischio:
L'app valutata carica dati Intent content:// non attendibili in una WebView che espone anche un bridge JavaScript tramite addJavascriptInterface.
Usa apk-interceptor per verificare:
content://Passaggi:
Limitazione importante:
apk-interceptor non può ricevere risultati da un'altra app a meno che quell'app non li restituisca o li mostri esplicitamente. Lo strumento è progettato per consegnare un payload locale e validare la sintassi, non per esfiltrare dati.
Verifica che l'APK non richieda accesso alla rete:
aapt dump permissions ./out/apk-interceptor-<scheme>-debug.apk
Previsto: nessun android.permission.INTERNET.
Attiva un deeplink esplicitamente verso apk-interceptor:
adb shell am start -W \
-n com.sterrasec.apkinterceptor/.InterceptActivity \
-a android.intent.action.VIEW \
-d 'my-authorized-scheme://test?source=adb'
Attiva un deeplink tramite il resolver di Android:
adb shell am start -W \
-a android.intent.action.VIEW \
-d 'my-authorized-scheme://test?source=adb'
Il comando esplicito conferma il comportamento di InterceptActivity. Il comando implicito conferma l'intent-filter del manifest e il comportamento del resolver.
I test unitari vengono eseguiti sulla JVM con Robolectric, quindi non è richiesto un dispositivo o un emulatore. Coprono PayloadProvider, inclusi i controlli di whitelisting dei path e di traversal che impediscono al provider di servire qualsiasi cosa diversa dal singolo payload current.html.
./gradlew testDebugUnitTest
I risultati dei test vengono scritti in app/build/reports/tests/testDebugUnitTest/index.html. La stessa attività viene eseguita in CI a ogni push e pull request su main.
android.permission.INTERNET/current.html viene servito da PayloadProviderMIT
| Scenario | Modulo | Cosa Aiuta a Verificare |
|---|
| Hijacking di scheme URI personalizzati | Interceptor | Se un'altra app può registrare lo stesso scheme personalizzato e ricevere i link |
| Gestione dei parametri dei deeplink | Sender | Se l'app valutata accetta parametri query/path non sicuri |
| Esposizione di Activity esportate | Sender | Se un'Activity esportata può essere avviata direttamente da un'altra app |
Esposizione del bridge WebView tramite content:// | Payload + Sender | Se un payload HTML locale può raggiungere un bridge JavaScript WebView |
| Controllo della sintassi del payload locale | Payload | Se il payload HTML/JS viene eseguito nella WebView di auto-test |
| Strumento | Ruolo | Come si differenzia apk-interceptor |
|---|
| jadx / MobSF / QARK / Semgrep | Trovare i punti di ingresso vulnerabili (statica) | apk-interceptor non esegue scansioni né decompilazioni; conferma un finding che hai già |
deep-C / NSdeepLink / adb am start | Enumerare e inviare deeplink | apk-interceptor può anche inviare, ma il suo elemento distintivo è ricevere uno scheme dirottato e mostrare l'URI esatto e i parametri |
| drozer | Framework di attacco generico sul dispositivo (agente + spesso root) | apk-interceptor è un singolo APK leggero con guardrail di sicurezza deliberati, scope più limitato e distribuzione più semplice e sicura per il cliente |
| Metasploit / Frida | Weaponizzare o hook (es. RCE con addJavascriptInterface) | apk-interceptor controlla solo la raggiungibilità del bridge con un payload innocuo; non esfiltra mai dati né esegue comandi shell |