Android 裝置的權限機制設計,是為了讓未事先宣告並取得權限的 App 程式無法做出任何可能傷害裝置的行為。但真的是如此嗎?
Android 權限機制的運作方式
在深入探討進一步細節之前,讓我們先來看看 Android 的權限機制如何運作。
Android 的 App 程式對系統資源的存取是受到管制的。要存取一些敏感的應用程式介面 (API),App 程式首先必須在 AndroidManiflest.XML 檔案當中宣告它所需要的權限。這些所謂敏感的 API 包括了相機功能、GPS 定位資訊、藍牙與電話功能、SMS/MMS 簡訊功能,以及網路/資料連線功能。
在安裝 Ap 程式時,程式安裝器 (App Installer) 會將這些程式宣告的權限顯示給使用者看,由使用者決定是否要接受並安裝該程式。
若使用者決定接受,那這些權限就永久授予給該程式,直到它解除安裝為止。執行時,系統不會再通知使用者這些程式正在使用一些敏感的 API。反之,若使用者決定不接受,那應用程式就無法安裝。
假使有某個 App 程式嘗試使用這些受保護的功能卻未事先宣告,系統在執行該應用程式時就會出現安全性錯誤,並終止應用程式。
在這樣的設計下,要避開權限機制似乎不太可能。但不幸的是,一些聰明的程式設計人員就是有辦法開發出一些能避開這些權限機制的 App 程式,方法就是濫用某些功能。
濫用預設瀏覽器來上傳資訊
在 Android 系統中,一個 App 程式可以呼叫另一個 App 程式的元件,然後透過一個名為「Intent」的抽象資料結構來描述其所要執行的作業。每一個 Intent 資料結構當中都包含了要執行的動作,以及執行該動作需要的資料。當一個 App 發出一個 Intent 時,行動裝置作業系統會選擇一個適合的應用程式來處理該資料。
例如,一個內含「Intent.ACTION_VIEW 」這個檢視動作的 Intent,再配上「Uri.parse(“https://www.google.com”)」這串資料,就代表該 App 程式希望檢視 Google 首頁。當此資料結構傳出來時,作業系統會決定該啟動哪個瀏覽器。
在這樣的設計之下,意圖不良的程式開發人員,就能在自己的 App 程式當中透過一個 Intent 資料結構來開啟一個瀏覽器並將竊取到的資料上傳至遠端的某個伺服器。譬如,惡意 App 程式想要將裝置的識別碼 (Device ID) 傳送至位於 https://example.com 的伺服器,其 Intent 內容將如下所示:
由於是透過瀏覽器來開啟這個網址,因此,惡意 App 程式自己根本不需宣告 android.permission.INTERNET 網際網路使用權限,因為瀏覽器已具備這個權限。