通过反射加载程序集的风险
本文关键字:程序集 加载 反射 | 更新日期: 2023-09-27 18:19:03
这是我上一个问题的后续,我想在加载程序集之前检查它的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();
您可以通过以仅反射模式加载程序集来缓解其中的一些问题:
仅反射加载上下文允许您检查程序集编译为其他平台或其他版本的。net框架。加载到这个上下文中的代码只能被检查;它无法执行。这意味着不能创建对象,因为不能执行构造函数。
您可以使用Assembly.ReflectionOnlyLoad()
和Assembly.ReflectionOnlyLoadFrom()
来完成此操作。
查看更多信息- http://msdn.microsoft.com/en-us/library/ms172331.aspx
可以将修改过的插件写入插件目录的攻击者很可能也可以写入应用程序目录本身(因为存储插件目录最安全的地方是在应用程序目录内)。由于攻击者可以写入该位置,它也可以用删除安全检查的exe替换您的.exe。
换句话说,检查程序集的SNK并不是那么有用。