我正在制作一個(gè)游戲,并思考如何使其可修改。通常,引擎出于各種原因使用腳本語(yǔ)言。其中之一是引擎可以控制mod看到的內(nèi)容,并可以為用戶提供一定程度的安全性,例如,不允許文件訪問或網(wǎng)絡(luò)訪問,或以某種方式對(duì)其進(jìn)行限制。
對(duì)于我的游戲,我想挖掘一下提供mod作為編譯DLL的可能性。從安全角度來看,這里的問題是,dll當(dāng)然可以包含任何代碼,因此我絕對(duì)不能控制文件/網(wǎng)絡(luò)等。dll代碼也可能損壞游戲的內(nèi)存。解決這個(gè)問題的一種方法是創(chuàng)建第二個(gè)進(jìn)程,該進(jìn)程沒有訪問磁盤/網(wǎng)絡(luò)的權(quán)限,只能使用主游戲進(jìn)程提供的API。內(nèi)存可以在進(jìn)程之間共享,但是在切換到mods進(jìn)程之前,頁(yè)面可以標(biāo)記為read-only,因此沒有機(jī)會(huì)損壞內(nèi)存。
是否有可能創(chuàng)建這樣一個(gè)基本上無法訪問系統(tǒng)的流程或可控子集?我正在考慮為windows API創(chuàng)建一個(gè)白名單,例如允許分配但不允許文件訪問。我能找到的所有關(guān)于安全性的文檔都是關(guān)于其他人可以對(duì)流程做什么,而不是流程本身可以做什么。
使用受限子進(jìn)程無疑是正確的方法,但是沒有一個(gè)API可以調(diào)用來實(shí)現(xiàn)這一點(diǎn)。
您可能應(yīng)該從
CreateRestrictedToken
開始,并盡可能地限制令牌。如果您是從頭開始設(shè)計(jì)的,您可能可以使用SaferComputeTokenFromLevel
來創(chuàng)建一個(gè)SAFER_LEVELID_UNTRUSTED
或更低級(jí)別的令牌,但并不是所有東西都能在這個(gè)級(jí)別上工作。將UAC完整性級(jí)別設(shè)置為低(或更低)(
TokenIntegrityLevel
)。理想情況下,您可以使用AppContainer,但API中這方面的文檔并不多。Google Chrome可能這樣做是為了讓你看看他們是如何做到的。您現(xiàn)在應(yīng)該創(chuàng)建一個(gè)作業(yè)對(duì)象,并至少使用
JobObjectBasicUIRestrictions
設(shè)置限制。現(xiàn)在是時(shí)候開始用
CreateProcessAsUser
暫停的進(jìn)程了。將進(jìn)程添加到作業(yè)中并恢復(fù)其執(zhí)行。
新進(jìn)程應(yīng)該做的第一件事是調(diào)用
SetProcessMitigationPolicy
。你如何與孩子溝通是孩子自己的問題。也許
CreateFileMapping
可以創(chuàng)建一個(gè)頁(yè)面文件支持的內(nèi)存區(qū)域。使用管道或事件來控制通信。