【问题标题】:Run .exe as very restricted user以非常受限的用户身份运行 .exe
【发布时间】:2015-10-23 17:56:09
【问题描述】:

我正在尝试以非常受限的模式 (Windows) 运行 program.exe。这意味着 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,也许我应该创建有限制的新用户?怎么样?

P.S:基本上我想获得原始沙箱。
谢谢。


感谢您的帮助,我编写了以下代码:

            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 错误一直发生,或 0xc00000142 使用管理员 SID 时。当我通过 SaferComputeTokenFromLevel() 创建 hToken 时,它工作正常。我做错了什么?

【问题讨论】:

  • 不,它不是重复的。PsExec 如何帮助我?
  • 您的要求,尤其是禁止启动子进程的愿望,并不能真正构成“原始”沙箱——这需要相当复杂的沙箱。
  • 我认为可以使用标准的 Windows API 创建这样的“沙盒”,而且我几乎可以肯定它在 Linux 中是可能的,而且更容易......

标签: windows cmd sandbox runas


【解决方案1】:

彻底的沙盒化是believed to be impossible. 另请参阅linked PDF

如果这需要稳健,您唯一的选择是成熟的虚拟机。当然,如果沙盒应用程序必须是 Windows 可执行文件,这会涉及许可问题。

如果不需要那么健壮,原则上应该可以将一些足够的东西放在一起。您需要管理权限才能执行此操作,但系统服务可以代表非特权用户启动沙盒应用程序。

我认为最难的部分是创建一个合适的代币。我认为理想情况下,您需要一个具有唯一登录会话 SID 但没有别的令牌。

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

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

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

您还应该确保the integrity level for the token is suitably low。我会假设S-1-16-0S-1-16-1 是可能的最低级别。

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

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

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


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

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

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

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

  • JOBOBJECT_BASIC_UI_RESTRICTIONS 可用于提供一定程度的保护,防止对用户界面的攻击。

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

这种方法对于运行潜在的恶意可执行文件来说不够健壮,但如果沙盒仅用作备份预防措施,它可能就足够了。

【讨论】:

  • 哦,很好的解释!非常感谢!但不幸的是,我需要这样的“沙箱”来运行潜在的恶意代码。我想在编程竞赛系统中使用它,因此用户可以提交任何代码,包括可能导致“安全违规错误”的受限功能。我在windows看到了一些系统,但是没有开源,所以可以,但是不知道怎么弄。
  • 也许他们使用了一些不同的方法?
  • 更有可能的是,它们的工作可靠性不如您希望的那样。但是,除非您有特定的理由认为您的竞争对手可能会攻击系统,否则您不需要特别强大的解决方案,只要足以让他们这样做有点困难,我后面的建议应该这样做。让他们提交源代码,确保他们知道您将在单独的机器上记录每个提交以供以后检查,确保您在非管理员帐户中运行整个东西,完成后,核弹并重新安装到保持安全。
  • 我发现它很有趣link。你不知道 CreateRestrictedToken() 中的 SidsToDisable 和 SidsToRestrict 有什么区别吗?
  • SidsToDisable 做的很简单——您在访问令牌中指定 SID,然后禁用它们(将它们设置为仅拒绝)。 SidsToRestrict 更复杂,但如果它只包含访问令牌中的 SID,则效果是禁用所有除了这些 SID。但它也可以包含访问令牌中 not 的 SID,然后只有在 (1) 将根据访问令牌中启用的 SID 和 授予访问权限时才授予访问权限b> (2) 它将被授予仅包含受限 SID 的访问令牌。
猜你喜欢
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 2017-07-08
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
相关资源
最近更新 更多