應用程式安全性

應用程式元素

Android 為行動裝置提供開放原始碼平台和應用程式環境。核心作業系統以 Linux 核心為基礎。Android 應用程式通常是以 Java 程式設計語言編寫,並在 Android 執行階段 (ART) 虛擬機器中執行。不過,應用程式也可以使用原生程式碼編寫。應用程式會透過單一副檔名為 APK 的檔案進行安裝。

主要的 Android 應用程式建構區塊如下:

  • AndroidManifest.xml AndroidManifest.xml 檔案是控制檔案,可告知系統如何處理應用程式中的所有頂層元件 (具體來說是活動、服務、廣播接收器和內容提供者,請參閱下文)。這也會指定需要哪些權限。

  • 活動活動通常是使用 Activity 類別的單一以使用者為重點的任務程式碼。活動通常會向使用者顯示 UI,但不一定會這樣做;有些活動從不顯示 UI。一般來說,應用程式的其中一個活動是應用程式的進入點。

  • 服務服務是指在背景執行的程式碼主體。可在其自身的處理程序中執行,或在其他應用程式程序的內容中執行。其他元件會「繫結」至服務,並透過遠端程序呼叫方式叫用服務中的各項方法。服務的範例是媒體播放器:即使使用者關閉媒體選取 UI,仍可能會繼續播放音樂。即使 UI 已完成,服務仍會繼續播放音樂。

  • 廣播接收器 BroadcastReceiver 是一種物件,會在作業系統或其他應用程式發出稱為「Intent」的 IPC 機制時,以例項化方式建立。舉例來說,應用程式可以為電池電量不足訊息註冊接收器,並根據該資訊變更行為。

Android 權限模型:存取受保護的 API

Android 上的所有應用程式都是在應用程式沙箱中執行。根據預設,Android 應用程式只能存取有限範圍的系統資源。系統會管理 Android 應用程式對資源的存取權,如果應用程式遭到濫用或遭到惡意使用,可能會對使用者體驗、網路或裝置上的資料造成負面影響。

這些限制以多種不同形式實施。部分功能受到限制,因為我們刻意未為敏感功能提供 API (例如,沒有可直接操控 SIM 卡的 Android API)。在某些情況下,角色分離可提供安全措施,就像為每個應用程式隔離儲存空間一樣。在其他情況下,敏感 API 是供信任的應用程式使用,並透過稱為權限的安全機制受到保護。

這些受保護的 API 包括:

  • 相機功能
  • 位置資料 (GPS)
  • 藍牙功能
  • 電話功能
  • 簡訊/多媒體訊息功能
  • 網路/數據連線

這些資源只能透過作業系統存取。如要在裝置上使用受保護的 API,應用程式必須在資訊清單中定義所需的功能。所有 Android 6.0 以上版本都會使用執行階段權限模式。如果使用者要求使用需要受保護 API 的應用程式功能,系統會顯示對話方塊,提示使用者拒絕允許權限。

授予權限後,只要應用程式已安裝,權限就會套用至應用程式。為避免使用者感到困惑,系統不會再次通知使用者應用程式已授予的權限,而核心作業系統中內建或由 OEM 綁定的應用程式也不會向使用者要求權限。應用程式解除安裝後,系統會移除權限,因此之後重新安裝時,系統會再次顯示權限。

使用者可以在裝置設定中查看先前安裝的應用程式權限。使用者也可以選擇關閉部分全局功能,例如 GPS、無線電或 Wi-Fi。

如果應用程式嘗試使用未在應用程式資訊清單中宣告的受保護功能,權限失敗通常會導致安全性例外狀況傳回應用程式。為了防止規避,系統會在盡可能低的層級強制執行受保護的 API 權限檢查。圖 2 顯示在安裝應用程式時,要求存取受保護 API 的使用者訊息示例。

系統預設權限的說明請參閱 https://developer.android.com/reference/android/Manifest.permission.html。應用程式可以宣告自己的權限,供其他應用程式使用。上述權限並未列於上述位置。

定義權限時,protectionLevel 屬性會告知系統如何向使用者告知應用程式需要權限,或誰可以擁有該項權限。如要進一步瞭解如何建立及使用應用程式特定權限,請參閱 https://developer.android.com/guide/topics/security/security.html

有些裝置功能 (例如傳送 SMS 廣播意圖的功能) 不適用於第三方應用程式,但可能會由原始設備製造商預先安裝的應用程式使用。這些權限會使用 signatureOrSystem 權限。

使用者如何瞭解第三方應用程式

Android 會盡力向使用者清楚說明他們與第三方應用程式互動時的情況,並告知使用者這些應用程式具備哪些功能。在安裝任何應用程式之前,使用者會看到清楚的訊息,說明應用程式要求的不同權限。安裝完成後,系統不會再提示使用者確認任何權限。

在安裝前立即顯示權限有許多原因。這時使用者會主動查看應用程式、開發人員和功能的相關資訊,判斷這些資訊是否符合使用者的需求和期望。另外,他們還沒有對應用程式建立心理或財務承諾,因此可以輕鬆將應用程式與其他替代應用程式進行比較。

其他平台則採用不同的使用者通知方式,在每個工作階段開始時或應用程式使用期間要求權限。Android 的願景是讓使用者隨時隨地流暢切換應用程式。每次都提供確認訊息會讓使用者操作速度變慢,並妨礙 Android 提供良好的使用者體驗。使用者在安裝時查看權限,可在感到不舒服時選擇不安裝應用程式。

此外,許多使用者介面研究顯示,過度提示使用者會導致使用者開始對任何顯示的對話方塊說「確定」。Android 的安全性目標之一,就是有效地向使用者傳達重要安全性資訊,而使用者會習慣性地忽略對話方塊,因此無法透過對話方塊傳達資訊。只在重要時刻顯示一次重要資訊,使用者就更有可能思考自己同意的內容。

部分平台選擇完全不顯示任何應用程式功能相關資訊。這種做法會讓使用者無法輕鬆瞭解及討論應用程式功能。雖然並非所有使用者都能隨時做出明智的決定,但 Android 權限模型可讓各種使用者輕鬆存取應用程式相關資訊。舉例來說,如果出現非預期的權限要求,可能會促使較有經驗的使用者在 Google Play 等所有使用者都能看到的地方,提出關於應用程式功能的重要問題,並分享他們的疑慮。

應用程式安裝時的權限 — Google 翻譯 已安裝應用程式的權限 - Gmail
應用程式安裝時的權限 -- Google 翻譯 已安裝應用程式的權限 - Gmail

圖 1. 顯示應用程式的權限

處理序間通訊

程序可以使用任何傳統 UNIX 類型機制進行通訊。例如檔案系統、本機通訊端口或信號。不過,Linux 權限仍會套用。

Android 也提供新的 IPC 機制:

  • 繫結器:輕量型能力型遠端程序呼叫機制,專為在執行程序內和跨程序呼叫時提供高效能。Binder 是使用自訂 Linux 驅動程式實作。請參閱 https://developer.android.com/reference/android/os/Binder.html

  • 服務:服務 (如上所述) 可提供可直接使用 Binder 存取的介面。

  • 意圖:意圖是簡單的訊息物件,代表執行某項操作的「意圖」。舉例來說,如果應用程式要顯示網頁,就會透過建立意圖例項並將其交給系統,表達其「意圖」來查看網址。系統會找出其他程式碼 (在本例中為瀏覽器),瞭解如何處理該意圖,並執行該意圖。意圖也可用於在系統中廣播有趣的事件 (例如通知)。請參閱 https://developer.android.com/reference/android/content/Intent.html

  • ContentProviders:ContentProvider 是資料倉庫,可提供裝置上資料的存取權;典型範例是 ContentProvider,可用於存取使用者的聯絡人清單。應用程式可以存取其他應用程式透過 ContentProvider 公開的資料,應用程式也可以定義自己的 ContentProviders 來公開自己的資料。請參閱 https://developer.android.com/reference/android/content/ContentProvider.html

雖然可以使用其他機制 (例如網路通訊端或可寫入的檔案) 實作 IPC,但建議使用這些 Android IPC 架構。我們鼓勵 Android 開發人員採用最佳做法,保護使用者資料,並避免引入安全漏洞。

易受成本影響的 API

成本敏感 API 是指任何可能為使用者或網路產生成本的函式。Android 平台已將成本敏感 API 納入由作業系統控管的受保護 API 清單。使用者必須向要求使用成本敏感 API 的第三方應用程式明確授權。這些 API 包括:

  • 電話通訊系統
  • 簡訊/多媒體訊息
  • 網路/資料
  • 應用程式內結帳
  • NFC 存取權

Android 4.2 進一步強化了簡訊使用權限的控管機制。如果應用程式嘗試傳送簡訊至使用付費服務的簡碼,可能會產生額外費用,Android 會提供通知。使用者可以選擇是否允許應用程式傳送訊息,或將訊息封鎖。

存取 SIM 卡

第三方應用程式無法存取 SIM 卡的低層級存取權。作業系統會處理與 SIM 卡的所有通訊,包括存取 SIM 卡記憶體中的個人資訊 (聯絡人)。應用程式也無法存取 AT 指令,因為這些指令是由無線電介面層 (RIL) 專屬管理。RIL 並未為這些指令提供高層級 API。

個人資訊

Android 已將提供使用者資料存取權的 API 放入受保護的 API 組合中。在正常使用情況下,Android 裝置也會在使用者安裝的第三方應用程式中累積使用者資料。選擇分享這類資訊的應用程式可以使用 Android OS 權限檢查功能,保護資料免受第三方應用程式侵擾。

僅能透過受保護的 API 存取機密使用者資料

圖 2. 只有透過受保護的 API 才能存取敏感的使用者資料

系統內容供應者可能會包含聯絡人和日曆等個人或個人識別資訊,因此我們已為這些供應者建立明確的權限。這種精細度可讓使用者清楚瞭解可能提供給應用程式的資訊類型。在安裝期間,第三方應用程式可能會要求存取這些資源的權限。如果授予權限,應用程式就能安裝,並在安裝後隨時存取要求的資料。

根據預設,任何收集個人資訊的應用程式都會將資料限制在特定應用程式內。如果應用程式選擇透過 IPC 將資料提供給其他應用程式,授予存取權的應用程式可將權限套用至由作業系統強制執行的 IPC 機制。

機密資料輸入裝置

Android 裝置經常提供敏感資料輸入裝置,讓應用程式可與周遭環境互動,例如相機、麥克風或 GPS。第三方應用程式必須先透過 Android OS 權限,由使用者明確提供存取權,才能存取這些裝置。安裝時,安裝程式會提示使用者依名稱要求感應器權限。

如果應用程式想要知道使用者的位置資訊,就必須取得存取使用者位置資訊的權限。安裝時,安裝程式會提示使用者,詢問應用程式是否可以存取使用者的位置資訊。如果使用者不希望任何應用程式存取其位置資訊,隨時可以執行「設定」應用程式,前往「位置與安全性」,然後取消勾選「使用無線網路」和「啟用 GPS 衛星」。這麼做會為使用者裝置上的所有應用程式停用位置資訊服務。

裝置中繼資料

Android 也會盡力限制對資料的存取權,即使這些資料本身並非機密資料,但可能間接揭露使用者特徵、使用者偏好設定,以及使用者使用裝置的方式。

根據預設,應用程式無法存取作業系統記錄、瀏覽器記錄、電話號碼或硬體 / 網路 ID 資訊。如果應用程式在安裝時要求存取這類資訊,安裝程式會提示使用者,詢問應用程式是否可以存取這類資訊。如果使用者未授予存取權,應用程式就不會安裝。

憑證授權單位

Android 包含一組已安裝的系統憑證授權單位,這些單位受到系統層級的信任。在 Android 7.0 之前,裝置製造商可以修改裝置上提供的 CA 組合。不過,搭載 7.0 以上版本的裝置將會採用一套統一的系統 CA,因為裝置製造商已無法再修改這些 CA。

如要將 CA 新增為 Android 原生套裝的公開 CA,必須完成 Mozilla CA 納入程序,然後針對 Android 提出功能要求 ( https://code.google.com/p/android/issues/entry),將 CA 新增至 Android 開放原始碼計畫 (AOSP) 中的原生 Android CA 套裝。

仍有裝置專屬的 CA,不應納入 AOSP CA 核心組合,例如電信業者的私人 CA,可能需要安全存取電信業者基礎架構的元件,例如 SMS/MMS 閘道。建議裝置製造商只在需要信任這些 CA 的元件/應用程式中納入私密 CA。詳情請參閱「 網路安全性設定」。

應用程式簽署

程式碼簽署可讓開發人員識別應用程式的作者,並更新應用程式,而無需建立複雜的介面和權限。在 Android 平台上執行的每個應用程式都必須由開發人員簽署。如果應用程式嘗試在未簽署的情況下安裝,Google Play 或 Android 裝置上的套件安裝程式會拒絕安裝。

在 Google Play 上,應用程式簽署功能可連結 Google 與開發人員之間的信任關係,以及開發人員對應用程式的信任關係。開發人員知道自己的應用程式會以未經修改的形式提供給 Android 裝置,因此可以對應用程式的行為負責。

在 Android 上,應用程式簽署是將應用程式放入應用程式沙箱的第一步。已簽署的應用程式憑證會定義哪個使用者 ID 與哪個應用程式相關聯;不同的應用程式會在不同的使用者 ID 下執行。應用程式簽署可確保應用程式只能透過明確定義的 IPC 存取其他應用程式。

當應用程式 (APK 檔案) 安裝到 Android 裝置上時,套件管理工具會驗證 APK 是否已使用 APK 中包含的憑證正確簽署。如果憑證 (或更準確地說,憑證中的公開金鑰) 與用於簽署裝置上任何其他 APK 的金鑰相符,新 APK 可在資訊清單中指定它會與其他同樣簽署的 APK 共用 UID。

應用程式可以由第三方 (原始設備製造商、電信業者、其他市場) 或自行簽署。Android 提供使用自行簽署憑證的程式碼簽署功能,開發人員可以自行產生憑證,無須外部協助或許可。應用程式不必由中央單位簽署。Android 目前不會為應用程式憑證執行 CA 驗證。

應用程式也可以在「簽章」保護層級宣告安全性權限,只允許使用相同金鑰簽署的應用程式存取,同時保留不同的 UID 和應用程式沙箱。透過 共用 UID 功能,可與共用應用程式沙箱建立更緊密的關係,其中兩個或更多使用相同開發人員金鑰簽署的應用程式,可在其資訊清單中宣告共用 UID。

應用程式驗證

Android 4.2 以上版本支援應用程式驗證。使用者可以選擇啟用「驗證應用程式」功能,並在安裝應用程式前由應用程式驗證工具進行評估。如果使用者嘗試安裝可能有害的應用程式,應用程式驗證功能就會發出警示;如果應用程式特別有害,驗證功能甚至會封鎖安裝作業。

數位版權管理

Android 平台提供可擴充的數位版權管理 (DRM) 架構,讓應用程式可根據與內容相關聯的授權限制,管理受版權保護的內容。DRM 架構支援許多 DRM 方案,裝置支援哪些 DRM 方案則由裝置製造商決定。

Android DRM 架構已在兩個架構層中實作 (請參閱下圖):

  • DRM 架構 API,會透過 Android 應用程式架構公開給應用程式,並透過 ART VM 執行標準應用程式。

  • 原生程式碼 DRM 管理員,可實作 DRM 架構,並公開 DRM 外掛程式 (代理程式) 的介面,以便處理各種 DRM 配置的權利管理和解密作業

Android 平台的數位版權管理架構

圖 3. Android 平台上的 DRM 架構