意圖重新導向

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 關閉時顯示連結文字
  • 待處理意圖