请求的注册表允许访问而没有安全漏洞
Posted
技术标签:
【中文标题】请求的注册表允许访问而没有安全漏洞【英文标题】:Requested registry allow access without security leaks 【发布时间】:2018-04-19 15:13:37 【问题描述】:现在我正在使用一个带有代码的 Web 应用程序来读取和写入注册表。在 Visual Studio 中调试时一切正常,但在在线测试服务器上却没有运行。我得到的错误异常消息是:
System.Security.SecurityException:请求的注册表访问不是 允许。
这是我正在使用的代码:
private RegistryKey GetWritableBaseRegistryKey(string extendedPath)
var path = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
return RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default).OpenSubKey($"path\\extendedPath", true);
我在哪里找到的解决方案:
解决方案 1
您将无法将 AppPoolIdentity 设置为特定组,但是 你可以
创建本地用户 (compmgmt.msc)
将用户添加到管理员组 (compmgmt.msc)
在“高级设置”下将应用程序池设置为在该用户下运行。
显然你知道这是一个非常糟糕的主意 观点,并且永远不应该在前锋上执行 面对服务器。 source
解决方案 2
创建一个单独的控制台应用程序以在管理员中运行该服务 方式,以便您可以访问注册表。这个解决方案是性能 很重,因为您需要运行 2 个单独的应用程序。
解决方案 3
使用此代码允许访问注册表。
RegistryPermission perm1 = new RegistryPermission(RegistryPermissionAccess.AllAccess, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"); perm1.Demand();
或者这个代码
RegistrySecurity rs = new RegistrySecurity(); string currentUserStr = Environment.UserDomainName + "\\" + Environment.UserName; RegistryAccessRule accessRule = new RegistryAccessRule(currentUserStr, RegistryRights.WriteKey | RegistryRights.ReadKey | RegistryRights.Delete | RegistryRights.FullControl, AccessControlType.Allow); rs.AddAccessRule(accessRule);
但是这些在服务器上不起作用,但是在 Visual Studio 中调试时,代码运行良好。
【问题讨论】:
你只是不......为什么你甚至需要访问 Web 应用程序中的注册表? (感觉XY problem) 【参考方案1】:为了让 Web 应用程序访问注册表,它必须具有足够的权限。因此,解决方案 1 是唯一可行的方案。它描述了将网站应用程序池设置为本地管理员组中的用户。它错过了实际设置您的 IIS 网站以使用新创建的应用程序池的步骤,这就是它可能不适合您的原因。
在 Web 服务器中读取受限注册表的技术过程,尤其是应用程序卸载注册表项,对您来说真的不太可能有用。什么可能的用途是允许 Web 服务器访问服务器自己的应用程序卸载列表?
我怀疑您打算在客户的 PC 上打开该注册表项(我的猜测),这是不可能的。
【讨论】:
旁注:我认为他们得到的错误来自 .Net CAS 而不是 Windows 级别的安全检查,所以他们可能需要 1+3(Windows 权限和 .NetDemand
)来托管网络应用程序...以上是关于请求的注册表允许访问而没有安全漏洞的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 安全性 - 允许使用过期 JWT 令牌的用户请求