2012-03-04 106 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中被棄用,因此被安全沙箱模型所取代。明智之舉,難以理解的安全性是不安全的。