應用安全

應用要素

Android 為移動設備提供了一個開源平台和應用環境。核心操作系統基於Linux內核。 Android 應用程序通常使用 Java 編程語言編寫並在 Dalvik 虛擬機中運行。但是,應用程序也可以用本機代碼編寫。應用程序是從具有 .apk 文件擴展名的單個文件安裝的。

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

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

  • 活動活動通常是單個以用戶為中心的任務的代碼。它通常包括向用戶顯示 UI,但它不是必須的——某些活動從不顯示 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 提供出色的用戶體驗。讓用戶在安裝時查看權限可以讓用戶在感到不舒服時選擇不安裝應用程序。

此外,許多用戶界面研究表明,過度提示用戶會導致用戶開始對顯示的任何對話框說“OK”。 Android 的安全目標之一是有效地向用戶傳達重要的安全信息,而這無法通過訓練用戶忽略的對話框來完成。通過一次且僅在重要時呈現重要信息,用戶更有可能考慮他們同意什麼。

一些平台選擇根本不顯示任何有關應用程序功能的信息。這種方法使用戶無法輕鬆理解和討論應用程序功能。雖然並非所有用戶都可以始終做出完全明智的決定,但 Android 權限模型使廣泛的用戶可以輕鬆訪問有關應用程序的信息。例如,意外的權限請求可以促使更老練的用戶提出有關應用程序功能的關鍵問題,並在所有用戶都可以看到的地方(例如Google Play )上分享他們的擔憂。

應用程序安裝權限——谷歌地圖已安裝應用程序的權限——Gmail
應用程序安裝權限——谷歌地圖已安裝應用程序的權限——Gmail

圖 1.應用程序權限顯示

進程間通信

進程可以使用任何傳統的 UNIX 類型機制進行通信。示例包括文件系統、本地套接字或信號。但是,Linux 權限仍然適用。

Android 還提供了新的 IPC 機制:

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

  • 服務:服務(上面討論過)可以提供使用 binder 直接訪問的接口。

  • Intents :Intent 是一個簡單的消息對象,表示做某事的“意圖”。例如,如果您的應用程序想要顯示一個網頁,它通過創建一個 Intent 實例並將其交給系統來表達其查看 URL 的“意圖”。系統找到知道如何處理該 Intent 的其他代碼(在本例中為瀏覽器)並運行它。 Intent 還可用於在系統範圍內廣播有趣的事件(例如通知)。請參閱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 增加了對 SMS 使用的進一步控制。如果應用程序嘗試向使用高級服務的短代碼發送短信,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 的核心集中,例如運營商的私有 CA,可能需要這些 CA 來安全地訪問運營商基礎設施的組件,例如 SMS/MMS 網關。鼓勵設備製造商僅在需要信任這些 CA 的組件/應用程序中包含私有 CA。有關詳細信息,請參閱網絡安全配置

應用程序簽名

代碼簽名允許開發人員識別應用程序的作者並更新他們的應用程序,而無需創建複雜的接口和權限。在 Android 平台上運行的每個應用程序都必須由開發人員簽名。嘗試在未簽名的情況下安裝的應用程序會被 Google Play 或 Android 設備上的軟件包安裝程序拒絕。

在 Google Play 上,應用程序簽名連接了 Google 對開發人員的信任以及開發人員對其應用程序的信任。開發人員知道他們的應用程序是提供的,未對 Android 設備進行修改;開發人員可以對其應用程序的行為負責。

在 Android 上,應用程序簽名是將應用程序放入其應用程序沙箱的第一步。簽名的應用程序證書定義了哪個用戶 ID 與哪個應用程序相關聯;不同的應用程序在不同的用戶 ID 下運行。應用程序簽名確保一個應用程序不能訪問任何其他應用程序,除非通過明確定義的 IPC。

當應用程序(APK 文件)安裝到 Android 設備上時,包管理器會驗證 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 應用程序框架向應用程序公開,並通過 Dalvik VM 運行標準應用程序。

  • 本機代碼 DRM 管理器,實現 DRM 框架並為 DRM 插件(代理)公開接口,以處理各種 DRM 方案的權限管理和解密

Android平台數字版權管理架構

圖 3. Android 平台數字版權管理架構