通过反射加载程序集的风险

时间:2013-06-18 12:28:34

标签: c# security reflection

这是我previous question的后续内容,我想在加载之前检查程序集的StrongName(通过硬盘上的文件或通过字节数据)。确保它是由我创建的。

使用Assembly.LoadFromAssembly.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();

2 个答案:

答案 0 :(得分:5)

您可以通过以仅反射模式加载程序集来缓解部分问题:

  

仅反射加载上下文允许您检查程序集   为其他平台或其他版本的.NET编译   框架。加载到此上下文中的代码只能被检查;它   无法执行。这意味着无法创建对象,因为   构造函数无法执行。

您可以使用Assembly.ReflectionOnlyLoad()Assembly.ReflectionOnlyLoadFrom()执行此操作。

有关详细信息,请参阅此处 - http://msdn.microsoft.com/en-us/library/ms172331.aspx

答案 1 :(得分:1)

可以将更改的插件写入插件目录的攻击者很可能也能够写入应用程序目录本身(因为存储插件目录最安全的地方是在应用程序目录中)。由于攻击者可以写入该位置,因此它也可以用删除安全检查的exe替换.exe。

换句话说,检查装配的SNK没有那么有用。