Tapjacking

OWASP 類別:MASVS-PLATFORM:平台互動

總覽

Tapjacking 發生在 Android 應用程式中,是與 clickjacking 網路安全漏洞對等的攻擊模式,亦即惡意應用程式藉由重疊或其他方式對 UI 進行模糊處理,誘騙使用者點選與安全性相關的控制項 (確認按鈕等等)。在這個頁面中,我們會分別介紹兩種攻擊變化形式:完全遮蔽和部分遮蔽。在完全遮蔽的情況下,攻擊者會在觸控區域添加疊加層,而在部分遮蔽中,觸控區域仍會保持未遮蔽狀態。

影響

Tapjacking 攻擊用於誘騙使用者執行特定動作。這會造成什麼影響,則視攻擊者指定的動作而定。

風險:完全遮蔽

在完全遮蔽的情況下,攻擊者會在觸控區域添加疊加層,進而駭入觸控事件:

完整遮蔽圖片

因應措施

在程式碼中設定 View.setFilterTouchesWhenObscured(true) 可避免發生完全遮蔽情形。此設定會封鎖疊加層傳遞的觸控事件。如果您較喜歡採用宣告式方法,也可針對要保護的 View 物件在版面配置檔案中加入 android:filterTouchesWhenObscured="true"


風險:部分遮蔽

在部分遮蔽攻擊中,觸控區域仍會保持未遮蔽狀態:

部分遮蔽圖片

因應措施

手動忽略含有 FLAG_WINDOW_IS_PARTIALLY_OBSCURED 旗標的觸控事件,即可緩解部分遮蔽造成的影響。這種情況沒有預設防護機制。

潛在警告:這項因應措施可能會對沒問題的應用程式造成干擾。而在某些情況下,也可能會無法推出這項修正程式,因為如果部分遮蔽是由沒問題的應用程式引起,可能會對使用者體驗造成負面影響。


特定風險

本節列舉必須採用非標準因應策略或在特定 SDK 層級進行因應的風險,並提供相關完整資訊。

風險:android.Manifest.permission.SYSTEM_ALERT_WINDOW

SYSTEM_ALERT_WINDOW 權限可讓應用程式建立一個視窗,顯示在所有應用程式頂端。

因應措施

我們在較新版本的 Android 導入了幾項因應措施,包括:

  • 在 Android 6 (API 級別 23) 以上版本中,使用者必須明確授予應用程式建立疊加視窗的權限。
  • 在 Android 12 (API 級別 31) 以上版本中,應用程式可以將 true 傳遞至 Window.setHideOverlayWindows()

風險:自訂浮動式訊息

攻擊者可利用 Toast.setView() 自訂浮動式訊息的外觀。在 Android 10 (API 級別 29) 以下版本中,惡意應用程式可能會從背景啟動這類浮動式訊息。

因應措施

如果應用程式以 Android 11 (API 級別 30) 以上版本為目標,系統會封鎖背景自訂浮動式訊息。但在某些情況下,攻擊者可以透過「浮動式訊息爆發」的手段來規避這個因應措施,也就是在前景中將多個浮動式訊息排入佇列,這麼一來,即使應用程式會進入背景,這些浮動式訊息仍會保持啟動。

自 Android 12 (API 級別 31) 起,系統已可全面因應背景浮動式訊息和浮動式訊息爆發攻擊。


風險:活動三明治

如果惡意應用程式設法說服使用者開啟應用程式,還是可以從受害者的應用程式中啟動活動,然後將其與自身活動重疊,形成「活動三明治」並建立部分遮蔽攻擊。

因應措施

請參閱部分遮蔽的一般因應措施。為進行深入防護,請確保不要匯出不需匯出的活動,以免攻擊者將這些活動變成活動三明治。


資源