應用程式安全

應用要素

Android為行動裝置提供了一個開源平台和應用程式環境。核心作業系統基於Linux核心。 Android 應用程式通常使用 Java 程式語言編寫並在 Android 運行時 (ART) 虛擬機器中運行。然而,應用程式也可以用本機程式碼編寫。應用程式是從檔案副檔名為 .apk 的單一檔案安裝的。

主要的 Android 應用程式構建塊是:

  • AndroidManifest.xmlAndroidManifest.xml文件是控製文件,它告訴系統如何處理應用程式中的所有頂級元件(特別是下面描述的活動、服務、廣播接收器和內容提供者)。這也指定了需要哪些權限。

  • 活動活動通常是單一以使用者為中心的任務的代碼。它通常包括向用戶顯示 UI,但並非必須如此——某些 Activity 從不顯示 UI。通常,應用程式的活動之一是應用程式的入口點。

  • 服務服務是在背景執行的代碼體。它可以在自己的進程中運行,也可以在另一個應用程式進程的上下文中運行。其他元件「綁定」到服務並透過遠端過程呼叫呼叫其上的方法。服務的一個範例是媒體播放器:即使用戶退出媒體選擇 UI,用戶可能仍然希望音樂繼續播放。即使 UI 已完成,服務也會讓音樂繼續播放。

  • 廣播接收器廣播接收器是當作業系統或其他應用程式發出稱為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 廣播意圖的功能)不可用於第三方應用程序,但可由 OEM 預先安裝的應用程式使用。這些權限使用signatureOrSystem 權限。

用戶如何理解第三方應用

Android 努力讓用戶清楚了解何時與第三方應用程式交互,並告知用戶這些應用程式具有的功能。在安裝任何應用程式之前,都會向使用者顯示一條有關應用程式要求的不同權限的明確訊息。安裝後,不會再次提示使用者確認任何權限。

在安裝之前立即顯示權限的原因有很多。此時用戶正在積極查看有關應用程式、開發人員和功能的信息,以確定它是否符合他們的需求和期望。同樣重要的是,他們尚未對應用程式做出精神或財務承諾,並且可以輕鬆地將應用程式與其他替代應用程式進行比較。

其他一些平台使用不同的方法來通知用戶,在每個會話開始時或在使用應用程式時請求許可。 Android的願景是讓用戶在應用程式之間隨意無縫切換。每次提供確認都會減慢用戶速度並阻止 Android 提供出色的用戶體驗。讓使用者在安裝時查看權限,讓使用者可以選擇在感覺不舒服時不安裝應用程式。

此外,許多使用者介面研究表明,過度提示使用者會導致使用者開始對顯示的任何對話方塊說「確定」。 Android 的安全目標之一是有效地向使用者傳達重要的安全訊息,而使用使用者被訓練忽略的對話框無法實現這一目標。透過僅在重要時呈現一次重要訊息,使用者更有可能考慮他們同意的內容。

某些平台選擇根本不顯示有關應用程式功能的任何資訊。這種方法使用戶無法輕鬆理解和討論應用程式功能。雖然不可能讓所有用戶始終做出完全知情的決策,但 Android 權限模型使廣大用戶可以輕鬆存取有關應用程式的資訊。例如,意外的權限請求可能會促使更複雜的用戶提出有關應用程式功能的關鍵問題,並在Google Play等所有用戶都可見的地方分享他們的擔憂。

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

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

進程間通訊

進程可以使用任何傳統的 UNIX 類型機制進行通訊。例如檔案系統、本機套接字或訊號。但是,Linux 權限仍然適用。

Android也提供了新的IPC機制:

  • Binder :一種輕量級的基於能力的遠端過程呼叫機制,專為執行進程內和跨進程呼叫時的高效能而設計。 Binder 是使用自訂 Linux 驅動程式實現的。請參閱https://developer.android.com/reference/android/os/Binder.html

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

  • 意圖:意圖是一個簡單的訊息對象,表示做某事的「意圖」。例如,如果您的應用程式想要顯示一個網頁,它會透過建立 Intent 實例並將其傳遞給系統來表達其檢視 URL 的「意圖」。系統會找到知道如何處理該 Intent 的其他程式碼段(在本例中為瀏覽器)並執行它。意圖也可以用於在系統範圍內廣播有趣的事件(例如通知)。請參閱https://developer.android.com/reference/android/content/Intent.html

  • ContentProviders :ContentProvider 是一個資料倉庫,提供對設備上資料的存取;典型的範例是用於存取使用者的聯絡人清單的 ContentProvider。應用程式可以存取其他應用程式透過 ContentProvider 公開的數據,並且應用程式還可以定義自己的 ContentProvider 來公開自己的數據。請參閱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 作業系統權限檢查來保護資料免受第三方應用程式的侵害。

只能透過受保護的 API 存取敏感用戶數據

圖 2.只能透過受保護的 API 存取敏感用戶數據

可能包含個人或個人識別資訊(例如聯絡人和行事曆)的系統內容提供者已建立並具有明確識別的權限。這種粒度為使用者提供了可以提供給應用程式的資訊類型的清晰指示。在安裝過程中,第三方應用程式可能會要求存取這些資源的權限。如果獲得許可,則可以安裝該應用程序,並且在安裝時可以隨時存取所要求的資料。

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

敏感資料輸入設備

Android 設備經常提供敏感資料輸入設備,允許應用程式與周圍環境交互,例如攝影機、麥克風或 GPS。對於要存取這些裝置的第三方應用程序,必須先由使用者透過使用 Android 作業系統權限明確提供存取權限。安裝後,安裝程式將提示使用者按名稱請求感測器權限。

如果應用程式想要知道使用者的位置,則應用程式需要存取使用者位置的權限。安裝後,安裝程式將提示使用者詢問應用程式是否可以存取使用者的位置。在任何時候,如果用戶不希望任何應用程式訪問其位置,則用戶可以運行“設定”應用程序,轉到“位置和安全性”,然後取消選中“使用無線網路”和“啟用 GPS 衛星” 。這將禁用用戶設備上所有應用程式的基於位置的服務。

裝置元數據

Android 還努力限制對本質上不敏感但可能間接洩露用戶特徵、用戶偏好以及他們使用設備的方式的資料的存取。

預設情況下,應用程式無權存取作業系統日誌、瀏覽器歷史記錄、電話號碼或硬體/網路識別資訊。如果應用程式在安裝時要求存取此訊息,安裝程式將提示使用者詢問該應用程式是否可以存取該資訊。如果使用者不授予存取權限,則不會安裝該應用程式。

證書頒發機構

Android 包含一組已安裝的系統憑證授權機構,它們在系統範圍內受信任。在 Android 7.0 之前,裝置製造商可以修改其裝置上隨附的 CA 集。但是,運行 7.0 及更高版本的設備將具有一組統一的系統 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。

當應用程式(APK 檔案)安裝到 Android 裝置上時,套件管理員會驗證 APK 是否已使用該 APK 中包含的憑證正確簽署。如果憑證(或更準確地說,憑證中的公鑰)與用於簽署裝置上任何其他 APK 的金鑰匹配,則新 APK 可以選擇在清單中指定它將與其他 APK 共用 UID,類似地-簽名的APK。

應用程式可以由第三方(OEM、運營商、替代市場)簽署或自簽署。 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平台數位版權管理架構