應用程式安全性

本頁面說明應用程式安全性的各個層面。

應用程式元素

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

Android 應用程式的主要建構區塊包括:

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

  • 活動:一般來說,活動是使用 Activity 類別的單一使用者導向工作代碼。活動通常會向使用者顯示 UI,但並非必要;有些活動從不顯示 UI。一般來說,應用程式的其中一個活動就是應用程式的進入點。

  • 服務:「服務」是指在背景執行的程式碼主體,以 Service 類別為基礎。它可以自行執行程序,也可以在其他應用程式的程序環境中執行。其他元件會繫結至服務,並透過遠端程序呼叫叫用服務的方法。媒體播放器就是服務的例子:即使使用者關閉媒體選取 UI,可能仍希望音樂繼續播放。即使 UI 已完成,服務仍會繼續播放音樂。

  • 廣播接收器:廣播接收器是 BroadcastReceiver 類別的物件。當作業系統或其他應用程式發出稱為意圖的 IPC 機制 (即 Intent 類別的例項) 時,系統就會例項化。舉例來說,應用程式可以為電量不足訊息註冊接收器,並根據該資訊變更行為。

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

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

這些限制會以各種形式實施。由於有意不提供敏感功能專用的 API,因此部分功能受到限制 (例如,沒有可直接操控 SIM 卡的 Android API)。在某些情況下,角色分離可提供安全措施,例如儲存空間的應用程式隔離。在其他情況下,敏感 API 適用於受信任的應用程式,並透過稱為「權限」的安全機制受到保護。

這些受保護的 API 包括:

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

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

授予權限後,只要應用程式仍安裝在裝置上,就會套用這些權限。為避免使用者混淆,系統不會再次通知使用者應用程式已取得的權限。此外,核心作業系統內建或 OEM 隨附的應用程式不會要求使用者授予權限。如果解除安裝應用程式,系統會移除權限,因此後續重新安裝時,系統會再次顯示權限。

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

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

系統預設權限說明請參閱「Manifest.permission」。應用程式可以宣告自己的權限,供其他應用程式使用。上述位置不會列出這類權限。

定義權限時,protectionLevel 屬性會告知系統如何告知使用者應用程式需要權限,或是誰得以擁有權限。如要瞭解如何建立及使用應用程式專用權限,請參閱「安全性檢查清單」。

部分裝置功能 (例如傳送簡訊廣播意圖) 不適用於第三方應用程式,但 OEM 預先安裝的應用程式可能會使用這些功能。這些權限會使用 signatureOrSystem 權限。

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

Android 致力於讓使用者清楚瞭解自己何時與第三方應用程式互動,並告知使用者這些應用程式的功能。安裝任何應用程式前,系統會向使用者顯示清楚的訊息,說明應用程式要求的不同權限。安裝完成後,系統不會再提示使用者確認任何權限。

在安裝前立即顯示權限的原因有很多。使用者會主動查看應用程式、開發人員和功能資訊,判斷是否符合需求和期望。此外,他們也必須尚未對應用程式產生心理或財務上的依賴,且能輕鬆比較應用程式與其他替代應用程式。

其他平台則採用不同方式通知使用者,會在每個工作階段開始時或應用程式使用期間要求權限。Android 的願景是讓使用者隨心所欲地在應用程式之間流暢切換。每次都要求確認會拖慢使用者的操作速度,並妨礙 Android 提供優質的使用者體驗。讓使用者在安裝時檢查權限,如果感到不自在,可以選擇不安裝應用程式。

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

部分平台選擇完全不顯示應用程式功能資訊。這種做法會導致使用者難以瞭解及討論應用程式功能。雖然無法確保所有使用者都能做出完全明智的決定,但 Android 權限模型可讓廣大使用者輕鬆取得應用程式資訊。舉例來說,如果應用程式要求非預期的權限,較有經驗的使用者可能會對應用程式功能提出重要問題,並在 Google Play 等平台分享疑慮,讓所有使用者都能看到。

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

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

處理序間通訊

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

Android 也提供新的 IPC 機制:

  • 繫結器:輕量型功能導向遠端程序呼叫機制,專為執行程序內和跨程序呼叫時的高效能而設計。Binder 是透過自訂 Linux 驅動程式實作。如需類別說明,請參閱「繫結器」。

  • 服務:服務可提供可使用繫結器直接存取的介面。如要瞭解詳情,請參閱「應用程式元素」。

  • 意圖:意圖是簡單的訊息物件,代表執行某項動作的意圖。舉例來說,如果應用程式想顯示網頁,可以建立意圖例項並交給系統,藉此表達查看網址的意圖。系統會找出其他知道如何處理該意圖的程式碼 (在本例中為瀏覽器),並執行該程式碼。意圖也可用於在全系統中廣播有趣的事件 (例如通知)。如需類別說明,請參閱「Intent」。

  • 內容供應器:內容供應器是資料儲存庫,可提供裝置上的資料存取權。經典範例是存取使用者聯絡人清單的內容供應器。應用程式可以存取其他應用程式透過內容供應器公開的資料,也可以定義自己的內容供應器,公開自己的資料。如需類別說明,請參閱「ContentProvider」。

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

易受成本影響的 API

凡是可能為使用者或網路產生費用的函式,都屬於費用敏感型 API。Android 平台已將成本敏感型 API 放入受 OS 控制的受保護 API 清單。使用者必須明確授權,第三方應用程式才能使用費用高昂的 API。這些 API 包含:

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

Android 4.2 進一步控管簡訊的使用方式。如果應用程式嘗試傳送簡訊至使用付費服務的短碼,Android 會發出通知,提醒您可能需要支付額外費用。使用者可以選擇允許或封鎖應用程式傳送訊息。

SIM 卡存取權

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

個人資訊

Android 已將提供使用者資料存取權的 API 納入受保護 API 集合。正常使用 Android 裝置時,使用者安裝的第三方應用程式也會累積使用者資料。選擇分享這項資訊的應用程式可以使用 Android 作業系統權限檢查,保護資料不外洩給第三方應用程式。

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

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

系統內容供應商可能會包含聯絡人和日曆等個人或個人識別資訊,因此我們已明確標示這些供應商的權限。這項細節資訊可清楚指出應用程式可能取得的資訊類型。安裝期間,第三方應用程式可能會要求存取這些資源的權限。如果授予權限,應用程式就能安裝,並在安裝後隨時存取要求的資料。

根據預設,凡是會收集個人資訊的應用程式,都只能存取該應用程式的資料。如果應用程式選擇透過 IPC 將資料提供給其他應用程式,授予存取權的應用程式可以對 IPC 機制套用作業系統強制執行的權限。

機密資料輸入裝置

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

如果應用程式想知道使用者的位置資訊,必須取得存取使用者位置資訊的權限。安裝完成後,安裝程式會提示使用者是否允許應用程式存取位置資訊。使用者隨時可以執行「設定」應用程式,然後依序前往「位置與安全性」,並取消選取「使用無線網路」和「啟用 GPS 衛星」,禁止任何應用程式存取位置資訊。這會停用使用者裝置上所有應用程式的位置資訊服務。

裝置中繼資料

Android 也會盡量限制存取本質上不屬於私密資訊,但可能間接揭露使用者特徵、偏好設定和裝置使用方式的資料。

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

憑證授權單位

Android 內含一組已安裝的系統憑證授權單位,這些授權單位在整個系統中都受到信任。在 Android 7.0 之前,裝置製造商可以修改裝置隨附的 CA 集。不過,搭載 Android 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 的核心組合,例如可能需要用來安全存取電信業者基礎架構元件 (如 SMS/MMS 閘道) 的電信業者私有 CA。建議裝置製造商只在需要信任這些私有 CA 的元件/應用程式中加入私有 CA。詳情請參閱「 網路安全性設定」。

應用程式簽署

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

在 Google Play 上,應用程式簽署可建立 Google 與開發人員之間的信任關係,以及開發人員與應用程式之間的信任關係。開發人員可確保應用程式以未經修改的形式提供給 Android 裝置,並對應用程式的行為負責。

在 Android 上,應用程式簽署是將應用程式放入應用程式沙箱的第一步。簽署的應用程式憑證會定義哪些使用者 ID 與哪些應用程式相關聯,不同的應用程式會在不同的使用者 ID 下執行。應用程式簽署可確保一個應用程式無法存取任何其他應用程式,除非透過定義完善的 IPC。

在 Android 裝置上安裝應用程式 (APK 檔案) 時,封裝管理員會驗證 APK 是否已使用該 APK 內含的憑證正確簽署。如果憑證 (更準確地說,是憑證中的公開金鑰) 與裝置上任何其他 APK 的簽署金鑰相符,新的 APK 就能在資訊清單中指定與其他以類似方式簽署的 APK 共用 UID。

應用程式可由第三方 (原始設備製造商、電信業者、替代市場) 簽署,或自行簽署。Android 提供程式碼簽署功能,開發人員可使用自行簽署的憑證,不必尋求外部協助或取得授權。應用程式不必由中央機構簽署。Android 目前不會對應用程式憑證執行 CA 驗證。

應用程式也能在簽章保護層級宣告安全性權限,限制只有以相同金鑰簽署的應用程式才能存取,同時維持不同的 UID 和應用程式沙箱。透過 共用 UID 功能,您可與共用應用程式沙箱建立更密切的關係。只要兩個以上的應用程式使用相同的開發人員金鑰簽署,即可在資訊清單中宣告共用 UID。

應用程式驗證

Android 4.2 以上版本支援應用程式驗證。使用者可以選擇啟用「驗證應用程式」,讓應用程式驗證器在安裝前評估應用程式。如果使用者嘗試安裝可能有害的應用程式,應用程式驗證功能會發出警示;如果應用程式特別惡意,系統會封鎖安裝程序。

數位版權管理

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

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

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

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

Android 平台上的數位著作權管理架構

圖 3. Android 平台上的 DRM 架構。