提到 iOS 也許有人聽說過一個(gè)名詞 --- Sandbox。那 Sandbox 到底是一個(gè)什么東西伙窃?它到底有什么作用菩颖?本文將就這些問題做出說明,讓我們對(duì) Sandbox 有所了解为障。
為了方便晦闰,IOS App Sandbox 在本文中或被簡(jiǎn)稱為 應(yīng)用程序沙盒,沙盒 或者 沙箱 等鳍怨。
在 iOS 系統(tǒng)中(macOS 同樣存在)呻右,每個(gè)應(yīng)用程序都有一個(gè)屬于自己的存儲(chǔ)空間,用于存儲(chǔ)圖像鞋喇、圖標(biāo)声滥、聲音、文本侦香、屬性列表等落塑,這個(gè)存儲(chǔ)空間就是 沙盒。
沙盒具有以下幾個(gè)特點(diǎn)鄙皇,
- 每個(gè)應(yīng)用程序都有自己的存儲(chǔ)空間芜赌。
- 應(yīng)用程序不能翻過自己的圍墻去訪問別的存儲(chǔ)空間的內(nèi)容。
- 應(yīng)用程序請(qǐng)求的數(shù)據(jù)都要通過權(quán)限審核伴逸,沒有授權(quán)的訪問會(huì)被拒絕缠沈。
上述特點(diǎn)概括起來就是:因?yàn)樯澈械拇嬖冢瑧?yīng)用程序只能讀寫自己沙盒的文件错蝴,不能訪問其他應(yīng)用程序的沙盒洲愤,不能進(jìn)行程序間通信(除非通過URL Scheme 方法)。
通過下圖顷锰,能否幫助理解什么是沙盒柬赐?沙盒是 IOS 的一種安全體系,應(yīng)用程序的所有操作都要通過它來執(zhí)行官紫,最核心點(diǎn)在于沙盒對(duì)應(yīng)用程序執(zhí)行的各種操作有權(quán)限限制肛宋。
IOS 沙箱被封裝在 libsandbox.dylib
靜態(tài)庫中州藕,它為每個(gè)進(jìn)程分配空間和權(quán)限配置,使用TrustedBSD API 托管和通信酝陈,暗盒負(fù)責(zé)關(guān)閉代碼控件床玻,明盒負(fù)責(zé)打開代碼控件。它啟用的過程如下沉帮,
- sandbox_init 通過
libsandbox.dylib
轉(zhuǎn)換為二進(jìn)制傳遞給 kernel mac syscall TrustedBSD锈死。 - 將 sandbox_init 的請(qǐng)求發(fā) sandbox.kext 的擴(kuò)展,擴(kuò)展為當(dāng)前進(jìn)程安裝證書穆壕,然后返回安裝結(jié)果待牵。
- 如果安裝成功,每次進(jìn)程的請(qǐng)求喇勋,都會(huì)被 trusted bsd 發(fā)送給 sandbox.kext 去匹配之前安裝的證書規(guī)則缨该。如果證書不匹配的話,則安裝失敗茄蚯。
說實(shí)話上述這些內(nèi)容都會(huì)網(wǎng)上資料做的拼湊和整合压彭,其實(shí)沒有涉獵過 IOS 開發(fā)可能真的很難從本質(zhì)上理解沙箱,待以后有機(jī)會(huì)深入了解之后再對(duì)沙箱原理做深入解讀渗常。
END