資料保護的 Keybag
在 iOS、iPadOS、tvOS 和 watchOS 中,系統會收集檔案和鑰匙圈「資料保護」類別的密鑰,並在 Keybag 中進行管理。這些作業系統使用下列 Keybag:使用者、裝置、備份、託管和「iCloud 備份」。
使用者 Keybag
使用者 Keybag 是裝置一般操作中使用的封裝類別密鑰的儲存位置。例如,輸入密碼後,會從使用者 Keybag 中載入 NSFileProtectionComplete 並解除封裝。這是二進位屬性列表(.plist)檔案,儲存在「無保護」類別中。
在配備 A9 以前 SoC 的裝置上,.plist 檔案內容以密鑰(保存在可抹除儲存空間中)加密。為了對 Keybag 提供更高的安全性,使用者每次更改密碼時,系統都會清除並重新產生此密鑰。
在配備 A9 或後續晶片 SoC 的裝置上,.plist 檔案中包含一個密鑰,指出 Keybag 儲存在保存庫中,這個保存庫受到「安全隔離區」所控制的反重放值保護。
「安全隔離區」會管理使用者 Keybag,並可用於查詢裝置的鎖定狀態。只有當使用者 Keybag 中的所有類別密鑰都可存取且已成功解除封裝,它才會報告裝置已解鎖。
裝置 Keybag
裝置 Keybag 是用來儲存封裝類別密鑰(用於與裝置專屬有關的作業)。設為共用的 iPadOS 裝置有時需要先存取憑證,才能讓任何和使用者登入,因此需使用不受使用者密碼保護的 Keybag。
iOS 和 iPadOS 不支援使用者專屬檔案系統內容的加密編譯分隔,這表示系統會使用來自裝置 Keybag 的類別密鑰來封裝檔案專屬密鑰。不過,鑰匙圈會使用來自使用者 Keybag 的類別密鑰來保護使用者鑰匙圈裡的項目。在針對單一使用者(預設設定)設定的 iPhone 和 iPad 裝置上,裝置 Keybag 和使用者 Keybag 是同一個,且受使用者的密碼保護。
備份 Keybag
備份 Keybag 是在 Finder(macOS 10.15 或以上版本)或 iTunes(macOS 10.14 或較早版本)進行加密備份時製作,其儲存在裝置進行備份的電腦上。新 Keybag 是使用一組新的密鑰製作而成,備份的資料會以這些新密鑰來重新加密。如前面所述,不可遷移的鑰匙圈項目仍會使用 UID 衍生的密鑰加以封裝,以使其可以回復到最初備份它們的裝置,但在其他裝置上則無法存取。
Keybag 受到密碼組保護,且執行了一千萬次密鑰衍生函數 PBKDF2 的反覆運算。雖然反覆運算的次數很多,但 Keybag 並未與特定裝置綁定,因此理論上可嘗試在多部電腦上對備份 Keybag 進行暴力密碼破解攻擊。而安全性夠高的密碼可以降低此威脅。
若使用者選擇不加密備份,那麼無論檔案屬於哪一種「資料保護」類別,檔案都不會加密,但鑰匙圈仍會使用 UID 衍生的密鑰獲得保護。這就是只有在設定備份密碼時,才能將鑰匙圈項目遷移到新裝置的原因。
託管 Keybag
託管 Keybag 用於透過 USB 和 行動裝置管理(MDM)來與 Finder(macOS 10.15 或以上版本)或 iTunes(macOS 10.14 或以上版本)同步。此 Keybag 可讓 Finder 或 iTunes 在不要求使用者輸入密碼的情況下執行備份和同步,還能讓 MDM 解決方案從遠端清除使用者密碼。它儲存在用來與 Finder 或 iTunes 進行同步的電腦,或者遠端管理裝置的 MDM 解決方案上。
託管 Keybag 改善了裝置同步期間的使用者體驗,此期間內可能需要存取所有類別的資料。當使用密碼鎖定的裝置首次連接到 Finder 或 iTunes 時,系統會提示使用者輸入密碼。然後,裝置會製作託管 Keybag,其中包含的類別密鑰與裝置上使用的完全相同,該 Keybag 由新產生的密鑰保護。系統會將託管 Keybag 與用於保護它的密鑰分割到裝置和主機或伺服器上,其資料則以「首次使用者認證前的保護」類別儲存在裝置上。這就是使用者重新啟動後首次使用 Finder 或 iTunes 進行備份之前,必須輸入裝置密碼的原因。
如果是進行無線(OTA)軟體更新,在一開始進行更新時,系統會提示使用者輸入密碼。這會用來安全地建立一次性解鎖代號,其會在更新後解鎖使用者 Keybag。若未輸入使用者的密碼,便無法產生此代號,且若使用者密碼有所更改,任何先前產生的代號都會失效。
不同的一次性解鎖代號分別適用於手動和自動軟體更新安裝情形。它們會使用「安全隔離區」中單純計數器目前值所衍生的密鑰、Keybag 的 UUID 和「安全隔離區」UID 來進行加密。
在 A9(或後續晶片)SoC 上,即時鎖定代號不再依賴計數器或「可抹除儲存空間」,而是受到由「安全隔離區」控制的反重放值保護。
手動軟體更新的一次性解鎖代號會在 20 分鐘後過期。在 iOS 13 和 iPadOS 13.1 或以上版本中,代號儲存在受到「安全隔離區」保護的保存庫中。在 iOS 13 以前,此代號可從「安全隔離區」輸出,並寫入「可抹除儲存空間」中,或受到「安全隔離區」反重播機制保護。若裝置在 20 分鐘內未重新開機,規則計時器會遞增計數器。
當以下其中一種情況發生,而且系統偵測到有可用更新時,軟體更新將會自動執行:
已在 iOS 12 或以上版本中設定自動更新。
使用者在收到更新通知時選擇「稍後安裝」。
使用者輸入密碼後,系統會產生一次性解鎖代號,在「安全隔離區」中效力長達 8 小時。如果尚未執行更新,每次鎖定裝置時系統便會銷毀此一次性解鎖代號,並在每一次的後續解鎖時重新建立。每次解鎖都會重計 8 小時。8 小時過後,規則計時器將會使一次性解鎖代號失效。
「iCloud 備份」Keybag
「iCloud 備份」Keybag 與備份 Keybag 類似。此 Keybag 中的所有類別密鑰都是非對稱式的(與「未打開檔案的保護」資料保護類別一樣,使用 Curve25519)。非對稱式 Keybag 也用來保護復原「iCloud 鑰匙圈」所需的備份鑰匙圈。