Windows 以非常受限的用户身份运行.exe

Windows 以非常受限的用户身份运行.exe,windows,cmd,sandbox,runas,Windows,Cmd,Sandbox,Runas,我正在尝试以非常受限的模式(Windows)运行program.exe。这意味着program.exe应该可以访问五个.txt文件,并且没有其他权限,例如启动新进程、关闭、编辑其他文件等 我花了一个月的时间试图实现它,但仍然没有结果。我尝试以受限用户身份运行它:runas/trustlevel:10000“program.exe”,然后添加了权限:icacls program.exe/grant*S-1-5-12:F 但似乎这样的用户仍然有一些权限,对于Instance,他可以运行notepad

我正在尝试以非常受限的模式(Windows)运行program.exe。这意味着program.exe应该可以访问五个.txt文件,并且没有其他权限,例如启动新进程、关闭、编辑其他文件等

我花了一个月的时间试图实现它,但仍然没有结果。我尝试以受限用户身份运行它:
runas/trustlevel:10000“program.exe”
,然后添加了权限:
icacls program.exe/grant*S-1-5-12:F
但似乎这样的用户仍然有一些权限,对于Instance,他可以运行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错误总是出现,或者使用管理员SID时出现0xc00000142错误。当我通过SaferComputeTokenFromLevel()创建hToken时,它可以正常工作。我做错了什么?

彻底的沙箱也可以看到

如果这需要健壮,那么您唯一的选择就是一个成熟的VM。当然,如果沙盒应用程序必须是Windows可执行文件,则会涉及到许可问题

如果它不需要那么健壮,原则上应该可以把足够的东西放在一起。这样做需要管理权限,但系统服务可以代表非特权用户启动沙盒应用程序

我认为,最困难的部分将是创造一个合适的代币。我认为理想情况下,您需要一个具有唯一登录会话SID的令牌,而不需要其他任何东西

  • 使用lsaapi可能是最好的方法,因为它允许您合成任意令牌,但它很复杂,并且没有很好的文档记录

  • 您可以尝试复制和/或修改从ImpersonateAnonymousToken获得的令牌,但我不确定是否可以包含唯一的登录会话SID

  • 将LogonUser(针对为此目的创建的用户帐户)与CreateRestrictedToken相结合应该既简单又充分。这可能是开始的地方

你也应该确保。我假设
S-1-16-0
S-1-16-1
是可能的最低级别

您需要为沙盒进程创建一个新的窗口站。这就是为什么我们需要登录会话SID,以便我们可以将令牌权限授予窗口站。否则,进程将无法运行

如果进程生成GUI,您将不得不以某种方式对其进行远程控制。理想情况下,您应该修改流程本身,以便GUI部分是独立的,不需要沙盒。如果做不到这一点,原则上应该可以从沙盒桌面复制位图,并将鼠标单击和按键返回到位图。我不确定这有多可靠

要防止沙盒进程启动子进程,请将其放入作业对象中。可以将作业的活动进程限制设置为1,以防止创建子进程。(这在IMO中并不是必需的,因为子进程与父进程具有相同的限制,但可以做到。)


您最后的评论表明,也许您甚至不需要这种级别的健壮性。如果是这样,您可以通过在用户自己的桌面和窗口站中运行该进程来避免远程处理GUI的麻烦

  • 您仍然需要生成合适的令牌,但可能不需要使用单独的用户帐户和登录会话;如果是这样,CreateRestrictedToken就足够了。您可以使用交互用户自己的令牌作为源

  • 您仍然需要降低令牌的完整性级别以防止破碎攻击

  • 您仍然可以使用作业对象来阻止启动子进程

  • JOBOBJECT_BASIC_UI_限制可用于针对用户界面上的攻击提供某种程度的保护

在这种情况下,您甚至可能不需要管理员访问权限。我不能马上确定


这种方法对于运行可能存在恶意的可执行文件来说不够健壮,但如果沙箱只是作为一种备份预防措施,那么它可能就足够了。

可能重复的“否”是不重复的。PsExec如何帮助我?您的要求,特别是禁止启动子进程的愿望,实际上并不构成“原始的“沙盒-这需要一个非常复杂的沙盒。我认为用standart Windows API创建这样的“沙盒”是可能的,我几乎可以肯定它在Linux中是可能的,而且更简单……哦,很好的解释!非常感谢你!但不幸的是,我需要这样的“沙箱”来运行潜在的恶意代码。我想在编程竞赛系统中使用它,这样用户可以提交任何代码,包括限制功能,这将导致“安全违规错误”。我在Windows中看到了一些系统,但不是开源的,所以这是可能的,但我不知道如何实现。也许他们使用了一些不同的方法?更可能的是,他们的工作不像他们希望您认为的那样可靠。但是,除非你有具体的理由认为你的竞争对手可能会攻击这个系统,否则你不需要一个特别强大的解决方案,只需要让他们这么做有点困难,我后面的建议应该这样做。让他们提交源代码,确保他们知道你将在一台单独的机器上记录每一次提交以备日后检查,确保你在一个非管理员帐户中运行整个过程,当你完成后,为了安全起见,核可并重新安装