2012-03-04 131 views
4

我试图让IEXPLORER.EXE的版本在我DLL.However我得到这样的警告每次的LinkDemand警告

警告1个CA2122:Microsoft.Security:“ApCkr.IEavailable()”调用到'FileVersionInfo.FileMajorPart.get()',它有一个LinkDemand。通过进行此调用,'FileVersionInfo.FileMajorPart.get()'间接暴露给用户代码。回顾下面的调用堆栈,可能会揭露一种方法来规避安全保护:

在MSDN(安全权限)和falgs中搜索加载后,我仍然无法知道我将如何摆脱此错误。我试图

SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] 

,但不能得到它的工作,要么

任何帮助,将不胜感激

#region IExplore 

    public string IEavailable() 
    { 
     bool IEversion; 

     FileVersionInfo.GetVersionInfo("C:\\program files\\\\Internet Explorer\\iexplore.exe"); 
     FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo("C:\\program files\\\\Internet Explorer\\iexplore.exe"); 
     int a = myFileVersionInfo.FileMajorPart; 
     if (a < 8) 
     { 
      IEversion = false; 
     } 
     else 
     { 
      IEversion = true; 
     } 
     return IEversion.ToString(); 
    } 
    #endregion 
+7

在这里等一下。在尝试消除警告之前:**是否进行了彻底的安全审查?**是否确保即使通过部分受信任的代码间接调用,链接要求的方法的间接暴露也是安全的?警告正试图让你安全。不要问“我怎么关掉这台烟雾探测器?”直到你确定它是虚惊一场;关闭正在运行的正在运行的烟雾探测器是烧毁建筑物的好方法。 – 2012-03-04 16:55:30

+0

@EricLippert我会研究这一点。此外,我不认为一个简单的文件版本查询造成任何主要的威胁 – Cesar 2012-03-04 18:07:42

回答

-1

这不是一个错误 - 它的一个警告。解释什么是LinkDemand的文档是here

+1

MSDN的例子超出了我。请你解释它在简单的崇拜 – Cesar 2012-03-04 16:53:14

7

这是它在谈论FileVersionInfo类的链接需求属性:

[PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")] 

这MSDN文章中记录良好,但并不总是很容易从FxCop的消息递归。我个人认为Reflector非常方便,可以对此进行分类。

链接需求是在运行时检查的非常便宜的需求。它在即时编译时执行,只执行一次,只检查直接调用者的权限。发生可能的安全漏洞是因为您的属性获取器可能在稍后被其他代码调用。这样的代码不会得到相同的需求检查,因为您的财产缺少该属性,并且已经发生了争执。您必须应用相同的安全属性。

这样只会在代码运行时出现问题没有 FullTrust。有点难以想出这样的场景,你将不得不创建自己的沙箱,并将你的财产暴露给这样的沙箱代码。如果您想知道能够检查DLL版本的安全隐患:确切了解程序使用的DLL版本对于找出攻击媒介非常重要。

FxCop没有足够的智能来检测这种情况。这真的是一种工具,只是发出警告,你可能可能忽略了。你可能做到了。除此之外,CAS很难理解,我自己也在拼命挣扎。和其他人一样,它在.NET 4中被弃用,因此被安全沙箱模型所取代。明智之举,难以理解的安全性是不安全的。