SaferCreateLevel
和SAFER_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)。
这里发生了什么?
注意:在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
我的应用程序启动正确,并在低完整性级别下运行:
虽然我可能可以使用AddMandatoryAce
API,或者自己调整安全令牌中的ACL,但我很好奇UNTRUSTED
的Safer级别出了什么问题——为什么我无法启动任何东西。
注意:在Windows 7上,如果你将calc
或notepad
标记为/setintegritylevel low
,它们将无法启动(没有错误提示,只是从未出现),即使这篇MSDN文章提到了使用calc作为低完整性级别的测试。
constrained
,它可以工作,但是它也有比我想要的更多的权限。另一方面,untrusted
似乎太过限制了。我猜想很可能没有一个更安全的级别与MandatoryIntegrityLevel\Low
进程所给予的权限相匹配。 - Ian BoydLow
模式启动;我没有想到去查看为什么我的应用程序(可以作为Low
启动)无法作为“受限制的”启动。可能所有这些都归结于不能使用任何Safer
级别来模拟Low
的限制。 - Ian BoydSaferComputeTokenFromLevel()
创建一个SAFER_LEVELID_NORMALUSER
令牌,然后使用SetTokenInformation()
将该令牌的完整性级别设置为低。 - Remy Lebeau