每個 Android 版本都包含數十項安全增強功能以保護用戶。 Android 10 包含多項安全和隱私增強功能。有關 Android 10 更改的完整列表,請參閱Android 10 發行說明。
安全
邊界消毒劑
Android 10 在藍牙和編解碼器中部署了 BoundsSanitizer (BoundSan) 。 BoundSan 使用 UBSan 的邊界消毒劑。此緩解在每個模塊級別啟用。它有助於確保 Android 的關鍵組件安全且不應被禁用。 BoundSan 在以下編解碼器中啟用:
-
libFLAC
-
libavcdec
-
libavcenc
-
libhevcdec
-
libmpeg2
-
libopus
-
libvpx
-
libspeexresampler
-
libvorbisidec
-
libaac
-
libxaac
只執行內存
默認情況下,AArch64 系統二進製文件的可執行代碼部分被標記為只執行(不可讀),作為針對即時代碼重用攻擊的強化緩解措施。將數據和代碼混合在一起的代碼以及有目的地檢查這些部分的代碼(沒有首先將內存段重新映射為可讀)不再起作用。如果應用程序嘗試讀取內存中啟用了僅執行內存 (XOM)的系統庫的代碼段,而沒有先將該段標記為可讀,則目標 SDK 為 Android 10(API 級別 29 或更高)的應用程序會受到影響。
擴展訪問
信任代理(Smart Lock 等三級身份驗證機制使用的底層機制)只能在 Android 10 中延長解鎖時間。信任代理無法再解鎖鎖定的設備,並且最多只能使設備保持解鎖狀態四個小時。
人臉認證
人臉身份驗證允許用戶通過查看設備正面來解鎖設備。 Android 10 增加了對新的人臉身份驗證堆棧的支持,該堆棧可以安全地處理相機幀,在支持的硬件上進行人臉身份驗證期間保護安全性和隱私。 Android 10 還為符合安全要求的實施提供了一種簡單的方法,可以為網上銀行或其他服務等交易啟用應用集成。
整數溢出清理
Android 10 在軟件編解碼器中啟用整數溢出清理 (IntSan) 。確保設備硬件不支持的任何編解碼器都可以接受播放性能。 IntSan 在以下編解碼器中啟用:
-
libFLAC
-
libavcdec
-
libavcenc
-
libhevcdec
-
libmpeg2
-
libopus
-
libvpx
-
libspeexresampler
-
libvorbisidec
模塊化系統組件
Android 10 對一些 Android 系統組件進行了模塊化,使它們能夠在正常的 Android 發布週期之外進行更新。一些模塊包括:
OEM加密
Android 10 使用 OEMCrypto API 版本 15。
飛毛腿
Scudo是一種動態用戶模式內存分配器,旨在更靈活地抵禦與堆相關的漏洞。它提供標準的 C 分配和釋放原語,以及 C++ 原語。
ShadowCallStack
ShadowCallStack (SCS)
是一種LLVM 檢測模式,通過將函數的返回地址保存到非葉函數的函數序言中單獨分配的ShadowCallStack
實例並從ShadowCallStack
實例加載返回地址來防止返回地址覆蓋(如堆棧緩衝區溢出)功能結語。
WPA3 和 Wi-Fi 增強開放
Android 10 增加了對Wi-Fi Protected Access 3 (WPA3) 和 Wi-Fi Enhanced Open 安全標準的支持,以提供更好的隱私性和對已知攻擊的穩健性。
隱私
面向 Android 9 或更低版本時的應用訪問
如果您的應用在 Android 10 或更高版本上運行,但面向 Android 9(API 級別 28)或更低版本,則平台會應用以下行為:
- 如果您的應用為
ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
聲明了<uses-permission>
元素,系統會在安裝過程中自動為ACCESS_BACKGROUND_LOCATION
添加<uses-permission>
元素。 - 如果您的應用請求
ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
,系統會自動將ACCESS_BACKGROUND_LOCATION
添加到請求中。
後台活動限制
從 Android 10 開始,系統對從後台啟動 Activity 施加了限制。這種行為改變有助於最大限度地減少對用戶的干擾,並使用戶更好地控制屏幕上顯示的內容。只要您的應用程序作為用戶交互的直接結果啟動活動,您的應用程序很可能不受這些限制的影響。
要了解有關從後台啟動活動的推薦替代方案的更多信息,請參閱有關如何在您的應用程序中提醒用戶時間敏感事件的指南。
相機元數據
Android 10 更改了getCameraCharacteristics()
方法默認返回的信息範圍。特別是,您的應用必須具有CAMERA
權限才能訪問包含在此方法的返回值中的可能特定於設備的元數據。
要了解有關這些更改的更多信息,請參閱有關需要權限的相機字段的部分。
剪貼板數據
除非您的應用是默認輸入法編輯器 (IME)或當前具有焦點的應用,否則您的應用無法在 Android 10 或更高版本上訪問剪貼板數據。
設備位置
為了支持用戶對應用訪問位置信息的額外控制,Android 10 引入了ACCESS_BACKGROUND_LOCATION
權限。
與ACCESS_FINE_LOCATION
和ACCESS_COARSE_LOCATION
權限不同, ACCESS_BACKGROUND_LOCATION
權限僅影響應用在後台運行時對位置的訪問。除非滿足以下條件之一,否則應用程序被視為在後台訪問位置:
- 屬於該應用程序的活動是可見的。
- 該應用程序正在運行已聲明前台服務類型的前台服務
location
。
要為應用中的服務聲明前台服務類型,請將應用的targetSdkVersion
或compileSdkVersion
為29
或更高。詳細了解前台服務如何繼續用戶發起的需要訪問位置的操作。
外置儲存
默認情況下,面向 Android 10 及更高版本的應用被授予對外部存儲或範圍存儲的範圍訪問權限。此類應用程序可以在外部存儲設備中查看以下類型的文件,而無需請求任何與存儲相關的用戶權限:
- 應用程序特定目錄中的文件,使用
getExternalFilesDir()
訪問。 - 應用程序從媒體商店創建的照片、視頻和音頻剪輯。
要了解有關範圍存儲以及如何共享、訪問和修改保存在外部存儲設備上的文件的更多信息,請參閱有關如何管理外部存儲中的文件以及訪問和修改媒體文件的指南。
MAC地址隨機化
在運行 Android 10 或更高版本的設備上,系統默認傳輸隨機 MAC 地址。
如果您的應用程序處理企業用例,該平台為與 MAC 地址相關的多個操作提供 API:
- 獲取隨機 MAC 地址:設備所有者應用程序和配置文件所有者應用程序可以通過調用
getRandomizedMacAddress()
檢索分配給特定網絡的隨機 MAC 地址。 - 獲取實際的出廠 MAC 地址:設備所有者應用程序可以通過調用
getWifiMacAddress()
來檢索設備的實際硬件 MAC 地址。此方法對於跟踪設備隊列很有用。
不可重置的設備標識符
從 Android 10 開始,應用必須具有READ_PRIVILEGED_PHONE_STATE
特權權限才能訪問設備的不可重置標識符,其中包括 IMEI 和序列號。
-
Build
-
TelephonyManager
如果您的應用沒有權限並且您嘗試詢問有關不可重置標識符的信息,平台的響應會因目標 SDK 版本而異:
- 如果您的應用面向 Android 10 或更高版本,則會發生
SecurityException
。 - 如果您的應用面向 Android 9(API 級別 28)或更低版本,並且該應用具有
READ_PHONE_STATE
權限,則該方法會返回null
或占位符數據。否則,會發生SecurityException
。
身體活動識別
Android 10 引入了android.permission.ACTIVITY_RECOGNITION
運行時權限,適用於需要檢測用戶步數或對用戶的身體活動(例如步行、騎自行車或在車輛中移動)進行分類的應用。這旨在讓用戶了解設備傳感器數據在“設置”中的使用方式。
Google Play 服務中的某些庫(例如Activity Recognition API和Google Fit API )不會提供結果,除非用戶授予您的應用此權限。
設備上唯一需要您聲明此權限的內置傳感器是計步器和計步器傳感器。
如果您的應用面向 Android 9(API 級別 28)或更低版本,如果您的應用滿足以下每個條件,系統會根據需要自動向您的應用授予android.permission.ACTIVITY_RECOGNITION
權限:
- 清單文件包含
com.google.android.gms.permission.ACTIVITY_RECOGNITION
權限。 - 清單文件不包含
android.permission.ACTIVITY_RECOGNITION
權限。
如果 system-auto 授予android.permission.ACTIVITY_RECOGNITION
權限,則在您將應用更新為面向 Android 10 後,您的應用會保留該權限。但是,用戶可以隨時在系統設置中撤銷此權限。
/proc/net 文件系統限制
在運行 Android 10 或更高版本的設備上,應用無法訪問/proc/net
,其中包含有關設備網絡狀態的信息。需要訪問此信息的應用程序(例如 VPN)應使用NetworkStatsManager
或ConnectivityManager
類。
從 UI 中刪除的權限組
從 Android 10 開始,應用無法查看權限在 UI 中的分組方式。
刪除聯繫人親和性
從 Android 10 開始,該平台不再跟踪聯繫人關聯信息。因此,如果您的應用程序對用戶的聯繫人進行搜索,則結果不會按交互頻率排序。
關於ContactsProvider
的指南包含一個通知,描述了從 Android 10 開始的所有設備上已過時的特定字段和方法。
限制對屏幕內容的訪問
為了保護用戶的屏幕內容,Android 10 通過更改READ_FRAME_BUFFER
、 CAPTURE_VIDEO_OUTPUT
和CAPTURE_SECURE_VIDEO_OUTPUT
權限的範圍來防止對設備屏幕內容的靜默訪問。從 Android 10 開始,這些權限僅限簽名訪問。
需要訪問設備屏幕內容的應用程序應使用MediaProjection
API,該 API 會顯示要求用戶提供同意的提示。
USB 設備序列號
如果您的應用面向 Android 10 或更高版本,則在用戶授予您的應用訪問 USB 設備或配件的權限之前,您的應用無法讀取序列號。
要了解有關使用 USB 設備的更多信息,請參閱有關如何配置 USB 主機的指南。
無線上網
面向 Android 10 或更高版本的應用無法啟用或禁用 Wi-Fi。 WifiManager.setWifiEnabled()
方法總是返回false
。
如果您需要提示用戶啟用和禁用 Wi-Fi,請使用設置面板。
限制直接訪問已配置的 Wi-Fi 網絡
為了保護用戶隱私,手動配置 Wi-Fi 網絡列表僅限於系統應用和設備策略控制器 (DPC) 。給定的 DPC 可以是設備所有者或配置文件所有者。
如果您的應用面向 Android 10 或更高版本,並且它不是系統應用或 DPC,則以下方法不會返回有用的數據:
-
getConfiguredNetworks()
方法總是返回一個空列表。 - 每個返回整數值的網絡操作方法——addNetwork(
addNetwork()
和updateNetwork()
——總是返回 -1。 - 每個返回布爾值的網絡操作
removeNetwork()
、reassociate()
、enableNetwork()
、disableNetwork()
、reconnect()
和disconnect()
—— 總是返回false
。