【发布时间】:2011-09-20 11:18:47
【问题描述】:
我正在尝试使用 SaferCreateLevel 和 SAFER_LEVELID_UNTRUSTED 更安全的级别将进程(任何进程)启动为“不受信任”:
只允许程序在访问授予开放知名组的资源的情况下执行,阻止访问 Administrator 和 Power 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 启动一个进程可以正常工作:
允许程序以不具有 Administrator 或 Power 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 上,如果您将 calc 或 notepad 标记为 /setintegritylevel low,它们将无法启动(没有错误,只是永远不会出现),即使是 though this MSDN article talks about using calc as a test of low integrity level:
【问题讨论】: