Android 平台利用 Linux 使用者保護措施, 識別及隔離應用程式資源這麼做可將各個應用程式隔離,並保護應用程式和系統免於惡意應用程式的攻擊。為此,Android 會為每個 Android 應用程式指派不重複的使用者 ID (UID),並在其專屬程序中執行。
Android 會使用 UID 設定核心層級的應用程式沙箱。 核心會在程序層級強制執行應用程式和系統之間的安全性 透過標準 Linux 功能 (例如獲派的使用者 ID 和群組 ID) 應用程式根據預設,應用程式無法與其他應用程式互動,並且會受到限制 可以存取 OS如果應用程式 A 試圖進行惡意行為,例如讀取 應用程式 B 的資料或未經許可就撥打電話 因為該應用程式沒有適當的預設使用者權限。 沙箱功能簡單、可稽核,並以數十年歷史的 UNIX 使用者為基礎 程序和檔案權限區隔。
由於應用程式沙箱位於核心中,因此這種安全性模型 因此,適用於原生程式碼和 OS 應用程式核心以上的所有軟體 (例如 OS 程式庫、應用程式架構、應用程式執行階段和所有應用程式) 都會在應用程式沙箱中執行。在某些平台上,開發人員必須使用特定的開發架構、一組 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
。 - 使用受限制的權限,安裝程式會將應用程式加入許可清單 即可使用非沙箱機制的儲存空間未加入許可清單的應用程式 採用沙箱機制,