【问题标题】:SaferCreateLevel SAFER_LEVELID_UNTRUSTED: The application was unable to start correctly (0xc0000142)SaferCreateLevel SAFER_LEVELID_UNTRUSTED:应用程序无法正确启动(0xc0000142)
【发布时间】:2011-09-20 11:18:47
【问题描述】:

我正在尝试使用 SaferCreateLevelSAFER_LEVELID_UNTRUSTED 更安全的级别将进程(任何进程)启动为“不受信任”:

只允许程序在访问授予开放知名组的资源的情况下执行,阻止访问 AdministratorPower User 权限和个人授予的权限。

使用 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)。

这是怎么回事?

注意:SAFER_LEVELID_NORMALUSER 启动一个进程可以正常工作:

允许程序以不具有 AdministratorPower User 用户权限的用户身份执行。软件可以访问普通用户可以访问的资源。

虽然现在每个人都已经以“普通用户”的身份运行,但它没有什么价值。


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

最终目标是以与 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

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

虽然我可能能够使用AddMandatoryAce API,或者自己摆弄安全令牌中的 ACL,但我很好奇UNTRUSTED 更安全的级别是怎么回事 - 以及为什么我无法获得任何东西发射。

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

【问题讨论】:

    标签: security winapi uac


    【解决方案1】:

    0xc0000142 = STATUS_DLL_INIT_FAILED

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

    UNTRUSTED 对于大多数事情来说可能过于受限。您无法访问自己的个人资料,例如:

    • HKEY_CURRENT_USER
    • %temp%

    你试过CONSTRAINED吗?

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

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

    【讨论】:

    • 我试过constrained;它可以工作,但它也有我想要的更多权限。另一方面,untrusted 似乎过于严格。我想很可能没有 Safer 级别与授予MandatoryIntegrityLevel\Low 进程的权限相匹配。
    • 嗯,我曾尝试过 Process Monitor,试图找出为什么 calc 不再以 Low 启动;我没有想过为什么我的应用程序(可以以Low 启动)未能以“受限”方式启动。可能所有这些都表明没有Safer 级别可以用来模仿Low 的限制。
    • 生成的进程继承其父进程的完整性级别,除非用于生成该进程的令牌另有说明。使用SaferComputeTokenFromLevel() 创建SAFER_LEVELID_NORMALUSER 令牌,然后使用SetTokenInformation() 将令牌的完整性级别设置为低。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2017-08-20
    • 1970-01-01
    • 2014-07-21
    • 2016-08-15
    • 2014-08-27
    相关资源
    最近更新 更多