轉(zhuǎn)載請注明出處:
https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh/General_Architecture/OSX_Sandbox_design.html
全書地址
Chromium中文文檔 for https://www.chromium.org/developers/design-documents
持續(xù)更新ing,歡迎star
gitbook地址:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//
github地址: https://github.com/ahangchen/Chromium_doc_zh
這個文檔描述了Mac OS X上的進程沙箱機制照藻。
背景
沙箱將進程視為一種惡劣的環(huán)境闷袒,因為進程任何時候都可能被一個惡意攻擊者借由緩沖區(qū)溢出或者其他這樣的攻擊方式所影響。一旦進程被影響岩梳,我們的目標就變成了囊骤,讓這個有問題的進程能訪問的用戶機器的資源越少越好,并盡量避免在標準文件系統(tǒng)訪問控制以外冀值,以及內(nèi)核執(zhí)行的用戶/組進程控制相關(guān)的行為也物。
查看概述文檔了解目標與整體架構(gòu)圖表。
實現(xiàn)
在Mac OS X上列疗,從Leopard版本開始滑蚯,每個進程通過使用BSD沙箱設(shè)施(在一些Apple的文檔中也被成為Seatbelt)擁有自己的權(quán)限限制。這由一系列獨立的API調(diào)用組成抵栈,sandbox_init()告材,設(shè)置進程彼時的訪問限制。這意味著即使新的權(quán)限拒絕訪問任何新創(chuàng)建的文件描述符古劲,之前打開的文件描述符仍然生效斥赋。我們可以通過在進程啟動前正確地設(shè)置來利用這一點,在我們將渲染器暴露給任何第三方輸入(html产艾,等等)前疤剑,切斷所有訪問滑绒。
Seatbelt不會限制內(nèi)存分配,多線程隘膘,或者對先前打開的系統(tǒng)設(shè)施的訪問疑故。因此,這應(yīng)該不會影響其他的需求或者嚴重影響我們的IPC設(shè)計弯菊。
OS X提供了對緩沖區(qū)溢出提供了額外的保護纵势。在Leopard中,棧被標志為不可執(zhí)行內(nèi)存管钳,因此更不易被作為執(zhí)行惡意代碼的攻擊方向钦铁。這不能避免堆的內(nèi)存溢出,但對于64位應(yīng)用蹋嵌,除非內(nèi)存的一部分被顯式標識為可執(zhí)行,否則Leopard不允許任何執(zhí)行代碼的企圖葫隙。隨著我們將來轉(zhuǎn)入64位渲染器進程栽烂,這會變成另一個吸引人的安全特性。
sandbox_init()支持預(yù)定義沙箱訪問限制和提供更精細控制的沙箱配置腳本恋脚。
Chromium使用的自定義沙箱配置在源代碼樹的.sb文件中腺办。
我們定義了下面這些配置文件(路徑相對于源代碼根目錄):
- content/common/common.sb - 用于所有沙箱的常用安裝
- content/renderer/renderer.sb - 用于擴展和渲染器進程。允許訪問字體服務(wù)器糟描。
- chrome/browser/utility.sb - 用于工具進程怀喉。允許訪問單一可配置目錄。
- content/browser/worker.sb - 用于工作進程船响。限制度最高 - 除了加載系統(tǒng)庫之外躬拢,沒有文件系統(tǒng)訪問權(quán)限。
- chrome/browser/nacl_loader.sb - 用戶允許不受信任的原生客戶端代碼(例如见间,“user”)聊闯。
一個讓我們不愉快的點是,沙箱進程通過OS X系統(tǒng)API調(diào)用米诉。而且沒有每個API需要哪些權(quán)限的文檔菱蔬,比如它們是否需要訪問磁盤文件,或者是否會調(diào)用沙箱限制訪問的其他API史侣?目前拴泌,我們的方法是,在打開沙箱前惊橱,對任何可能有問題的API調(diào)用做“熱身”蚪腐。例如,顏色配置和共享庫可以在我們鎖定進程前從磁盤加載税朴。
SandboxInitWrapper::InitializeSandbox()是初始化沙箱的主要入口削茁,它按以下步驟執(zhí)行:
- 判斷當前進程的類型是否需要沙箱化宙枷,如果需要,判斷需要使用哪種沙箱配置茧跋。
- 通過調(diào)用sandbox::SandboxWarmup() “熱身”相關(guān)"系統(tǒng)API慰丛。
- 通過調(diào)用sandbox::EnableSandbox()啟動沙箱。
調(diào)試
OS X沙箱實現(xiàn)支持下面這些標志位:
- --no-sandbox - 關(guān)閉整個沙箱
- --enable-sandbox-logging - 關(guān)于哪個系統(tǒng)調(diào)用正在阻塞的詳細信息被記錄到syslog
Debugging Chrome on OS X里有更多關(guān)于調(diào)試和Mac OS X 沙箱API診斷工具的文檔瘾杭。
擴展閱讀
http://reverse.put.as/wp-content/uploads/2011/09/Apple-Sandbox-Guide-v1.0.pdf
沙箱手冊頁 (man 7 sandbox)
-
系統(tǒng)沙箱文件可以在下面的路徑之一找到(取決于系統(tǒng)版本):
- /Library/Sandbox/Profiles
- /System/Library/Sandbox/Profiles
- /usr/share/sandbox