不要间接暴露带有链接需求的方法

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.ReleaseMutexrwl.WaitOne 的来源(可能还有sw.WriteLine 的安全相关属性。您需要将这些属性应用于您的WriteLine 方法。我无法详细解释机制,但这样您的方法的调用者经过安全检查,这正是这些 LinkDemand 属性所需要的。您必须在调用堆栈中一直执行此操作。 【参考方案1】:

rwl 是 [Mutex][1] 吗?如果是这样,该类将使用 [HostProtectionAttribute][2] 进行装饰,该属性会创建对 HostProtectionPermission 的链接需求,这可能是导致规则 CA2122 触发的原因。

也就是说,至少从 FxCop 10.0 开始,FxCop 已明确将 HostProtectionPermission 排除在规则 CA2122 的考虑之外(因为它并不是真正的安全问题),因此您看到此规则违规似乎有点奇怪。如果您使用的是旧版本的 FxCop,并且您很确定是 HostProtectionAttribute 导致了问题,那么抑制违规似乎很安全。否则,能否提供更多细节(FxCop 版本、Visual Studio 版本、目标框架版本、swrwl 类型)以便更容易识别违规原因?

【讨论】:

这是问题所在:调用具有 LinkDemand 的“Process.GetCurrentProcess()”。通过进行此调用,“Process.GetCurrentProcess()”间接暴露给用户代码。查看以下调用堆栈,它可能会暴露一种绕过安全保护的方法 抱歉,我没有向右滚动足够远,无法看到 Process 的使用。有几个选项可以解决这个问题,但最好的选择取决于几件事。您的目标是哪个版本的 .NET 框架?此外,您的程序集是否使用以下任何属性进行装饰:AllowPartiallyTrustedCallersSecurityRulesSecurityCriticalSecurityTransparent?如果存在这些属性中的任何一个,您知道为什么要添加它们吗?

以上是关于不要间接暴露带有链接需求的方法的主要内容,如果未能解决你的问题,请参考以下文章

联邦学习应用思考:需求还是方法?

需求规格说明书

软件工程团队作业(需求规格说明书)

不要再无脑背诵面向对象三大特性了

B端硬件产品管理

软件需求规格说明书