應用沙箱

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

Android 使用 UID 設置內核級應用程序沙箱。內核通過標準 Linux 設施(例如分配給應用程序的用戶和組 ID)在進程級別強制執行應用程序和系統之間的安全性。默認情況下,應用程序無法相互交互,並且對操作系統的訪問權限有限。如果應用程序 A 試圖做一些惡意的事情,例如讀取應用程序 B 的數據或未經許可撥打電話,它會被阻止這樣做,因為它沒有適當的默認用戶權限。沙箱簡單、可審計,並且基於幾十年前的 UNIX 風格的用戶進程和文件權限分離。

由於應用程序沙箱位於內核中,因此此安全模型擴展到本機代碼和操作系統應用程序。內核之上的所有軟件,例如操作系統庫、應用程序框架、應用程序運行時以及所有應用程序,都在應用程序沙箱中運行。在某些平台上,開發人員受限於特定的開發框架、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 沙箱中運行,並為每個應用提供 MAC。這種保護改進了應用程序分離,防止覆蓋安全默認值,並且(最重要的是)防止應用程序使其數據世界可訪問。
  • 在 Android 10 中,應用程序對文件系統的原始視圖有限,無法直接訪問 /sdcard/DCIM 等路徑。但是,應用程序保留對其特定於包的路徑的完全原始訪問權限,由任何適用的方法返回,例如Context.getExternalFilesDir()

共享文件的準則

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

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

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

Storage運行時權限通過MediaStore控制對強類型集合的訪問。為了訪問弱類型文件,例如 PDF 和MediaStore.Downloads類,應用程序必須使用類似ACTION_OPEN_DOCUMENT的意圖。

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

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