Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

應用程序沙箱

Android平台利用基於Linux用戶的保護來識別和隔離應用程序資源。這樣可以將應用程序彼此隔離,並保護應用程序和系統免受惡意應用程序的攻擊。為此,Android為每個Android應用程序分配一個唯一的用戶ID(UID),並在其自己的進程中運行它。

Android使用UID設置內核級應用程序沙箱。內核通過標準Linux功能(例如分配給應用程序的用戶和組ID)在流程級別上加強應用程序與系統之間的安全性。默認情況下,應用程序不能彼此交互並且對操作系統的訪問權限有限。如果應用程序A嘗試執行惡意操作,例如讀取應用程序B的數據或未經許可撥打電話,則會阻止這樣做,因為它沒有適當的默認用戶權限。沙盒是簡單,可審核的,並且基於數十年的UNIX風格的用戶對進程和文件權限的分離。

由於應用程序沙箱位於內核中,因此此安全模型擴展到本機代碼和OS應用程序。內核之上的所有軟件,例如OS庫,應用程序框架,應用程序運行時以及所有應用程序,都在Application Sandbox中運行。在某些平台上,開發人員只能使用特定的開發框架,一組API或語言。在Android上,對編寫應用程序的方式沒有任何限制,以強制執行安全性。在這方面,本機代碼與解釋後的代碼一樣沙盒化。

保護裝置

通常,要在配置正確的設備中突破應用程序沙箱,必須破壞Linux內核的安全性。但是,與其他安全功能類似,實施應用程序沙箱的各個保護也不容侵犯,因此深度防禦對於防止單個漏洞導致操作系統或其他應用程序受到損害非常重要。

Android依靠多種保護措施來實施應用程序沙箱。隨著時間的推移,已經引入了這些強制措施,並大大增強了原始的基於UID的自由訪問控制(DAC)沙箱。先前的Android版本包括以下保護:

  • 在Android 5.0中,SELinux在系統和應用程序之間提供了強制訪問控制(MAC)分隔。但是,所有第三方應用程序都在同一SELinux上下文中運行,因此應用程序間隔離主要由UID DAC強制實施。
  • 在Android 6.0中,SELinux沙箱得到了擴展,可以跨每個物理用戶邊界隔離應用程序。此外,Android還為應用程序數據設置了更安全的默認設置:對於targetSdkVersion >= 24的應用程序,其主目錄上的默認DAC權限從751更改為700。這為私有應用程序數據提供了更安全的默認設置(儘管應用程序可能會覆蓋這些默認設置) 。
  • 在Android 8.0中,所有應用程序均設置為使用seccomp-bpf過濾器運行,該過濾器限制了允許使用的系統調用,從而加強了應用程序/內核邊界。
  • 在Android 9中,所有targetSdkVersion >= 28非特權應用都必須在單獨的SELinux沙箱中運行, targetSdkVersion >= 28應用提供MAC。這種保護可以改善應用程序的分離度,防止覆蓋默認安全設置,並且(最重要的是)可以防止應用程序訪問其數據世界。
  • 在Android 10中,應用程序對文件系統的原始視圖有限,無法直接訪問/ sdcard / DCIM之類的路徑。但是,應用程序保留對特定於程序包的路徑的完全原始訪問權限,這可以通過任何適用的方法(如Context.getExternalFilesDir())返回

共享文件準則

將應用程序數據設置為可全球訪問是一種不良的安全做法。授予所有人訪問權限,並且不可能僅將訪問權限限制為預期的收件人。這種做法已導致信息洩漏和混亂的代理漏洞,是針對具有敏感數據的應用程序(例如電子郵件客戶端)的惡意軟件的首選目標。在Android 9及更高版本中,對於targetSdkVersion>=28應用,明確禁止使用這種方式共享文件。

共享文件時,請遵循以下準則,而不是使應用程序數據可全球訪問:

  • 如果您的應用程序需要與其他應用程序共享文件,請使用內容提供商 。內容提供者以適當的粒度共享數據,並且沒有世界可訪問的UNIX權限的許多缺點(有關詳細信息,請參閱內容提供者基礎知識 )。
  • 如果您的應用程序具有真正應該可以被世界訪問的文件(例如照片),則它們必須是特定於媒體的(僅照片,視頻和音頻文件),並使用MediaStore類存儲。 (有關更多信息,請參見DAC上的預覽指南 。)

存儲運行時權限控制通過MediaStore對強類型集合的訪問。要訪問類型較弱的文件(例如PDF和MediaStore.Downloads類),應用程序必須使用ACTION_OPEN_DOCUMENT意圖之類的意圖。

要啟用Android 10行為,請使用requestLegacyExternalStorage清單屬性,並遵循App權限最佳做法

  • 清單標誌的默認值對於定位到Android 9(及更低版本)的應用為true
  • 對於以Android 10為目標的應用程序,默認值為false。要在以Android 10為目標的應用程序中暫時退出過濾後的存儲視圖,請將清單標誌的值設置為true
  • 使用受限權限,安裝程序將允許用於非沙盒存儲的應用列入白名單。未列入白名單的應用將被沙箱化。