Mac開發(2)沙盒蘋果官方文檔

文章目錄

Mac開發(2)沙盒蘋果官方文檔

1. 關於蘋果權限文件Entitlements

授權賦予iOS或macOS應用特定的功能或安全權限。

設置權利值,以便啓用iCloud、推送通知、Apple Pay和應用沙箱。每個授權都有一個默認值,在大多數情況下,默認值會禁用與授權關聯的功能。在設置權限時,通過提供適當的鍵-值對來覆蓋默認值。

  • Cloud授權允許您爲您的iOS或macOS應用程序使用iCloud數據存儲。
    您可以在Xcode項目中逐個目標地設置iCloud權利值。

  • 即使你的iOS或macOS應用沒有執行,推送通知也可以讓你的應用提醒用戶。
    您可以將推送通知權限值設置爲配置開發和分發配置配置文件的一部分。

  • Apple Pay和PassKit授權允許使用Apple Pay進行應用內支付,並允許你的應用從PassKit庫中獲取通行證。

  • 應用沙箱授權可以讓你爲macOS應用啓用名爲沙箱的安全特性(在iOS中,所有應用都是自動沙箱的,所以這些沙箱授權不適用)。

如果惡意代碼成功地利用了您的應用程序,通過小心地只啓用您需要的資源訪問,您可以將潛在的破壞降到最低。您可以在Xcode項目中逐個目標地設置應用沙箱權限值。

您可以使用Xcode目標編輯器的Summary選項卡設置許多權利。其他權利需要編輯目標的權利屬性列表文件。最後,一些權限繼承自iOS配置配置文件,用於運行該應用程序。

要與授權鍵關聯的值的類型取決於該鍵。許多授權鍵採用布爾值。對於Xcode項目中屬性列表中定義的權利,布爾權利值爲或。一些授權鍵接受字符串或字符串數組作爲值。有關應用於各種授權密鑰的值的詳細信息,請參閱本文檔中的章節。

要使用授權密鑰,您必須對應用程序進行編碼簽名,因爲應用程序的授權是內置在其代碼簽名中的。

1.1 啓用iCloud在設備之間共享數據

Xcode的目標編輯器包含兩個字段,可以讓你爲應用啓用iCloud文檔和鍵值存儲。

1.2 啓用推送通知來提醒用戶

你可以通過蘋果的推送通知服務(APNs)向用戶發送推送通知,讓用戶知道你的應用有他們需要的信息。要在應用程序中接收此類通知,請在開發和分發配置文件中申請適當的權限。

1.3 啓用Apple Pay和通行證

你可以接受應用內支付的商品和服務。你也可以在錢包裏使用通行證。另外,當靠近NFC或其他射頻閱讀器工作時,Apple Pay界面可以被抑制,應用中還可以提供支付卡。

1.4 啓用應用沙箱,以儘量減少惡意代碼的損害

使用Xcode的目標編輯器爲macOS項目中的目標打開和配置App Sandbox。

注意:本章描述了特定於應用沙箱macOS實現的屬性列表鍵。它們在iOS中不可用。

在macOS Xcode項目中,通過在目標編輯器的Summary選項卡中啓用設置來配置細粒度的安全權限。這些設置依次將布爾值添加到目標的.entitlement屬性列表文件中的entitlement鍵。當您構建項目時,這些值將被合併到目標的代碼簽名中。

你可以把應用沙箱授權看作兩個步驟:

  1. 沙箱是一個目標,它刪除了與系統交互的大部分功能
  2. 根據需要,通過配置應用程序沙箱權限,將功能恢復到沙箱目標

在運行時,如果目標需要一個目標沒有授權的功能或系統資源,沙箱守護進程(sandboxd)會在控制檯記錄一條衝突消息。

更多關於應用沙盒的信息,請閱讀應用沙盒設計指南

1.5 如果需要,使用應用沙箱臨時異常

如果您無法在單一版本中將整個應用程序轉換到app Sandbox,您可以使用特殊的臨時異常權利。

1.5.1 應用沙箱臨時異常授權

注意:本章描述了特定於應用沙箱macOS實現的屬性列表鍵。它們在iOS中不可用。

臨時異常授權允許macOS應用執行某些操作,否則應用沙箱不允許。

如果你需要申請一個臨時的例外授權,使用蘋果的bug報告系統讓蘋果知道什麼是不適合你的。在開發macOS平臺時,蘋果會考慮功能需求。

注意:如果你申請臨時例外權利,請確保遵循App Store Connect網站提供的有關權利的指導。具體來說,在App Store Connect的App Sandbox授權使用信息部分確認授權和相應的問題編號,並解釋爲什麼你的應用需要這個異常。

要請求macOS Xcode項目中的目標的臨時異常授權,請使用Xcode屬性列表編輯器將其添加到目標的.entitlement屬性列表文件中。

爲任何臨時異常授權提供的值是一個字符串或一個或多個字符串的數組。更多關於在macOS中使用臨時異常的信息,請參考應用沙箱設計指南中的應用沙箱設計

1.5.2 蘋果事件臨時異常

當你採用應用沙箱,你的應用保留能力:

  • 接收蘋果事件
  • 將蘋果事件發送給自己
  • 響應它收到的蘋果事件

但是,在應用沙箱中,你不能將蘋果事件發送到其他應用,除非你配置了一個腳本目標授權或者一個蘋果事件臨時異常授權。

腳本目標授權是請求向提供腳本訪問組的應用程序發送蘋果事件的首選方式,如應用沙箱授權鍵所述

當您正在編寫的應用程序不提供腳本訪問組時,請使用apple-events臨時異常授權。這個授權包含一個字符串數組,每個字符串都應該包含你想要向其發送Apple事件的應用程序的bundle標識符。例如,要從應用程序向iPhoto發送蘋果事件,你可以傳遞一個包含單個字符串的數組,該字符串的值爲com.apple.iphoto。

scripting-targets和蘋果權利並不相互排斥,即使對一個目標應用。例如,如果你的應用程序有最低OS版本比10.8,scripting-targets介紹時,和應用程序腳本Apple Mail應用程序編寫消息,你繼續使用臨時權利(包括後綴修改::10.8),同時也包括scripting-targets權利爲10.8及以後版本兼容性,如下顯示:

<key>com.apple.security.temporary-exception.apple-events:before:10.8</key>
    <string>com.apple.mail</string>
 
<key>com.apple.security.scripting-targets</key>
<dict>
    <key>com.apple.mail</key>
    <array>
        <string>com.apple.mail.compose</string>
    </array>
</dict>

元素1

1.5.3 音頻單元託管臨時異常

默認情況下,沙箱應用程序只加載聲明自己在沙箱中使用是安全的音頻單元插件。在這個臨時的例外情況下,當應用程序試圖加載一個不安全(或未聲明)的插件時,用戶會被請求獲得許可。

Entitlement key Capability
com.apple.security.temporary-exception.audio-unit-host 允許託管未指定爲沙箱安全的音頻組件。有關詳細信息,請參閱音頻組件和應用程序沙箱

1.5.4 全局Mach服務臨時異常

在應用沙箱中,全局Mach服務的查找會失敗,除非你配置了Mach -lookup.global.name臨時異常授權。對於希望啓用的每個服務,將該服務作爲該授權鍵的值數組的字符串值添加。

Entitlement key Capability
com.apple.security.temporary-exception.mach-lookup.global-name 支持一個或多個全局Mach服務的查找。

1.5.5 全局Mach服務動態註冊臨時異常

在應用沙箱,動態註冊全球Mach服務失敗,除非你配置Mach寄存器。全局名臨時例外權利。對於希望啓用的每個服務,將該服務作爲該授權鍵的值數組的字符串值添加。

Entitlement key Capability
com.apple.security.temporary-exception.mach-register.global-name 啓用動態註冊一個或多個全局Mach服務。

1.5.6 文件訪問臨時異常

使用App Sandbox,您的應用程序只能訪問它的容器、應用程序組容器、POSIX世界可讀的位置以及文件系統中用戶指示要直接使用的位置,比如通過與Open或Save對話框交互。如果您的應用程序需要永久訪問其他位置,您可以通過啓用這裏描述的臨時異常授權密鑰將其他位置帶入沙箱。

對於希望啓用訪問的每個路徑,將該路徑指定爲相應權限鍵的值數組的字符串值。每個字符串都必須以斜槓(/)字符開頭——無論它代表的是絕對路徑還是相對於用戶主目錄的路徑。如果您提供的路徑指定的是目錄而不是文件,則必須使用斜槓字符結束該路徑。

  • 對於主路徑臨時異常,提供相對於用戶主目錄的路徑;也就是說,相對於~
  • 對於絕對路徑臨時異常,提供絕對路徑;也就是相對於/

當只讀權限可以使用時,不要使用讀/寫權限。

重要提示:不要使用這些臨時異常權限(家相關路徑或絕對路徑)來訪問共享首選項文件。相反,應使用共享首選項臨時異常授權,如共享首選項域臨時異常中所述。

Entitlement key Capability
com.apple.security.temporary-exception.files.home-relative-path.read-only 啓用對用戶主目錄中指定的文件或子目錄的只讀訪問。
com.apple.security.temporary-exception.files.home-relative-path.read-write 啓用對用戶主目錄中指定的文件或子目錄的讀/寫訪問。
com.apple.security.temporary-exception.files.absolute-path.read-only 啓用對指定絕對路徑上的指定文件或目錄的只讀訪問。
com.apple.security.temporary-exception.files.absolute-path.read-write 啓用對指定絕對路徑上的指定文件或目錄的讀/寫訪問。

1.5.7 IOKit用戶客戶端類臨時異常

如果需要授予與IOUserClient的其他子類交互的能力,請使用以下授權

Entitlement key Capability
com.apple.security.temporary-exception.iokit-user-client-class 能夠指定附加的IOUserClient子類來打開或設置屬性。

1.5.8 共享首選項域臨時異常

如果您的應用程序需要對共享首選項域進行只讀或讀/寫訪問,請使用以下權限。當只讀權限可以使用時,不要使用讀/寫權限。

Entitlement key Capability
com.apple.security.temporary-exception.shared-preference.read-only 啓用對用戶主目錄中指定首選項域或域的內容的只讀訪問。
com.apple.security.temporary-exception.shared-preference.read-write 啓用對用戶主目錄中指定首選項域或域的內容的讀/寫訪問。

1.6 沙盒設計指南

  • 什麼是沙盒:
    應用沙箱是macOS提供的一種訪問控制技術,在內核級別執行。如果應用程序受到威脅,它的目的是防止系統和用戶數據受到損害。通過Mac應用商店發佈的應用必須採用應用沙箱。通過開發者ID在Mac應用商店外簽名和分發的應用程序也可以(在大多數情況下應該)使用應用沙箱。

複雜的系統總是會有漏洞,而軟件的複雜性只會隨着時間的推移而增加。無論您多麼小心地採用安全編碼實踐並防範bug,攻擊者只需要通過一次防禦就可以成功。雖然應用沙箱不能阻止對您的應用程序的攻擊,但它可以最小化一個成功的攻擊所造成的傷害。

非沙箱應用程序擁有運行該應用程序的用戶的全部權限,並可以訪問用戶可以訪問的任何資源。如果該應用程序或與之鏈接的任何框架包含安全漏洞,攻擊者可能會利用這些漏洞來控制該應用程序,這樣,攻擊者就可以做用戶可以做的任何事情。

爲了緩解這個問題,應用沙箱策略有兩個方面:

  1. 應用沙箱允許你描述你的應用如何與系統交互。然後,系統授予應用程序完成工作所需的訪問權限,僅此而已。
  2. 通過打開和保存對話框、拖放和其他熟悉的用戶交互,應用沙箱允許用戶透明地授予應用額外的訪問權限

沙盒作用

應用沙箱並不是什麼靈丹妙藥。應用程序仍然可以被破壞,一個被破壞的應用程序仍然可以造成破壞。但是,當一個應用程序被限制在完成其工作所需的最低權限集時,潛在損害的範圍是非常有限的

1.6.1 App Sandbox基於一些簡單的原則

通過限制訪問敏感資源在每個應用的基礎上,應用沙箱提供最後一道防禦盜竊、腐敗、或者刪除用戶數據,或劫持系統硬件,如果攻擊者成功地利用安全漏洞在你的應用程序。例如,一個沙箱應用程序必須顯式地聲明其意圖使用權利使用任何以下資源:

  • Hardware (Camera, Microphone, USB, Printer)
  • Network Connections (Inbound or Outbound)
  • App Data (Calendar, Location, Contacts)
  • User Files (Downloads, Pictures, Music, Movies, User Selected Files)

對項目定義中未明確請求的任何資源的訪問在運行時被系統拒絕。例如,如果您正在編寫一個素描應用程序,並且您知道您的應用程序將永遠不需要訪問麥克風,那麼您只需不要求訪問,並且系統知道拒絕您的應用程序使用它的任何嘗試(可能已被破壞)。

另一方面,沙箱應用程序可以訪問你請求的特定資源,允許用戶以通常的方式執行典型操作(如拖放)來擴展沙箱,並可以自動執行許多被認爲安全的附加操作,包括:

  • 從服務菜單調用服務
  • 讀取大多數世界可讀的系統文件
  • 打開用戶選擇的文件

App Sandbox的元素包括授權、容器目錄、用戶決定的權限、特權分離和內核強制。這些功能結合在一起,可以防止應用程序訪問系統中超出完成工作所需的部分。

相關章節:App沙箱快速啓動App沙箱深入

1.6.1.1 App沙箱快速啓動

在這個快速啓動的過程中,您將獲得一個macOS應用程序並在沙箱中運行。您驗證應用程序確實是沙箱的,然後學習如何排除故障並解決一個典型的應用沙箱錯誤。你使用的應用程序是Xcode,活動監視器,終端和控制檯。

1.6.1.1.1 創建Xcode項目

在快速啓動中創建的應用程序使用web view,因此使用網絡連接。在App Sandbox下,網絡連接是不能工作的,除非你特別允許他們-使這成爲一個學習沙箱的好例子應用程序。

  • 在Xcode中,爲macOS Cocoa應用程序創建一個新的Xcode項目。
  1. 將項目命名爲AppSandboxQuickStart。
  2. 如果還沒有設置組織名稱和標識符,則設置組織名稱和標識符。組織標識符是bundle標識符的第一部分,通常使用反向dns格式構造,如About bundle id中所述。因此,如果您的組織名稱是Acme,那麼您的組織標識符將是com。這將產生一個包標識符com.Acme.AppSandboxQuickStart。
  3. 確保Use storyboard複選框被選中,而其他複選框未被選中。
  • 在項目導航器中,單擊Main。故事板文件。
    將出現接口構建器畫布。
  • 在對象庫(在實用程序區域)中,找到WKWebView對象。
  • 拖動一個WebKit視圖到畫布上的視圖控制器場景中的視圖控制器管理的視圖上。
  • (可選)要改善web view在運行app中的顯示效果,可執行以下步驟:
  1. 拖拽web view上的大小調整控件,以便它完全填充視圖控制器的主視圖。
  2. 向web view添加約束,以將其頂部、底部、左側和右側的邊緣固定在主視圖上。
  • 添加WebKit框架到應用程序。
  1. 通過在ViewController.h頭文件的接口塊上面添加以下語句來導入WebKit框架:@import WebKit;
  2. 將WebKit框架鏈接到Quick Start項目,作爲必需的框架。
    注意:如果你正在編譯OS X 10.7並且想要在這個應用程序中播放HTML5嵌入視頻,你還必須鏈接到AV基礎框架。這在macOS 10.8及以後版本中是不需要的。
  • 在ViewController類中爲web view創建並連接一個outlet。在視圖控制器的界面(要麼在ViewController.h中,要麼在ViewController.m中的一個類別中),添加以下內容:@property (weak) IBOutlet WKWebView *webView;

  • 將web view連接到您剛剛創建的應用程序委託出口。

  • 在視圖控制器的viewDidLoad方法中添加以下內容:

[self.webView loadRequest:
    [NSURLRequest requestWithURL:
        [NSURL URLWithString: @"http://www.apple.com"]]];

當視圖加載時,此方法從計算機的網絡連接請求指定的URL,然後將結果發送到web view進行顯示。

現在,構建並運行應用程序。

1.6.1.1.2 確認應用程序是沙箱的

窗口打開,但是沒有web內容出現。這是因爲默認情況下,所有新的Cocoa應用程序都啓用了sandboxing,但是你還沒有授予訪問網絡連接的權限。

除了被阻止的行爲,有幾個具體的跡象表明macOS應用程序是沙箱。

  1. 在Xcode項目導航器中選擇項目文件,然後是目標,最後是功能窗格。您應該會看到App Sandbox功能已經打開,但是沒有選擇任何特定的功能。如果您確實想禁用沙箱,可以通過將開關更改爲Off來實現。
  2. 在Finder中,查看~/Library/Containers/文件夾的內容。因爲快速啓動應用程序是沙箱的,所以現在有一個容器文件夾以你的應用程序命名。該名稱包括項目的公司標識符,因此完整的文件夾名稱將是,例如,com.Acme.AppSandboxQuickStart。
    當用戶第一次運行應用程序時,系統會爲給定的用戶創建應用程序的容器文件夾。

注意:在macOS 10.8及以後版本中,Finder默認會隱藏/Library文件夾。要查看它,選擇去>到文件夾…,並在出現的對話框中進入/Library。

  1. 在活動監視器中,檢查系統是否將應用程序識別爲沙箱。
  1. 啓動活動監視器(可用在/應用程序/實用程序中)。
  2. 在活動監視器中,選擇查看>列。
    確保選中了沙箱菜單項。
  3. 在沙箱欄中,確認快速啓動應用程序的值爲Yes。
    爲了更容易在Activity monitor中找到應用程序,在Filter字段中輸入快速啓動應用程序的名稱。
  1. 檢查應用程序二進制文件是否沙箱。在終端窗口中,輸入以下命令:codesign -dvvv --entitlements :- <executable-path>

其中< executable>是app主可執行二進制文件在app bundle中的完整路徑(例如AppSandboxQuickStart.app/Contents/MacOS/AppSandboxQuickStart)。此命令生成的輸出包含授權的屬性列表,其中包括com.apple.security。應用沙盒設置爲真,如果應用是沙箱。

重要提示:以上步驟對於快速啓動應用程序已經足夠了,但是對於包含嵌入式幫助應用程序、XPC服務或其他工具的應用程序還不夠。有關更多信息,請閱讀外部工具、XPC服務和特權分離

提示:如果應用程序在你嘗試運行它時崩潰了,特別是在接收到一個EXC_BAD_INSTRUCTION信號時,最有可能的原因是你之前運行了一個沙箱應用程序,它有相同的捆綁標識符,但是有不同的代碼簽名。這種啓動時的崩潰是一個應用沙箱安全特性,它可以防止一個應用僞裝成另一個應用,從而訪問另一個應用的容器。
您將學習如何根據這個安全特性,在App Sandbox和代碼簽名中設計和構建您的應用程序

1.6.1.1.3 解決一個應用沙盒衝突

如果你的應用嘗試做一些應用沙箱不允許的事情,就會發生應用沙箱衝突。例如,您已經在快速入門中看到沙箱應用程序無法從web檢索內容。對系統資源訪問的細粒度限制是應用沙箱在應用受到惡意代碼攻擊時提供保護的核心。解決這種違規需要在Xcode中添加與應用所需功能相對應的特定權利。

  1. 退出快速啓動程序。

  2. 在目標編輯器的capability選項卡中,在App Sandbox部分中,選擇與傳出連接(客戶機)對應的權限。通過修改. permissions屬性列表文件,將所需權限的真實值應用到Xcode項目。

注:網絡權限是根據誰建立連接而指定的,而不是數據流的主要方向。在本例中,您需要出站連接功能,因爲應用程序正在初始化連接。作爲服務器的應用程序需要入站連接權限。

  1. 構建並運行應用程序。預期的網頁現在顯示在應用程序中。

本章展示了一個簡單的示例應用程序如何使用授權來啓用應用沙箱和請求資源訪問,但這只是一個開始。對於一個真正的應用程序,在你可以發佈它之前,你附加了一個代碼簽名你的應用程序。當您開始訪問文件系統時,您將在容器目錄中工作。當用戶通過拖放等自然交互將文件引入沙箱時,您就創建了安全範圍的書籤,以隨着時間的推移保持對這些文件的持久訪問。隨着應用程序的複雜性增加,可以引入特權分離來實現更細粒度的資源控制。如果最壞的情況發生,這些技術一起提供了一種控制損害的方法。

1.6.1.1.4
1.6.1.1.5

1.6.1.2 App沙箱深入

您採用App Sandbox的具體步驟是您的App獨有的,但是App Sandbox保護用戶數據的訪問控制機制是一致的:

  • Entitlements.:告訴macOS你的應用程序完成工作所需要的系統資源,僅此而已。
  • Containers. 只訪問被認爲對應用程序安全的文件和目錄。
  • Persistent Resource Access. 保留安全範圍的書籤在你的應用程序的啓動到任何額外的文件,用戶已經特別授權你的應用程序訪問。
  • Code Signing. 明確地向系統識別你的應用程序,這樣其他應用程序就不會僞裝成你的。
  • Privilege Separation.將你的應用分成更小的部分,每個部分都有自己的資源特權,如果其中一部分被破壞,就能最大限度地減少損失。
1.6.1.2.1 最後一道防線的需要

你可以通過遵循安全編碼指南中推薦的實踐來保護你的應用免受惡意軟件的攻擊。但是,儘管您盡了最大努力構建了一個無堅不摧的屏障——通過避免緩衝區溢出和其他內存損壞、防止用戶數據暴露以及消除其他漏洞——但您的應用程序仍可能被惡意代碼利用。攻擊者只需在你的防禦系統或你鏈接的任何框架和庫中找到一個漏洞,就可以控制你的應用程序與系統的交互。

通過讓你描述你的應用程序與系統的預期交互,App Sandbox被設計用來直面這種情況。然後系統只授予應用程序完成工作所需的訪問權限。如果惡意代碼獲得了一個正確沙箱應用的控制權,那麼它只能訪問應用沙箱中的文件和資源

如表2-1所示,要成功採用App沙箱,請使用一種不同於您習慣的心態。

表2-1

1.6.1.2.2 權利和系統資源訪問

沒有沙箱的應用程序可以訪問所有用戶可訪問的系統資源——包括內置的攝像頭和麥克風、網絡套接字、打印和大部分文件系統。如果被惡意代碼成功攻擊,這樣的應用程序就會表現得像一個具有廣泛潛在危害的敵對代理。

當您爲您的應用程序啓用App Sandbox時,您刪除了除了最小的一組特權之外的所有特權,然後使用授權,有意地一個一個地恢復它們。權限是標識特定功能的鍵值對,例如打開出站網絡套接字的功能。

個特殊的權限-啓用應用沙箱-打開應用沙箱。啓用sandboxing時,Xcode會創建一個.entitlement屬性列表文件,並在項目導航器中顯示。

如果你的應用程序需要一個功能,通過使用目標編輯器的Summary標籤在你的Xcode項目中添加相應的權限來請求它。如果您不需要某個功能,請注意不要包含相應的權限。

你逐項申請津貼。如果你的應用程序只有一個目標——主應用程序——你只需要爲那個目標申請授權。如果將應用程序設計爲使用主應用程序和助手(以XPC服務的形式),則需要爲每個目標分別請求相應的權利。您將在外部工具、XPC服務和特權分離中瞭解有關這方面的更多信息。

你可能需要比Xcode目標編輯器更細粒度地控制你的應用程序的權利。例如,您可能會請求一個臨時的異常授權,因爲App Sandbox不支持您的應用程序所需的功能,例如向尚未提供腳本訪問組的應用程序發送蘋果事件的能力。要使用臨時異常權限,可以使用Xcode屬性列表編輯器直接編輯目標的.entitlement屬性列表文件。

注意:如果您請求臨時例外授權,請確保遵循iTunes Connect網站上提供的有關授權的指導。特別要注意的是,記錄一個bug,詢問你需要的功能,並使用iTunes Connect中的Review Notes字段來解釋爲什麼你的應用需要這個臨時異常。一定要提供錯誤編號。

macOS應用沙箱權限在權限鍵參考啓用應用沙箱描述。要了解如何在Xcode項目中請求目標的授權,請參見App Sandbox Quick Start

1.6.1.2.3 容器目錄和文件系統訪問

當您採用App Sandbox時,您的應用程序可以訪問以下位置:

  • app容器目錄。在第一次啓動時,操作系統會創建一個特殊的目錄,供應用程序使用(僅供應用程序使用),稱爲容器。系統上的每個用戶在他們的主目錄中爲你的應用程序獲得一個單獨的容器;您的應用程序爲運行它的用戶提供了不受約束的對容器的讀/寫訪問。
  • 應用程序組容器目錄。一個沙箱應用程序可以指定一個權限,讓它訪問一個或多個app group容器目錄,每個目錄在擁有該權限的所有應用程序之間共享。
  • 指定的文件。當用戶顯式打開或拖放到應用程序中時,一個沙箱應用程序(具有適當的權限)會自動獲得對任意位置文件的訪問權。
  • 相關的文件。通過適當的權限,您的應用程序可以訪問與用戶指定文件同名但擴展名不同的文件。這可用於訪問功能相關的文件(如與電影關聯的字幕文件)或用於以不同格式保存修改後的文件(如在用戶添加圖片後將RTF平面文件重新保存爲RTFD容器)。
  • 臨時目錄、命令行工具目錄和特定的世界可讀的位置。沙箱應用程序可以不同程度地訪問其他特定位置的文件。

這些策略將在下面幾節中進一步詳細說明

1.6.1.2.4 應用沙箱容器目錄

app沙箱容器目錄具有以下特點:

  • 它位於系統定義的路徑中,位於用戶的主目錄中。在沙箱應用程序中,當應用程序調用NSHomeDirectory函數時返回該路徑。
  • 你的應用程序對容器及其子目錄有不受限制的讀/寫訪問。
  • macOS路徑查找api(在POSIX層之上)指的是特定於應用程序的位置。
  1. 大多數路徑查找api引用的是相對於應用程序容器的位置。例如,容器包含一個單獨的庫目錄(由NSLibraryDirectory搜索路徑常量指定),僅供應用程序使用,以及單獨的應用程序支持和首選項子目錄。
  2. 將容器用於支持文件不需要更改代碼(從應用程序的沙箱前版本),但可能需要一次性遷移,如將應用程序遷移到沙箱中所述。
  3. 一些路徑查找api(在POSIX層之上)引用用戶主目錄之外的特定於應用程序的位置。例如,在沙箱應用程序中,NSTemporaryDirectory函數提供了一個到用戶主目錄之外、但特定於您的應用程序並位於沙箱中的某個目錄的路徑;對當前用戶可以不受限制地進行讀/寫訪問。這些尋路api的行爲根據App Sandbox進行了適當的調整,不需要修改代碼。
  • macOS通過應用程序的代碼簽名建立並加強應用程序與其容器之間的連接。
  • 容器位於一個隱藏的位置,因此用戶不會直接與它交互。具體來說,容器不是用於用戶文檔的。它是爲應用程序使用的文件,以及數據庫、緩存和其他特定於應用程序的數據準備的。
    對於一個鞋盒風格的應用程序,在其中你爲用戶的內容提供唯一的用戶界面,這些內容放在容器中,你的應用程序可以完全訪問它。

iOS注意:macOS容器與iOS容器不同,因爲它不是用於用戶文檔的。此外,與macOS不同的是,iOS容器包含應用程序本身。
iCloud注:正如在iCloud設計指南中描述的那樣,蘋果的iCloud技術也使用了“容器”這個名稱。iCloud容器和App沙箱容器之間沒有功能上的連接。

多虧了代碼簽名,其他沙箱應用程序都不能訪問您的容器,即使它試圖通過使用您的bundle identifier來僞裝成您的應用程序。但是,你的應用程序的未來版本——如果你使用相同的代碼簽名和捆綁標識——可以重用你的應用程序的容器。

對於每個用戶,當用戶第一次運行應用程序時,沙箱應用程序的容器目錄會自動創建。因爲容器位於用戶的主目錄中,所以系統上的每個用戶都會爲應用程序獲得他們自己的容器。

1.6.1.2.5 應用程序組容器目錄

除了每個應用程序的容器,在macOS 10.7.5和10.8.3以及更高版本中,應用程序可以使用com.apple.security。應用程序組有權請求訪問同一個開發團隊生產的多個應用程序共用的一個或多個共享容器。權限是一個組標識符字符串數組,每個字符串爲應用程序所屬的不同組命名。組容器用於非面向用戶的內容,如共享緩存或數據庫。

注意:屬於應用程序組的應用程序還可以共享Mach和POSIX信號量,並與其他組成員一起使用其他IPC機制。有關更多細節,請參閱IPC和POSIX信號量和共享內存

應用程序的沙箱會自動放大,包括應用程序的所有組容器。容器本身存儲在~/Library/Group Containers/<application- Group id>中,其中<application- Group id>是組的名稱,在權限的組標識符字符串中指定。組標識符必須以開發團隊ID開頭,後面跟着句號。

從macOS 10.8.3開始,你的應用程序可以通過調用containerURLForSecurityApplicationGroupIdentifier: NSFileManager的方法獲得一個組容器的路徑。

注意:在macOS 10.9中,調用這個方法會自動創建組容器目錄,以及組容器目錄中的庫/首選項、庫/緩存和庫/應用程序支持文件夾。
在以前的版本中,儘管group container目錄是沙箱的一部分,但目錄本身不會自動創建。您的應用程序必須創建這個目錄,如清單2-1所示:

清單2-1創建一個app group容器目錄:

   NSFileManager *fm = [NSFileManager defaultManager];
    NSString *appGroupName = @"Z123456789.com.example.app-group"; /* For example */
 
    NSURL *groupContainerURL = [fm containerURLForSecurityApplicationGroupIdentifier:appGroupName];
    NSError* theError = nil;
    if (![fm createDirectoryAtURL: groupContainerURL withIntermediateDirectories:YES attributes:nil error:&theError]) {
        // Handle the error.
    }

您應該按照組織其他庫文件夾的方式組織此目錄的內容,根據需要使用標準文件夾名稱(首選項、應用程序支持等)。

有關詳細信息,請參見授權鍵引用嚮應用程序組添加應用程序

1.6.1.2.6 容器之外的Powerbox和文件系統訪問

您的沙箱應用程序可以通過以下三種方式訪問其容器外的文件系統位置:

與用戶交互以擴展沙箱的macOS安全技術稱爲Powerbox。Powerbox沒有API。當您使用NSOpenPanelNSSavePanel類時,您的應用程序會透明地使用Powerbox。您可以通過使用Xcode設置權限來啓用Powerbox,如在權限鍵引用中啓用用戶選擇的文件訪問中所述。

當您從沙箱應用程序中調用打開或保存對話框時,出現的窗口不是由AppKit顯示的,而是由Powerbox顯示的。當你採用應用沙箱時,使用Powerbox是自動的,它不需要改變你的應用沙箱前版本的代碼。

注意:當你採用App Sandbox時,NSOpenPanel和NSSavePanel類有一些重要的行爲差異,在App Sandbox的打開和保存對話框行爲中有描述。

Powerbox提供的安全優勢是它不能被編程操作——具體來說,沒有惡意代碼使用Powerbox訪問文件系統的機制。只有用戶通過與通過Powerbox打開和保存對話框進行交互,才能使用這些對話框訪問之前建立的沙箱之外的文件系統部分。例如,如果用戶保存了一個新文檔,Powerbox會擴展沙箱,讓應用程序對該文檔進行讀/寫訪問。

當應用程序的用戶指定他們想使用一個文件或文件夾時,系統會將相關路徑添加到應用程序的沙箱中。例如,用戶將~/Documents文件夾拖放到應用程序的停靠塊上(或者拖放到應用程序的Finder圖標上,或者拖放到打開的應用程序窗口中),從而表明他們想使用該文件夾。作爲響應,系統使~/Documents文件夾及其內容和子文件夾對您的應用程序可用。

如果用戶打開了一個特定的文件,或者保存到一個新的文件,系統將使指定的文件,以及該文件單獨對您的應用程序可用。

此外,系統自動允許沙箱應用程序:

  • 連接到系統輸入方法
  • 調用用戶從“服務”菜單中選擇的服務。

有些服務不是沙盒安全的。例如,Finder應用程序的Open服務可能允許一個受影響的應用程序通過編程方式在系統的任何地方打開任意文件,從而逃脫它的沙箱。我們鼓勵服務提供商將這些類型的服務標記爲受限制的(默認情況下服務是不受限制的),在這種情況下,沙盒應用程序仍然可以使用該服務,但只有在用戶得到警告並獲得明確的繼續使用許可之後。有關更多信息,請參閱服務實現指南

  • 打開用戶從“打開最近”菜單中選擇的文件
  • 通過用戶調用的複製和粘貼方式參與到其他應用程序中
  • 讀取文件,世界可讀,在某些目錄,包括以下目錄:
/bin
/sbin
/usr/bin
/usr/lib
/usr/sbin
/usr/share
/System
  • 讀取和寫入通過調用NSTemporaryDirectory創建的目錄中的文件

注意:沙箱應用程序無法訪問/tmp目錄。使用NSTemporaryDirectory函數獲取應用程序臨時文件的臨時位置。

當用戶指定了他們想要使用的文件後,該文件就在應用程序的沙箱中。如果你的應用被惡意代碼利用,這個文件就很容易受到攻擊:app Sandbox沒有提供保護。要爲沙箱中的文件提供保護,請遵循安全編碼指南中的建議。

默認情況下,用戶打開或保存的文件會一直保存在沙箱中,直到應用程序終止,只有在應用程序終止時打開的文件除外。這些文件通過macOS的恢復功能在你的應用下次啓動時自動重新打開,並自動添加回你的應用的沙箱。

要以不依賴於Resume的方式提供對位於容器外部的資源的持久訪問,請使用安全範圍的書籤,如在安全範圍的書籤和持久資源訪問中所解釋的那樣。

相關項目

App Sandbox的相關條目功能允許您的應用訪問與用戶選擇的文件同名但不同擴展名的文件。該特性由兩部分組成:應用程序信息中的相關擴展列表。plist文件和代碼告訴沙箱你在做什麼。

在兩種情況下,這是有意義的:

  • 場景1:
    您的應用程序需要能夠保存與原始文件不同的擴展名的文件。例如,當您將圖像粘貼到TextEdit中的RTF文件並保存它時,TextEdit將文件的擴展名從. RTF更改爲.rtfd(並將其變成一個目錄)。
    要處理這種情況,必須使用NSFileCoordinator對象來協調對文件的訪問。在重命名文件之前,調用itemAtURL:willMoveToURL:方法。重命名文件後,調用itemAtURL:didMoveToURL:方法。

  • 場景2:
    您的應用程序需要能夠打開或保存多個同名和不同擴展名的相關文件(例如,自動打開與電影文件同名的字幕文件,或允許SQLite日誌文件)。
    爲了訪問輔助文件,創建一個符合NSFilePresenter協議的類。這個對象應該提供主文件的URL作爲它的primaryPresentedItemURL屬性,並提供輔助文件的URL作爲它的presentedItemURL屬性。
    在用戶打開主文件後,文件演示器對象應該調用NSFileCoordinator類上的addFilePresenter: class方法來註冊自己。

注意:在SQLite日誌文件的情況下,從10.8.2開始,如果打開SQLite數據庫,日誌文件、提前寫日誌文件和共享內存文件會自動添加到相關項列表中,因此這個步驟是不必要的。

在這兩種情況下,都必須對應用程序的信息進行小的更改。plist文件。應用程序應該已經聲明瞭一個文檔類型(CFBundleDocumentTypes)數組,該數組聲明瞭應用程序可以打開的文件類型。

對於該數組中的每個文件類型字典,如果該文件類型應該被視爲用於打開和保存目的的潛在相關類型,則添加鍵NSIsRelatedItemType和一個布爾值YES

要了解關於文件演示器和文件協調器的更多信息,請閱讀文件系統編程指南

1.6.1.2.7 使用沙箱打開並保存對話框行爲
1.6.1.2.8 安全範圍的書籤和持久資源訪問
1.6.1.2.9 應用沙箱和代碼簽名
1.6.1.2.10 外部工具、XPC服務和特權分離
1.6.1.2.11 IPC和POSIX信號量和共享內存
1.6.1.2.12
1.6.1.2.13

1.6.2 設計你的應用程序與應用沙箱在腦海中

在您瞭解了這些基礎知識之後,根據這種安全技術來查看您的應用程序。首先,確定您的應用程序是否適合沙箱。(大多數應用程序)。然後解決任何API不兼容問題,並確定需要哪些權利。最後,考慮應用特權分離來最大化App Sandbox的防禦價值。

相關章節:App沙箱設計

1.6.3 Xcode幫助您將現有的應用程序遷移到應用沙箱

當您採用應用沙箱時,您的應用程序使用的一些文件系統位置是不同的。特別地,您將獲得一個容器目錄,用於應用程序支持文件、數據庫、緩存和除用戶文檔之外的其他文件。Xcode和macOS支持文件從其遺留位置遷移到您的容器。

相關章節:將應用程序遷移到沙箱

1.6.4 在發佈之前,先發布你的應用

當你在你的應用中採用了應用沙箱後,作爲你每次發佈它的最後一步,仔細檢查你是否遵循了最佳實踐。

相關章節:應用沙箱清單

1.6.5 如何使用該文檔

要安裝並運行應用沙箱,請在應用沙箱快速啓動中執行本教程。在對你打算髮布的應用進行沙盒測試之前,確保你深入瞭解了應用沙盒。當你準備開始沙箱一個新的應用程序,或轉換一個現有的應用程序採用應用沙箱時,請閱讀《爲應用沙箱設計》。如果你正在爲用戶提供一個新的沙箱版本的應用程序,而用戶已經在運行一個沒有沙箱版本的應用程序,請閱讀將應用程序遷移到沙箱。最後,在發佈你的應用程序之前,通過應用沙盒檢查表來驗證你是否遵循了應用沙盒的最佳實踐

先決條件:在閱讀本文檔之前,請確保通過閱讀Mac App編程指南瞭解macOS開發的整個過程。

爲了補充應用沙箱提供的損害控制,您必須通過在整個應用程序中採用安全編碼實踐來提供第一道防線。要了解如何操作,請閱讀安全概述安全編碼指南

採用應用沙箱的一個重要步驟是爲你的應用申請授權。有關所有可用授權的詳細信息,請參閱授權關鍵參考

通過實現特權分離,您可以在功能完整的應用程序中增強App Sandbox的優勢。您可以使用XPC來實現這一點,XPC是一種實現進程間通信的macOS。要了解使用XPC的詳細信息,請閱讀守護進程和服務編程指南

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章