如何创build一个更低的完整性级别(IL)的新stream程?

看起来,从Windows Vista开始,具有较低完整性级别(IL)的进程不能将消息发送到具有较高完整性级别的进程。 这从安全的angular度来看是有道理的,但是它打破了我们的一些进程间通信。

我们有遗留的应用程序(进程A),不幸的是必须以提升的“pipe理员”权限运行(通过将其快捷方式设置为始终以pipe理员身份运行来完成)。 有时它需要实例化一个单独的应用程序(过程B)。 因此,进程Binheritance了与进程A相同的提升权限(和IL)。存在这个问题。 可能还有其他独立的进程B实例没有提升权限,所有这些进程B实例都需要能够相互发送消息。 如果进程B的一个实例提升,另一个则不提升,这显然会失败。

我知道我们可以使用ChangeWindowMessageFilter API方法在UIPI消息filter中打开漏洞,但这看起来不是理想的解决scheme。 相反,我更愿意让Process A产生具有减less权限的进程B,特别是为了能够与其他进程B实例进行通信。 我想默认情况下,其他进程B实例运行在“中”IL,所以我想过程A产生与这个相同的IL过程B实例。

我的search引导我到CreateProcessAsUserCreateRestrictedToken API方法,但尽pipe有这个文档,所有的令牌和安全描述符等方面仍然让我感到困惑。

我也遇到了一些线程( 在winapi中运行一个具有最低权限的进程, 在Windows上运行C ++的权限 ),但是我找不到任何有代码的好例子。

任何人都可以提供一些简单但“正确”的代码,这将帮助我使用适当的Windows IL产卵subprocess? 具体来说,我想要一个如何采取现有的过程A令牌的例子,并将其转换,使其具有减less的权限(我敢肯定,我可以找出其余的)。 我还不清楚在修改之前是否需要复制进程的标记。

Solutions Collecting From Web of "如何创build一个更低的完整性级别(IL)的新stream程?"

警告! 虽然这种方法对于原始的海报可能或多或少是好的,但总的来说这并不是一个好主意。 特别是,注意(根据注释线程)人为操作的令牌已经被报告在更复杂的应用程序中引起问题,所以如果你正在使用它们,一定要坚持基本的Win32 API。 当然也有潜在的安全隐患。

在大多数类似于OP的场景中,最好用启动应用程序替换启动提升应用程序的快捷方式。 只要提升的应用程序正在运行,启动程序就可以保持运行,并为升高的应用程序提供自然有限的标记以用于启动非升高的进程。


在设计应用程序以在MSDN 中以低完整性级别运行文章中,有一些代码用于启动一个低完整性进程,这与您的情况类似。

首先,你复制进程标记,因为你不能(或者至少不应该)混淆已经被使用的标记。 然后用TokenIntegrityLevel类使用SetTokenInformation来设置完整性级别。 在示例代码中似乎有一个错误,因为对于低完整性级别,正确​​的SID是S-1-16-4096而不是S-1-16-1024,但是无论如何你需要中等完整性级别,即S -1-16-8192。 这些可以在这里找到。

一旦你有这个工作(也就是说,一旦你能够从你的高完整性过程启动中等完整性过程),你应该尝试使用CreateRestrictedToken来创建新的令牌,而不是DuplicateToken,并删除管理员令牌和所有权限(SeChangeNotifyPrivilege除外) 。 否则,新进程将具有中等完整性,但仍具有管理员权限,这可能会使在同一会话中运行的任何恶意代码更容易提升其权限。

我用这里描述的方法来完成这个。 基本的想法是让资源管理器为你运行进程B. 由于资源管理器通常以中等的完整性级别运行

http://brandonlive.com/2008/04/26/getting-the-shell-to-run-an-application-for-you-part-1-why/ http://brandonlive.com/2008/04/ 27 /获取最壳到运行的应用程序适合你部分-2技术/

第一个环节至少会给你一个好的背景。

我们有遗留的应用程序(进程A),不幸的是必须以提升的“管理员”权限运行(通过将其快捷方式设置为始终以管理员身份运行来完成)。

一个更干净的方法是将requestedExecutionLevel设置为清单。

我可能不会回答你完整的问题,但正如你所提到的有关CreateProcessAsUser和CreateRestrictedToken。 我有一个正在使用这个API的代码。 我写的代码是基于下面的写的。

来源:[Windows Vista的开发人员 – 第4部分 – 用户帐户控制]( http://weblogs.asp.net/kennykerr/Windows-Vista-for-Developers- 1320 – 部门4- 1320 –用户帐户控制 ) !

该代码可在以下链接中找到。

示例代码: http : //pastebin.com/XMUAehF9