【发布时间】:2012-03-28 17:18:16
【问题描述】:
似乎从 Windows Vista 开始,具有较低完整性级别 (IL) 的进程无法将消息发送到具有较高完整性级别的进程。从安全的角度来看,这是有道理的,但它破坏了我们的一些进程间通信。
不幸的是,我们有一个遗留应用程序(进程 A)必须以提升的“管理员”权限运行(通过将其快捷方式设置为始终以管理员身份运行来完成)。有时它需要实例化一个单独的应用程序(进程 B)。结果,进程 B 继承了与进程 A 相同的提升特权(和 IL)。问题就在这里。进程 B 的其他独立实例可能没有具有提升的权限,并且所有这些进程 B 实例都需要能够相互发送消息。如果进程 B 的一个实例被提升而另一个没有被提升,这显然会失败。
我知道我们可以使用ChangeWindowMessageFilter API 方法在 UIPI 消息过滤器中打开漏洞,但这似乎不是理想的解决方案。相反,我更愿意让进程 A 生成具有降低权限的进程 B,特别是这样它就可以与其他进程 B 实例进行通信。我认为默认情况下,其他进程 B 实例在“中”IL 上运行,因此我希望进程 A 使用相同的 IL 生成进程 B 实例。
我的搜索使我找到了 CreateProcessAsUser 和 CreateRestrictedToken API 方法,但尽管有这些文档,但令牌和安全描述符等的所有方面仍然让我很困惑。
我在这里也遇到了一些线程(Running a process with lowest possible privileges in winapi 和Dropping privileges in C++ on Windows),但我找不到任何好的代码示例。
谁能提供一些简单但“正确”的代码来帮助我使用适当的 Windows IL 生成子进程?具体来说,我想要一个示例,说明如何获取现有的 Process A 令牌并对其进行转换,使其具有降低的特权(我很确定我可以弄清楚其余的)。我真的不清楚在修改它之前是否需要复制进程的令牌。
【问题讨论】:
-
是否可以在非提升上下文中运行代理进程?如果是这样,您可以根据需要让代理进程代表进程 A 启动进程 B,或者让进程 A 从代理进程中获取令牌并使用它来启动进程 B。
-
@HarryJohnston – 我在其他地方读到过类似的解决方案,所以它肯定看起来可行。但是,除非这第三个代理进程 (C) 已经在运行(独立于进程 A),否则我们将回到第一步(如何使用较低权限运行单独的进程)。如果进程 C 正在运行,那么它可能必须在用户登录的整个过程中都在运行,我宁愿避免这种情况。
CreateRestrictedToken似乎是专门为这种和类似类型的情况提供的,那么我们如何才能删除令牌的 IL?
标签: c++ windows security winapi