不要间接暴露带有链接需求的方法
Posted
技术标签:
【中文标题】不要间接暴露带有链接需求的方法【英文标题】:Do not indirectly expose methods with link demands 【发布时间】:2017-06-12 09:25:19 【问题描述】:我不知道如何解决我的 FxCop 问题。
这是我感兴趣的功能
public void WriteLine(int eventNumber, string message, params object[] args)
try
rwl.WaitOne();
try
sw.WriteLine(DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss", CultureInfo.CurrentCulture) + "\t\t" + eventNumber.ToString(CultureInfo.CurrentCulture) + "\t" + System.Reflection.Assembly.GetCallingAssembly().GetName().Name + "\t" + Process.GetCurrentProcess().Id.ToString(CultureInfo.CurrentCulture) + "\t" + tID + " \t " + message, args);
catch (Exception ex)
throw new ArgumentException("Cannot write to file " + ex.Message);
finally
rwl.ReleaseMutex();
catch (ApplicationException)
这是错误: 用于 DoNotIndirectlyExposeMethodsWithLinkDemands 的严重错误,确定性 33 求助:http://msdn.microsoft.com/library/ms182303(VS.100).aspx 信息:“不要包装受 LinkDemand 保护的方法 一种不执行安全检查的方法。一种 LinkDemand 检查即时的权限 调用者而不是检查所有的权限 调用堆栈中的调用者。在这种情况下,权限 将检查包装器方法。如果包装 方法本身不会检查调用者的权限 在调用堆栈中更高的位置,恶意代码可能能够 执行包装的功能,即使它缺少 允许这样做。”
【问题讨论】:
什么是rwl
?检查rwl.ReleaseMutex
和rwl.WaitOne
的来源(可能还有sw.WriteLine
的安全相关属性。您需要将这些属性应用于您的WriteLine
方法。我无法详细解释机制,但这样您的方法的调用者经过安全检查,这正是这些 LinkDemand
属性所需要的。您必须在调用堆栈中一直执行此操作。
【参考方案1】:
rwl
是 [Mutex][1] 吗?如果是这样,该类将使用 [HostProtectionAttribute][2] 进行装饰,该属性会创建对 HostProtectionPermission 的链接需求,这可能是导致规则 CA2122 触发的原因。
也就是说,至少从 FxCop 10.0 开始,FxCop 已明确将 HostProtectionPermission 排除在规则 CA2122 的考虑之外(因为它并不是真正的安全问题),因此您看到此规则违规似乎有点奇怪。如果您使用的是旧版本的 FxCop,并且您很确定是 HostProtectionAttribute 导致了问题,那么抑制违规似乎很安全。否则,能否提供更多细节(FxCop 版本、Visual Studio 版本、目标框架版本、sw
和rwl
类型)以便更容易识别违规原因?
【讨论】:
这是问题所在:调用具有 LinkDemand 的“Process.GetCurrentProcess()”。通过进行此调用,“Process.GetCurrentProcess()”间接暴露给用户代码。查看以下调用堆栈,它可能会暴露一种绕过安全保护的方法 抱歉,我没有向右滚动足够远,无法看到Process
的使用。有几个选项可以解决这个问题,但最好的选择取决于几件事。您的目标是哪个版本的 .NET 框架?此外,您的程序集是否使用以下任何属性进行装饰:AllowPartiallyTrustedCallers
、SecurityRules
、SecurityCritical
或 SecurityTransparent
?如果存在这些属性中的任何一个,您知道为什么要添加它们吗?以上是关于不要间接暴露带有链接需求的方法的主要内容,如果未能解决你的问题,请参考以下文章