我正在尝试在我的DLL中获取Iexplorer.exe的版本。但是每次都会收到此警告
警告1 CA2122:Microsoft.Security:'ApCkr.IEavailable()'调用具有LinkDemand的'FileVersionInfo.FileMajorPart.get()'。通过进行此调用,'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
答案 0 :(得分:7)
这是它正在谈论的FileVersionInfo类的链接需求属性:
[PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")]
这在MSDN文章中有很好的记录,但并不总是很容易从FxCop消息中提取。我个人觉得Reflector非常方便解决这个问题。
链接需求是在运行时检查的非常便宜的需求。它只是在即时编译时执行,只执行一次,只检查直接调用者的权限。发生可能的安全性泄漏是因为稍后可能会通过其他代码调用属性getter。这样的代码不会得到相同的需求检查,因为您的属性缺少属性并且已经被jitted。您必须应用相同的安全属性。
当这样的代码在没有 FullTrust的情况下运行时,这只会是一个问题。有点难以想出这样的场景,你必须创建自己的沙箱并将你的属性暴露给这样的沙盒代码。如果您想知道能够检查DLL版本的安全隐患:确切知道程序使用的DLL版本对于找出攻击向量非常重要。
FxCop不够智能,无法检测到这种情况。它实际上是一种工具,只会发出你可能忽略的事情的警告。你可能做到了。 CAS很难理解,我自己也很挣扎。在其他所有人中,由于这一点,它在.NET 4中被弃用,取而代之的是安全的沙盒模型。明智之举,不可理解的安全性是不安全的。
答案 1 :(得分:-1)
这不是错误 - 这是一个警告。解释LinkDemand是什么的文档是here。