OWASP 類別:MASVS-PLATFORM:平台互動
總覽
發生意圖重新導向的情況,是指攻擊者可以部分或完整地控管某個意圖的內容,將該意圖用於在含有安全漏洞的應用程式環境中啟動新元件。
用於啟動新元件的意圖可透過多種方式提供,最常見的是在 extras
欄位中以序列化意圖的形式呈現,或是組合成字串並加以剖析。此外,控制部分參數也可能會導致相同結果。
影響
影響可能因情況而異。攻擊者可能會在含有安全漏洞的應用程式中執行內部功能,也可能會存取未匯出的 ContentProvider 物件等私人元件。
因應措施
一般
一般而言,請勿公開與重新導向巢狀意圖相關的功能。在無法避免的情況下,請採用下列因應方式:
- 適度清理隨附的資訊。請務必檢查或清除標記 (
GRANT_URI_PERMISSIONS
),並檢查意圖重新導向的目的地。您可以借助 IntentSanitizer 執行這項程序。 - 使用
PendingIntent
物件。這樣做可避免系統匯出您的元件,並且防止目標動作意圖變更。
應用程式可以使用 ResolveActivity
等方法,檢查意圖重新導向的位置:
Kotlin
val intent = getIntent()
// Get the component name of the nested intent.
val forward = intent.getParcelableExtra<Parcelable>("key") as Intent
val name: ComponentName = forward.resolveActivity(packageManager)
// Check that the package name and class name contain the expected values.
if (name.packagename == "safe_package" && name.className == "safe_class") {
// Redirect the nested intent.
startActivity(forward)
}
Java
Intent intent = getIntent()
// Get the component name of the nested intent.
Intent forward = (Intent) intent.getParcelableExtra("key");
ComponentName name = forward.resolveActivity(getPackageManager());
// Check that the package name and class name contain the expected values.
if (name.getPackageName().equals("safe_package") &&
name.getClassName().equals("safe_class")) {
// Redirect the nested intent.
startActivity(forward);
}
應用程式可在使用 IntentSanitizer 時採用類似以下的邏輯:
Kotlin
val intent = IntentSanitizer.Builder()
.allowComponent("com.example.ActivityA")
.allowData("com.example")
.allowType("text/plain")
.build()
.sanitizeByThrowing(intent)
Java
Intent intent = new IntentSanitizer.Builder()
.allowComponent("com.example.ActivityA")
.allowData("com.example")
.allowType("text/plain")
.build()
.sanitizeByThrowing(intent);
常見錯誤
- 檢查
getCallingActivity()
是否傳回非空值。惡意應用程式可以為這個函式提供空值。 - 假設
checkCallingPermission()
適用於所有情況,或者該方法會在實際傳回整數時擲回例外狀況。
偵錯功能
如果應用程式指定 Android 12 (API 級別 31) 以上版本,您可以啟用偵錯功能。在某些情況下,這項功能可協助您偵測應用程式是否以不安全的方式啟動意圖。
如果應用程式同時執行下列這兩項動作,系統會偵測到不安全的意圖啟動作業,StrictMode
違規情形也會隨之發生:
- 應用程式將巢狀意圖從已傳遞意圖的額外項目中拆解出來。
- 應用程式立即使用該巢狀意圖啟動某個應用程式元件,例如將意圖傳遞至
startActivity()
、startService()
或bindService()
。
資源
為您推薦
- 注意:系統會在 JavaScript 關閉時顯示連結文字
- 待處理意圖