SaferCreateLevel SAFER_LEVELID_UNTRUSTED:应用程序无法正确启动(0xc0000142)

时间:2011-06-22 14:41:58

标签: security winapi uac

我正在尝试使用SaferCreateLevel SAFER_LEVELID_UNTRUSTED更安全的级别启动流程(任何流程)为“不信任”:

  

允许程序执行时只能访问授予开放知名群组的资源,阻止访问管理员高级用户权限以及个人授予的权限。

使用Michael Howards的代码DropMyRights MDSN文章(Browsing the Web and Reading E-mail Safely as an Administrator)伪代码是:

//get a handler on a Safer level
hSaferLevel = SaferCreateLevel(SAFER_SCOPEID_USER, SAFER_LEVELID_UNTRUSTED);

//Create a security token out of the safer level handle
hSecurityToken = SaferComputeTokenFromLevel(hSaferLevel);

//Create process as user
CreateProcessAsUser(hSecurityToken, "myapp.exe");

除了该过程无法启动:

  

应用程序无法正确启动(0xc0000142)。

enter image description here

这里发生了什么?

注意:SAFER_LEVELID_NORMALUSER处启动流程正常工作:

  

允许程序以没有管理员高级用户用户权限的用户身份执行。软件可以访问普通用户可访问的资源。

虽然现在每个人都已经作为“普通用户”运行,但它的价值却很小。


我的应用 能够处理以“低”用户身份运行。

最终目标是使用与 MandatoryIntegrity \ Low 进程相同的privelages运行该进程(尽管未标记为“低”)。所以我测试了那个。

我使用icacls标记my application to run Mandatory Integrity Level\Low

C:\Develop>icacls RTMS.exe /setintegritylevel Low
processed file: RTMS.exe
Successfully processed 1 files; Failed processing 0 files

我的应用程序正确启动,并且运行在低完整性级别:

enter image description here

虽然我可能能够使用AddMandatoryAce API,或者自己在安全令牌中使用ACL,但我很好奇UNTRUSTED更安全的级别 - 以及为什么我可以'得到任何东西发射。

注意:在Windows 7上,如果您将calcnotepad标记为/setintegritylevel low,它们将无法启动(无错误,只是永远不会出现),甚至though this MSDN article talks about using calc as a test of low integrity level

enter image description here

1 个答案:

答案 0 :(得分:1)

0xc0000142 = STATUS_DLL_INIT_FAILED

也许Process Monitor会给你一些线索?

对于大多数事情来说,{p> UNTRUSTED可能过于严格了。您无法访问自己的个人资料,例如:

  • HKEY_CURRENT_USER
  • %TEMP%

你试过CONSTRAINED吗?

另一种方法是使用CreateRestrictedToken并计算一个足够限制的令牌。

我猜MS在NT6中忘记了Safer * Level功能,我们得到了UAC。 (XP上的RunAs GUI对话框具有保护我的计算机选项,但该对话框现已消失(即使在XP中,大多数情况下都是too restrictive))