我正在尝试以非常受限制的模式运行program.exe(Windows)。这意味着program.exe应该可以访问五个.txt文件,而没有其他权限,如启动新进程,关闭,编辑其他文件等。
我花了一个月的时间试图实现它,但仍然没有结果。我尝试将其作为受限用户运行:runas /trustlevel:10000 "program.exe"
,然后添加权限:icacls program.exe /grant *S-1-5-12:F
但似乎这样的用户仍然拥有一些权利,因为他可以运行notepad.exe和explorer.exe,这在我的情况下是不可接受的。我也使用CreateProcessAsUser()winapi函数,但它导致相同的结果。
所以我的问题是:如何运行具有此限制的program.exe,也许我应该创建有限制的新用户?怎么样?
感谢您的帮助,我已经写了这段代码:
hToken = NULL;
OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
SID_AND_ATTRIBUTES sidsToDisable;
ConvertStringSidToSid(L"S-1-1-0", &sidsToDisable.Sid);
sidsToDisable.Attributes = NULL;
SID_AND_ATTRIBUTES sidsToRestrict;
ConvertStringSidToSid(L"S-1-1-0", &sidsToRestrict.Sid);
sidsToRestrict.Attributes = NULL;
CreateRestrictedToken(hToken,NULL,1,&sidsToDisable,0,NULL,1,&sidsToRestrict,&hToken);
PROCESS_INFORMATION pi;
if (CreateProcessAsUser(hToken, wszPath, NULL, NULL, NULL,TRUE, CREATE_NEW_CONSOLE /*| CREATE_SUSPENDED*/, NULL, NULL, &si, &pi))
{
//...
//ok process created
}
但它不起作用。 0xc0000022错误始终发生,或者使用admin SID时为0xc00000142。当我通过SaferComputeTokenFromLevel()创建hToken时,它工作正常。我做错了什么?
答案 0 :(得分:0)
彻底的沙箱believed to be impossible.另请参阅linked PDF。
如果这需要强大,那么您唯一的选择就是完全成熟的VM。当然,如果沙盒应用程序必须是Windows可执行文件,则会产生许可证。
如果它不需要那么强大,那么原则上应该可以把一些可能就足够的东西放在一起。您需要管理权限才能执行此操作,但系统服务可以代表非特权用户启动沙盒应用程序。
我认为,困难的部分将是创造一个合适的标记。我认为理想情况下,您需要一个具有唯一登录会话SID的令牌,但没有其他任何东西。
使用LSA API可能是最好的方法,因为它允许您合成任意令牌,但它很复杂,并且没有很好的文档记录。
您可以尝试复制和/或修改从ImpersonateAnonymousToken获取的令牌,但我不确定是否可以包含唯一的登录会话SID。
将LogonUser(针对为此目的创建的用户帐户)与CreateRestrictedToken组合应该既简单又充足。这可能是开始的地方。
您还应该确保the integrity level for the token is suitably low。我认为S-1-16-0
或S-1-16-1
是可能的最低级别。
您需要为沙盒进程创建一个新的窗口工作站。这就是我们需要登录会话SID的原因,因此我们可以将令牌权限授予窗口站。否则,该过程将无法运行。
如果进程生成GUI,您将不得不以某种方式远程访问它。理想情况下,您可以修改进程本身,以便GUI部分是独立的,不需要沙盒化。如果做不到这一点,原则上应该可以从沙盒桌面复制位图,并将鼠标点击和击键转发回来。我不确定这会有多可靠。
要防止沙盒进程启动子进程,请将其放在作业对象中。您可以将作业的活动进程限制设置为1,以防止创建子进程。 (这不是真正必要的IMO,因为子进程将具有与父进程相同的所有限制,但可以完成。)
你最后的评论表明,也许你甚至不需要这种稳健性。如果是这样,您可以通过在用户自己的桌面和窗口站中运行该过程来省去远程处理GUI的麻烦。
您仍然需要生成合适的令牌,但您可能不需要使用单独的用户帐户和登录会话;如果是这样,CreateRestrictedToken就足够了。您可以使用交互式用户自己的令牌作为源。
您仍然需要降低令牌的完整性级别,以防止粉碎攻击。
您仍然可以使用作业对象来阻止子进程的启动。
JOBOBJECT_BASIC_UI_RESTRICTIONS可用于提供某种程度的保护,防止对用户界面的攻击。</ p>
在这种情况下,您甚至可能不需要管理员权限。我不确定。
此方法不足以运行潜在的恶意可执行文件,但如果沙箱仅作为备份预防措施,则可能就足够了。