轉(zhuǎn)載請(qǐng)注明出處:
https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh/General_Architecture/Sandbox.html
全書(shū)地址
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
安全是Chromium最重要的目標(biāo)之一虽填。安全的關(guān)鍵在于理解下面這點(diǎn):在我們完整地理解了系統(tǒng)在所有可能的輸入組合下表現(xiàn)出的行為之后,我們才能夠真的保證系統(tǒng)安全墓陈。對(duì)于像Chromium這樣龐大而多樣化的代碼庫(kù),推理它的各個(gè)部分可能的行為的組合幾乎是不可能的庸毫。沙箱的目標(biāo)是提供這樣一種保證:不論輸入什么飒赃,保證一段代碼最終能或不能做的事情载佳。
沙盒利用操作系統(tǒng)提供的安全性蔫慧,允許不能對(duì)計(jì)算機(jī)做出持久性改變或者訪問(wèn)持續(xù)變化的信息的代碼的執(zhí)行姑躲。沙箱提供的架構(gòu)和具體保證依賴(lài)于操作系統(tǒng)黍析。這個(gè)文檔覆蓋了Windows實(shí)現(xiàn)與一般的設(shè)計(jì)橄仍。Linux實(shí)現(xiàn)和OSX實(shí)現(xiàn)也會(huì)在這里描述侮繁。
如果你不想要閱讀這整個(gè)文檔宪哩,你可以閱讀Sandbox FAQ锁孟。沙箱保護(hù)與不保護(hù)的內(nèi)容也可以在FAQ中找到品抽。
設(shè)計(jì)原則
- 不要重新發(fā)明輪子: 用更好的安全模型擴(kuò)展操作系統(tǒng)內(nèi)核很有誘惑力圆恤。但不要這樣做盆昙。讓操作系統(tǒng)在所控制的對(duì)象上應(yīng)用它的安全策略。另一方面秕磷,創(chuàng)建有自定義安全模型的應(yīng)用程序?qū)蛹?jí)對(duì)象(抽象)是可以的澎嚣。
- 最小權(quán)限原則: 這既應(yīng)該用于沙箱代碼也應(yīng)該用于控制沙箱的代碼币叹。換言之模狭,即使用于不能提升權(quán)限到超級(jí)用戶,沙箱也需要能夠工作驱富。
- 假定沙盒代碼是惡意代碼: 出于威脅建模的目的褐鸥,我們認(rèn)為沙箱中的代碼一旦執(zhí)行路徑越過(guò)了一些main()函數(shù)的早期調(diào)用叫榕,那么它是有害的(即寓落,它會(huì)運(yùn)行有害代碼)荞下,實(shí)踐中尖昏,在第一外部輸入被接收時(shí)抽诉,或者在進(jìn)入主循環(huán)前掸鹅,這就可能發(fā)生。
- 敏感: 非惡意代碼不會(huì)嘗試訪問(wèn)它不能獲得的資源荷鼠。在這種情況下允乐,沙箱產(chǎn)生的性能影響應(yīng)該接近零牍疏。一旦敏感資源需要以一種控制行為訪問(wèn)時(shí)鳞陨,一點(diǎn)性能損失是必要的厦滤。這是在操作系統(tǒng)安全合適事情情況下的常見(jiàn)例子掏导。
- 仿真不是安全: 仿真和虛擬機(jī)方案本身不能提供安全羽峰。沙箱不會(huì)出于安全目的值纱,依賴(lài)于代碼仿真计雌,或者代碼轉(zhuǎn)換凿滤,或者代碼修復(fù)翁脆。
沙箱windows架構(gòu)
Windows沙箱是一種僅用戶模式可用的沙箱反番。沒(méi)有特殊的內(nèi)核模式驅(qū)動(dòng)罢缸,用戶不需要為了沙箱正確運(yùn)行而成為管理員爵川。沙箱設(shè)計(jì)了32位和64位兩種進(jìn)程寝贡,在所有windows7和windows10之間的所有操作系統(tǒng)版本都被測(cè)試過(guò)圃泡。
沙箱在進(jìn)程級(jí)粒度進(jìn)行運(yùn)作。凡是需要沙箱化的任何東西需要放到獨(dú)立進(jìn)程里運(yùn)行澡匪。最小化沙箱配置有兩個(gè)過(guò)程:一個(gè)是被成為broker的權(quán)限控制器,以及被稱(chēng)為target的一個(gè)或多個(gè)沙箱化進(jìn)程甫匹。在整個(gè)文檔和代碼中這兩個(gè)詞有著上述兩種精確的內(nèi)涵兵迅。沙箱是一個(gè)必須被鏈接到broker和target可執(zhí)行程序的靜態(tài)庫(kù)恍箭。
broker進(jìn)程
在Chromium中扯夭,broker總是瀏覽進(jìn)程交洗。broker构拳,廣泛概念里斗埂,是一個(gè)權(quán)限控制器蜜笤,沙箱進(jìn)程活動(dòng)的管理員把兔。broker進(jìn)程的責(zé)任是:
- 指定每個(gè)目標(biāo)進(jìn)程中的策略
- 生成目標(biāo)進(jìn)程
- 維護(hù)沙箱策略引擎服務(wù)
- 維護(hù)沙箱攔截管理器
- 維護(hù)沙箱IPC服務(wù)(與target進(jìn)程的通信)
- 代表目標(biāo)進(jìn)程執(zhí)行策略允許的操作。
broker應(yīng)該始終比所有它生成的目標(biāo)進(jìn)程還要活的久暖混。沙箱IPC是一種低級(jí)別的機(jī)制(與ChromiumIPC機(jī)制不同)晾咪,這些調(diào)用會(huì)被策略評(píng)估贮配。策略允許的調(diào)用會(huì)由broker執(zhí)行谍倦,結(jié)果會(huì)通過(guò)同樣的IPC返回給目標(biāo)進(jìn)程。攔截管理器是為應(yīng)該通過(guò)IPC轉(zhuǎn)發(fā)給broker的windows API調(diào)用提供補(bǔ)丁泪勒。
目標(biāo)進(jìn)程
在Chromium中昼蛀,渲染器總是target進(jìn)程,除非瀏覽進(jìn)程被指定了--no-sandbox命令行參數(shù)圆存。target進(jìn)程維護(hù)所有將在沙箱中允許的代碼叼旋,以及沙箱基礎(chǔ)設(shè)施的客戶端:
- 所有代碼沙箱化
- 沙箱IPC客戶端
- 沙箱策略引擎客戶端
- 沙箱攔截
第2,3,4條是沙箱庫(kù)的一部分,與需要被沙箱化的代碼關(guān)聯(lián)沦辙。
攔截器(也稱(chēng)為hook)是通過(guò)沙箱轉(zhuǎn)發(fā)的Windows API調(diào)用油讯。由broker重新發(fā)出API 調(diào)用,并返回結(jié)果或者干脆終止調(diào)用隅俘。攔截器+IPC機(jī)制不能提供安全性蒙畴;它的目的是在沙箱中的代碼因沙箱限制不能修改時(shí)蹬音,提供兼容性永部。為了節(jié)省不必要的IPC凫佛,在進(jìn)行IPC調(diào)用前毫炉,target中進(jìn)程策略也會(huì)被評(píng)估,盡管這不是用作安全保障趾疚,但這僅僅是一個(gè)速度優(yōu)化魄缚。
期望在未來(lái)大部分plugin會(huì)運(yùn)行在target進(jìn)程里咆瘟。
沙箱限制
在它的核心桩皿,沙箱依賴(lài)于4個(gè)Windows提供的機(jī)制:
- 限定的令牌
- Windows工作對(duì)象
- Windows桌面對(duì)象
- Windows Vista及以上:集成層
這些機(jī)制在保護(hù)操作系統(tǒng),操作系統(tǒng)的限制苞氮,用戶提供的數(shù)據(jù)上相當(dāng)?shù)母咝萁遥疤崾牵?/p>
- 所有可以安全化的資源都有一個(gè)比null更好的安全描述符。換言之刮便,沒(méi)有關(guān)鍵資源會(huì)有錯(cuò)誤的安全配置谆沃。
- 計(jì)算機(jī)并未被惡意軟件所損害据沈。
- 第三方軟件不能弱化系統(tǒng)安全孔祸。
** 注意:上面具體的措施以及在內(nèi)核外的措施會(huì)在下面的“進(jìn)程輕量化”部分闡述。**
令牌
其他類(lèi)似的沙箱項(xiàng)目面臨的一個(gè)問(wèn)題是,限制程度應(yīng)當(dāng)如何,才能使得令牌和作業(yè)同時(shí)還保持有正常的功能永票。在Chromium沙箱里臭埋,對(duì)于Windows XP最嚴(yán)格的令牌如下:
普通組
登錄 SID : 強(qiáng)制
其他所有SID : 僅拒絕, 強(qiáng)制
限制組
S-1-0-0 : 強(qiáng)制
特權(quán)
無(wú)
正如上面所述的警告募胃,如果操作系統(tǒng)授予了這樣一個(gè)令牌,幾乎不可能找到存在的資源状勤。只要磁盤(pán)根目錄有著非空的安全性,即使空安全的文件也不能被訪問(wèn)日缨。在Vista中,最嚴(yán)格的令牌也是這樣的盅蝗,但它也包括了完整性級(jí)別較低的標(biāo)簽故痊。Chromium渲染器通常使用這種令牌,這意味著渲染器進(jìn)程使用的大部分資源已經(jīng)由瀏覽器獲取,并且他們的句柄被復(fù)制到了渲染器進(jìn)程中岂膳。
注意,令牌不是從匿名令牌或來(lái)賓令牌而來(lái)的,它繼承自用戶的令牌候址,因此與用戶的登錄相關(guān)聯(lián)既鞠。因此荆萤,系統(tǒng)或域名擁有的任何備用的審計(jì)仍然可以使用链韭。
根據(jù)設(shè)計(jì)旋讹,沙箱令牌不能保護(hù)下面這些不安全資源:
- 掛載的FAT或FAT32卷: 它們上面的安全描述符是有效空。在target中運(yùn)行的惡意軟件可以讀寫(xiě)這些磁盤(pán)空間瓦糕,因?yàn)閻阂廛浖梢圆聹y(cè)或者推出出它們的路徑。
- TCP/IP: Windows 200和Windows XP(但在Vista中不會(huì))中的TCP/IP socket的安全是有效空。使得惡意代碼與任何主機(jī)收發(fā)網(wǎng)絡(luò)包成為可能。
關(guān)于Windows 令牌對(duì)象的更多信息可以在底部參考文獻(xiàn)[02]查看壹蔓。
作業(yè)對(duì)象
target進(jìn)程也運(yùn)行著一個(gè)作業(yè)對(duì)象趟妥。使用這個(gè)Windows機(jī)制,一些有趣的佣蓉,不擁有傳統(tǒng)對(duì)象或者不關(guān)聯(lián)安全描述符的全局限制可以被強(qiáng)制執(zhí)行:
- 禁止用SystemParametersInfo()做用戶共享的系統(tǒng)范圍的修改披摄,這可以用于切換鼠標(biāo)按鈕或者設(shè)置屏幕保護(hù)程序超時(shí)
- 禁止創(chuàng)建或修改桌面對(duì)象
- 禁止修改用戶共享的顯示設(shè)置,比如分辨率和主顯示器
- 禁止讀寫(xiě)剪貼板
- 禁止設(shè)置全局Windows hook(使用SetWindowsHookEx())
- 禁止訪問(wèn)全局原子表
- 禁止訪問(wèn)在作業(yè)對(duì)象外創(chuàng)建的USER句柄
- 單活躍的進(jìn)程限制(不允許創(chuàng)建子進(jìn)程)
Chromium渲染器在激活所有這些限制的情況下允許偏螺。每個(gè)渲染器運(yùn)行在自己的作業(yè)對(duì)象里行疏。使用作業(yè)對(duì)象,沙箱可以(但當(dāng)前還不行)避免:
- 過(guò)度使用CPU周期
- 過(guò)度使用內(nèi)存
- 過(guò)度使用IO
有關(guān)Windows作業(yè)對(duì)象的詳細(xì)信息可以在底部參考文獻(xiàn)[1]中找到套像。
額外的桌面對(duì)象
令牌和作業(yè)對(duì)象定義來(lái)一個(gè)安全邊界:即酿联,所有的進(jìn)程有著相同的令牌,同一個(gè)作業(yè)對(duì)象中所有進(jìn)程也處于同樣的安全上下文。然而贞让。一個(gè)難以理解的事實(shí)是相同桌面上都有窗口上的應(yīng)用程序也處于相同的安全上下文中周崭,因?yàn)槭瞻l(fā)window消息是不受任何安全檢查。通過(guò)桌面對(duì)象發(fā)送消息是不允許的喳张。這是臭名昭著的“shatter”攻擊的來(lái)源续镇,也是服務(wù)不應(yīng)該在交互桌面上托管窗口的原因。Windows桌面是一個(gè)常規(guī)的內(nèi)核對(duì)象销部,它可以被創(chuàng)建然后分配一個(gè)安全描述符摸航。
在標(biāo)準(zhǔn)Windows安裝中,至少兩個(gè)桌面會(huì)與交互窗口站相關(guān)聯(lián)舅桩,一個(gè)是常規(guī)(默認(rèn))桌面酱虎,另一個(gè)是登錄桌面。沙箱創(chuàng)建了第三個(gè)與所有target進(jìn)程關(guān)聯(lián)的桌面擂涛。這個(gè)桌面永遠(yuǎn)不可見(jiàn)读串,也不可交互,它有效地隔離了沙箱化進(jìn)程撒妈,使其不能窺探用戶的交互恢暖,不能在更多特權(quán)的環(huán)境下發(fā)送消息到Windows。
額外的桌面對(duì)象唯一的優(yōu)點(diǎn)是它從一個(gè)隔離的池使用接近4MB的內(nèi)存狰右,在Vista里可能更多杰捂。
信用等級(jí)
信用等級(jí)在Windows Vista及其之后的版本可用。它們不會(huì)用嚴(yán)格的方式定義安全的邊界挟阻,但他們確實(shí)提供了一種強(qiáng)制訪問(wèn)控制(MAC)琼娘,并且作為微軟IE沙箱的基礎(chǔ)而存在。
信用等級(jí)由一個(gè)特殊的SID和ACL對(duì)的集合實(shí)現(xiàn)附鸽,它們代表了五種遞增等級(jí):不受信任的脱拼,低級(jí)的,中級(jí)的坷备,高級(jí)的熄浓,系統(tǒng)的。如果一個(gè)對(duì)象處于比請(qǐng)求令牌更高級(jí)的信用等級(jí)省撑,訪問(wèn)它就會(huì)受限赌蔑。信用等級(jí)也實(shí)現(xiàn)了用戶界面權(quán)限隔離,這種隔離應(yīng)用了信用等級(jí)規(guī)則竟秫,讓同一個(gè)桌面中的不同進(jìn)程可用交換窗口消息娃惯。
默認(rèn)情況下,令牌可以讀高信用等級(jí)的對(duì)象肥败,但不能寫(xiě)趾浅。大多數(shù)桌面應(yīng)用運(yùn)行在中信用等級(jí)(MI)愕提,而較不受信任的進(jìn)程像IE保護(hù)模式和我們自己的沙箱運(yùn)行在低信用等級(jí)(LI)。一個(gè)低信用等級(jí)模式的令牌只可以訪問(wèn)下面這些共享資源:
- 對(duì)大部分文件可以做讀訪問(wèn)
- 對(duì)%USER PROFILE%皿哨、AppData浅侨、LocalLow目錄的寫(xiě)訪問(wèn)
- 讀注冊(cè)表的大部分內(nèi)容
- 對(duì)HKEY_CURRENT_USER\Software\AppDataLow目錄做寫(xiě)訪問(wèn)
- 剪貼板(為某些格式做復(fù)制粘貼)
- 遠(yuǎn)程過(guò)程調(diào)用(RPC)
- TCP/IP Socket
- 通過(guò)ChangeWindowMessageFilter暴露窗口消息
- 通過(guò)LI標(biāo)簽共享內(nèi)存
- 擁有LI啟動(dòng)激活的權(quán)限,訪問(wèn)COM接口
- 通過(guò)LI標(biāo)簽暴露的命名管道
你會(huì)注意到之前描述的令牌屬性证膨,工作對(duì)象如输,額外的桌面限制性更大,并且事實(shí)上會(huì)阻礙對(duì)上面列出的所有東西的訪問(wèn)央勒。所以不见,信用等級(jí)比其他措施更寬松,但這也可以被視為一種對(duì)深度防御的否定崔步,并且脖祈,它的使用對(duì)性能或者資源使用不會(huì)有明顯的影響。
更多關(guān)于信用等級(jí)的信息可以在底部參考文獻(xiàn)[03]找到刷晋。
進(jìn)程輕量化策略
大多數(shù)進(jìn)程輕量化策略可以可以通過(guò)SetProcessMitigationPolicy方法應(yīng)用于Mtarget進(jìn)程。沙箱使用這個(gè)API為target進(jìn)程設(shè)置不同的各種策略慎陵,以強(qiáng)化安全特性眼虱。
重定位圖像:
- >= Win8
- 在進(jìn)程中對(duì)所有圖片做隨機(jī)地址加載(ASLR)(必須被所有圖片支持)
堆之終結(jié):
- >= Win8
- 結(jié)束Windows堆占用進(jìn)程
自底向上ASLR:
- >= Win8
- 設(shè)置隨機(jī)的下界作為進(jìn)程的最小用戶地址
高熵值A(chǔ)SLR:
- >= Win8
- 為自底向上ASLR增加隨機(jī)等級(jí)到1TB。
嚴(yán)格句柄檢查:
- >= Win8
- 對(duì)于惡意句柄引用立即拋出異常
Win32k.sys鎖定:
- >= Win8
- ProcessSystemCallDisablePolicy席纽,允許選擇性關(guān)閉target進(jìn)程可用的系統(tǒng)調(diào)用
- 渲染器進(jìn)程現(xiàn)在把這個(gè)功能設(shè)置到了DisallowWin32kSystemCalls上捏悬,這意味著win32k.sys用戶模式的調(diào)用不再被允許。這極大地減少了來(lái)自渲染器的可用的內(nèi)核攻擊润梯。查看這里獲取更多細(xì)節(jié)过牙。
App容器(Low Box Token):
>= Win8
在Windows里,這由內(nèi)核層的一個(gè)Low Box Token實(shí)現(xiàn)纺铭,它是有著限制優(yōu)先權(quán)(通常只有SeChangeNotifyPrivilege和 SeIncreaseWorkingSetPrivilege)的一個(gè)剝離版本寇钉,運(yùn)行在低信用等級(jí),這個(gè)容器還由一組“能力”實(shí)現(xiàn)舶赔,它們可以映射到進(jìn)程允許/拒絕做的事情(查看MSDN獲取更詳細(xì)的描述)扫倡。從沙箱角度看,最有趣的能力是否決是對(duì)網(wǎng)絡(luò)的訪問(wèn)竟纳,如果令牌是Low Box Token撵溃,INTERNET_CLIENT能力沒(méi)有出現(xiàn)的話,就會(huì)執(zhí)行網(wǎng)絡(luò)檢查锥累。
因此沙箱對(duì)已有的限制令牌缘挑,添加了Low Box相關(guān)的屬性,并且不授予任何能力桶略,以獲得沒(méi)有來(lái)自沙箱化進(jìn)程的網(wǎng)絡(luò)訪問(wèn)這樣的額外的網(wǎng)絡(luò)保護(hù)语淘。
禁用字體加載:
- >= Win10
- ProcessFontDisablePolicy
禁用遠(yuǎn)程設(shè)備圖像加載:
- >= Win10 TH2
- ProcessImageLoadPolicy
- 例:網(wǎng)絡(luò)資源的UNC路徑
禁用“強(qiáng)制低信用等級(jí)”的圖像加載:
- >= Win10 TH2
- ProcessImageLoadPolicy
- 例:臨時(shí)Internet文件
禁用額外的子進(jìn)程創(chuàng)建:
- >= Win10 TH2
- 如果作業(yè)等級(jí)<= JOB_LIMITED_USER诲宇,用UpdateProcThreadAttribute()設(shè)置PROC_THREAD_ATTRIBUTE_CHILD_PROCESS_POLICY為PROCESS_CREATION_CHILD_PROCESS_RESTRICTED。
- 這是額外層面的防御亏娜,使得作業(yè)層可以從外部打破焕窝。[引用: ticket, Project Zero blog.]
其他警告
操作系統(tǒng)可能有一些bug。令人感興趣的是Windows API中允許跳過(guò)常規(guī)安全檢查的一些bug维贺。如果存在這樣的bug它掂,惡意軟件能夠穿透安全限制,broker策略溯泣,并且可能危害計(jì)算機(jī)虐秋。在Windows環(huán)境下,沒(méi)有實(shí)用的方式可以避免沙箱中的代碼調(diào)用系統(tǒng)服務(wù)垃沦。
另外客给,第三方軟件,尤其是反病毒解決方案肢簿,可能創(chuàng)建新的攻擊角度靶剑。最麻煩的是為了使用一些(通常是系統(tǒng)不愿其使用的)功能,注入動(dòng)態(tài)鏈接庫(kù)的應(yīng)用程序池充。這些動(dòng)態(tài)鏈接庫(kù)也會(huì)注入到沙箱進(jìn)程中桩引。在最好的情況下,他們會(huì)產(chǎn)生故障收夸,在最糟的情況下坑匠,可能為其他進(jìn)程或文件系統(tǒng)本身造出后門(mén),讓精心設(shè)計(jì)的惡意軟件逃離沙箱卧惜。
沙箱策略
應(yīng)用與target進(jìn)程的真實(shí)限制通過(guò)策略設(shè)置厘灼。這些策略只是一種broker調(diào)用的編程接口,它們定義了限制與權(quán)限咽瓷。四個(gè)函數(shù)控制這種限制设凹,對(duì)應(yīng)四種Windows機(jī)制:
- TargetPolicy::SetTokenLevel()
- TargetPolicy::SetJobLevel()
- TargetPolicy::SetIntegrityLevel()
- TargetPolicy::SetDesktop()
前三個(gè)調(diào)用接收從非常嚴(yán)格到非常寬松的整數(shù)等級(jí)參數(shù),例如令牌有七個(gè)等級(jí)忱详,作業(yè)有五個(gè)等級(jí)围来。Chromium渲染器通常運(yùn)行四種機(jī)制中最嚴(yán)格的模式。最后匈睁,桌面策略有兩種监透,只能用于表示一個(gè)target進(jìn)程是否運(yùn)行在額外的桌面對(duì)象中。
這些限制是粗糙設(shè)計(jì)的航唆,因?yàn)樗鼈儠?huì)影響目標(biāo)可訪問(wèn)的所有可保護(hù)資源胀蛮,但有時(shí)我們需要更精細(xì)粒度的分辨能力。沙箱策略接口允許broker指定例外的情況糯钙。一個(gè)例外是粪狼,在target中發(fā)出特定Windows API調(diào)用退腥,將其代理給broker的方式。broker可以檢查參數(shù)再榄,使用不同的參數(shù)重新發(fā)出調(diào)用狡刘,或者干脆拒絕調(diào)用。為了指定例外情況困鸥,需要有一個(gè)獨(dú)立的調(diào)用:AddRule⌒崾撸現(xiàn)在支持以下幾種針對(duì)不同的Windows子系統(tǒng)的規(guī)則:
*文件
*命名管道
*進(jìn)程創(chuàng)建
*登記
*同步對(duì)象
每種子系統(tǒng)的具體形式各不相同,但通常規(guī)則會(huì)基于字符串模式得到觸發(fā)疾就。例如澜术,一種可能的文件規(guī)則是:
AddRule(SUBSYS_FILES, FILES_ALLOW_READONLY, L"c:\\temp\\app_log\\d*.dmp")
這個(gè)規(guī)則指定了當(dāng)一個(gè)target進(jìn)程想要打開(kāi)文件時(shí),可以授予的權(quán)限猬腰,以及匹配字符串格式的文件的只讀權(quán)限鸟废;例如 c:\temp\app_log\domino.dmp是一個(gè)滿足上面那種格式的文件。查詢(xún)頭文件可以獲得最新支持的對(duì)象與行為的列表姑荷。
規(guī)則只能在每個(gè)進(jìn)程產(chǎn)生前添加盒延,當(dāng)target運(yùn)行時(shí)不能修改,但不同的target可以有不同的規(guī)則鼠冕。
Target引導(dǎo)
Target不會(huì)從策略定義的限制開(kāi)始執(zhí)行兰英。他們從與常規(guī)用戶進(jìn)程擁有的令牌非常接近的一個(gè)令牌開(kāi)始執(zhí)行。因?yàn)樵谶M(jìn)程引導(dǎo)的過(guò)程中供鸠,操作系統(tǒng)加載器會(huì)訪問(wèn)大量的資源,其中大部分是未認(rèn)證且隨時(shí)會(huì)變化的陨闹。另外楞捂,大部分應(yīng)用程序使用標(biāo)準(zhǔn)開(kāi)發(fā)工具提供的標(biāo)準(zhǔn)CRT,在進(jìn)程得到引導(dǎo)后趋厉,CRT也需要初始化寨闹,這時(shí)CRT初始化的內(nèi)部再次變成未認(rèn)證狀態(tài)了。
因此君账,在引導(dǎo)階段繁堡,進(jìn)程實(shí)際上使用了兩種令牌:鎖定令牌,也是進(jìn)程令牌乡数,還有初始令牌椭蹄,被設(shè)置為初始線程的模擬令牌。事實(shí)上净赴,真正的SetTokenLevel定義是:
SetTokenLevel(TokenLevel initial, TokenLevel lockdown)
在所有的初始化操作完成后绳矩,main()或WinMain()會(huì)繼續(xù)執(zhí)行,還有兩個(gè)令牌會(huì)存活玖翅,但只有初始線程可以使用更強(qiáng)大的那個(gè)初始令牌翼馆。target的責(zé)任是在準(zhǔn)備完成后銷(xiāo)毀初始令牌割以。通過(guò)下面這個(gè)簡(jiǎn)單的調(diào)用實(shí)現(xiàn):
LowerToken()
在target聲明這個(gè)調(diào)用之后,唯一可用的令牌是鎖定令牌应媚,完整的沙箱限制開(kāi)始生效严沥。這個(gè)調(diào)用不可以撤銷(xiāo)。注意初始令牌是一個(gè)模擬令牌中姜,它只對(duì)主線程有效消玄,target進(jìn)程創(chuàng)建的其他線程只使用鎖定令牌,因此不會(huì)嘗試獲取任何需要安全檢查的系統(tǒng)資源扎筒。
target始于特權(quán)令牌的事實(shí)簡(jiǎn)化了顯式策略莱找,因?yàn)槿魏翁貦?quán)相關(guān)的需要在進(jìn)程啟動(dòng)時(shí)一次完成的東西,可用在LowerToken()調(diào)用前完成嗜桌,并且不需要在策略中設(shè)置規(guī)則奥溺。
重要
請(qǐng)確保初始令牌獲取的任何敏感操作系統(tǒng)句柄在調(diào)用LowerToken()前關(guān)閉。任何泄露的句柄可能被惡意軟件利用以逃離沙箱骨宠。
參考文獻(xiàn)
[01] Richter, Jeffrey "Make Your Windows 2000 Processes Play Nice Together With Job Kernel Objects"
http://www.microsoft.com/msj/0399/jobkernelobj/jobkernelobj.aspx
[02] Brown, Keith "What Is a Token" (wiki)
http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook/WhatIsA令牌.htm
[03] Windows Integrity Mechanism Design (MSDN)