更安全的创建级别 SAFER_LEVELID_UNTRUSTED: 应用程序无法正确启动 (0xc0000142)

3
我试图使用SaferCreateLevelSAFER_LEVELID_UNTRUSTED安全级别启动一个进程(任何进程)作为“不受信任的”:

允许程序仅能访问已授权打开的公共组资源,阻止访问管理员超级用户权限和个人授权的权限。

使用Michael Howard关于DropMyRights MDSN文章中的代码(以管理员身份浏览网页和阅读电子邮件的安全性),伪代码如下:
//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我的应用程序标记为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的Safer级别出了什么问题——为什么我无法启动任何东西。

注意:在Windows 7上,如果你将calcnotepad标记为/setintegritylevel low,它们将无法启动(没有错误提示,只是从未出现),即使这篇MSDN文章提到了使用calc作为低完整性级别的测试

enter image description here

1个回答

2

0xc0000142 = STATUS_DLL_INIT_FAILED

也许Process Monitor可以给你一些线索?

UNTRUSTED 对于大多数事情来说可能过于严格了。例如,你无法访问自己的配置文件:

  • HKEY_CURRENT_USER
  • %temp%

你试过CONSTRAINED吗?

另一种选择是使用CreateRestrictedToken并计算一个刚好足够严格的令牌。

我猜MS几乎忘记了NT6中的Safer*Level函数,而我们得到了UAC。(在XP上的RunAs GUI对话框有保护我的计算机选项,但现在该对话框已经不存在了(即使在XP上,它对于大多数事情来说也过于严格))


我尝试过使用constrained,它可以工作,但是它也有比我想要的更多的权限。另一方面,untrusted似乎太过限制了。我猜想很可能没有一个更安全的级别与MandatoryIntegrityLevel\Low进程所给予的权限相匹配。 - Ian Boyd
嗯,我曾尝试使用进程监视器来弄清楚为什么 calc 不再以 Low 模式启动;我没有想到去查看为什么我的应用程序(可以作为 Low 启动)无法作为“受限制的”启动。可能所有这些都归结于不能使用任何 Safer 级别来模拟 Low 的限制。 - Ian Boyd
一个生成的进程会继承其父进程的完整性级别,除非用于生成该进程的令牌指定了其他级别。使用SaferComputeTokenFromLevel()创建一个 SAFER_LEVELID_NORMALUSER 令牌,然后使用 SetTokenInformation() 将该令牌的完整性级别设置为低。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接