如何创建具有较低完整性等级(IL)的新流程?

时间:2012-03-28 17:18:16

标签: c++ windows security winapi

从Windows Vista开始,具有较低完整性级别(IL)的进程似乎无法向具有更高完整性级别的进程发送消息。从安全角度来看,这是有道理的,但它打破了我们的一些进程间通信。

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

我知道我们可以使用ChangeWindowMessageFilter API方法在UIPI消息过滤器中打开漏洞,但这似乎不是理想的解决方案。相反,我宁愿让进程A生成具有降低权限的进程B,特别是它可以与其他进程B实例进行通信。我认为默认情况下,其他进程B实例在“中”IL运行,因此我希望进程A使用相同的IL生成进程B实例。

我的搜索引导我使用CreateProcessAsUserCreateRestrictedToken API方法,但是尽管有这些文档,令牌和安全描述符的各个方面对我来说仍然非常混乱。

我在这里也遇到了一些线程(Running a process with lowest possible privileges in winapiDropping privileges in C++ on Windows),但我找不到代码的好例子。

任何人都可以向我提供一些简单而“正确”的代码,这些代码可以帮助我使用适当的Windows IL生成子进程吗?具体来说,我想要一个如何获取现有Process A令牌并将其转换为具有降低权限的示例(我很确定我可以弄清楚其余的)。我真的不清楚在修改之前是否需要复制进程'令牌。

3 个答案:

答案 0 :(得分:9)

警告!虽然这种方法对于原始海报来说可能或多或少都没问题,但总的来说它并不是一个好主意。特别是,注意(根据评论主题)据报道,人工操作令牌会在更复杂的应用程序中引起问题,因此如果您使用它们,请务必坚持使用基本的Win32 API。当然还有潜在的安全隐患。

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


在MSDN的Designing Applications to Run at a Low Integrity Level文章中,用于启动低完整性过程的代码,类似于您的情况。

首先,您复制了流程令牌,因为您不能(或者至少不应该)使用已经使用的令牌。然后使用SetTokenInformation和TokenIntegrityLevel类来设置完整性级别。示例代码中似乎存在错误,因为低完整性级别的正确SID是S-1-16-4096而不是S-1-16-1024,但您仍然需要中等完整性级别,是S-1-16-8192。这些可以找到here

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

答案 1 :(得分:3)

我已经使用这里描述的方法来实现这一目标。基本思想是让Explorer为您运行进程B.由于Explorer通常以中等完整性级别运行,因此可以为您提供所需的内容。

http://brandonlive.com/2008/04/26/getting-the-shell-to-run-an-application-for-you-part-1-why/ http://brandonlive.com/2008/04/27/getting-the-shell-to-run-an-application-for-you-part-2-how/

第一个链接至少可以为您提供良好的背景。

  

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

更简洁的方法是将requestedExecutionLevel设置为清单。

答案 2 :(得分:-1)

我可能没有回答您的完整问题,但正如您提到的有关CreateProcessAsUser和CreateRestrictedToken的问题。我有一个使用此API的代码。我写的代码是基于以下内容编写的。

来源:[Windows Vista for Developers - 第4部分 - 用户帐户控制](http://weblogs.asp.net/kennykerr/Windows-Vista-for-Developers-1320-Part-4-1320-User-Account-Control)!

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

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