這次回報的漏洞是跟Wave有關的,為一個Anroid APP,在Google Play上有超過十萬次下載,主打的是將GPT與瀏覽器做結合,可以提供頁面內容總結,也可以如ChatGPT一樣提供對話解答。
在設置Android APP Activity時,將exported設置為true,但是並沒有做其他權限設置及對接入資料做清洗限制,外部惡意APP可以透過activity執行惡意程式碼或者跳轉網頁進而可以取得機敏資料。
<activity android:theme="@style/Theme.App.Splash"
android:name="wave.ai.browser.ui.splash.SplashScreen"
android:exported="true"
android:launchMode="singleTop"
android:screenOrientation="portrait">
</activity>
1.0.35 及以下
Intent intent = new Intent();
intent.setComponent(new ComponentName("wave.ai.browser", "wave.ai.browser.ui.splash.SplashScreen"));
intent.setData(Uri.parse("javascript:malicious_code_here"));
startActivity(intent);
Intent intent = new Intent();
intent.setComponent(new ComponentName("wave.ai.browser", "wave.ai.browser.ui.splash.SplashScreen"));
intent.setData(Uri.parse("http://maliciouswebsitetest.com/"));
startActivity(intent);
根據Google官方文件,我們可以在Android Manifest裡新增permission來限制activity權限。
一般建議將protectionLevel
設置為signature
以確保只有用相同私鑰簽名打包的app可以請求權限。(signatureOrSystem
也可以達成相同功能,不過此項已經在API Level 23被設置為deprecated因此不建議使用)
<permission android:description="string resource"
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permissionGroup="string"
android:protectionLevel=["normal" | "dangerous" |
"signature" | ...] />
在Activity內設置intent filter可以限制元件執行activity
<intent-filter android:icon="drawable resource"
android:label="string resource"
android:priority="integer" >
...
</intent-filter>
在上面的sample code可以看到,wave browser基本上是接什麼就吃什麼,因此可以針對輸入資料進行處理或者直接拒絕執行JavaScript code
// Activity啟動時執行
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent incomingIntent = getIntent();
// 檢查輸入是否包含JavaScript
if (incomingIntent != null && incomingIntent.hasExtra("javascript")) {
String javascriptCode = incomingIntent.getStringExtra("javascript");
if (reallyNeedJavaScript) {
// Execute the JavaScript here
} else {
// Skup execute JavaScript
}
}
}