这是我previous question的后续内容,我想在加载之前检查程序集的StrongName(通过硬盘上的文件或通过字节数据)。确保它是由我创建的。
使用Assembly.LoadFrom
或Assembly.Load
时是否存在安全风险,是否可以通过将恶意代码加载到这些变量中来执行?我应该考虑在AppDomain中加载这些程序集来读取它们吗?
以下是我的其余代码:
Assembly dll = Assembly.LoadFrom("UnauthorisedPlugin.dll");
byte[] thisDllKey = Assembly.GetExecutingAssembly().GetName().GetPublicKey();
byte[] dllKey = dll.GetName().GetPublicKey();
if (Enumerable.SequenceEqual(thisDllKey, dllKey))
{
Type pluginType = dll.GetTypes().Single();
IPlugin unauthPlugin = (IPlugin)Activator.CreateInstance(pluginType);
Console.WriteLine(unauthPlugin.Run());
}
else
{
Console.WriteLine("The DLL is not authorised");
}
Console.ReadLine();
答案 0 :(得分:5)
您可以通过以仅反射模式加载程序集来缓解部分问题:
仅反射加载上下文允许您检查程序集 为其他平台或其他版本的.NET编译 框架。加载到此上下文中的代码只能被检查;它 无法执行。这意味着无法创建对象,因为 构造函数无法执行。
您可以使用Assembly.ReflectionOnlyLoad()
和Assembly.ReflectionOnlyLoadFrom()
执行此操作。
有关详细信息,请参阅此处 - http://msdn.microsoft.com/en-us/library/ms172331.aspx
答案 1 :(得分:1)
可以将更改的插件写入插件目录的攻击者很可能也能够写入应用程序目录本身(因为存储插件目录最安全的地方是在应用程序目录中)。由于攻击者可以写入该位置,因此它也可以用删除安全检查的exe替换.exe。
换句话说,检查装配的SNK没有那么有用。