2011-06-22 60 views
2

我试图启动一个进程(任何过程)为“不可信”使用SaferCreateLevelSAFER_LEVELID_UNTRUSTED安全级别:SaferCreateLevel SAFER_LEVELID_UNTRUSTED:应用程序无法正常启动(0xc0000142)

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

使用从迈克尔·霍华德的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流程相同的方式运行流程(虽然未标记为“低”)。所以我测试了一下。

我用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

0xc0000142 = STATUS_DLL_INIT_FAILED

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

UNTRUSTED对于大多数情况可能太受限制。您不能访问自己的个人资料,例如:

  • HKEY_CURRENT_USER
  • %TEMP%

你尝试CONSTRAINED

另一种替代方法是使用CreateRestrictedToken并计算一个足够严格的标记。

我猜测MS在NT6中忘记了安全*级别函数,而我们得到了UAC。 (XP上的RunAs GUI对话框有保护我的电脑选项,但该对话框现在不见了(即使在XP中,对于大多数情况来说,它也是too restrictive))

+0

我确实尝试过'constrained';它工作,但它也有我想要的更多权限。另一方面,'不可信'似乎太严格了。我想这是可以想象的,没有**安全**级别匹配权限提供了一个'MandatoryIntegrityLevel \ Low'过程。 –

+0

嗯,我已经尝试过程监视器,试图找出为什么** calc **不会作为'低'启动;我没有想到为什么我的应用程序(可以启动为“低”)未能作为“约束”启动。可能所有的事实都表明,没有“安全”级别可以用来模仿“低”的限制。 –

+0

产生的进程继承其父进程的完整性级别,除非用于产生进程的令牌另有说明。使用'SaferComputeTokenFromLevel()'创建'SAFER_LEVELID_NORMALUSER'标记,然后使用'SetTokenInformation()'将标记的完整性级别设置为低。 –

相关问题