2

这是我上一个问题的后续,我想在加载程序集之前检查它的 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();
4

2 回答 2

5

您可以通过以仅反射模式加载程序集来缓解其中的一些问题:

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

您可以使用Assembly.ReflectionOnlyLoad()和来做到这一点Assembly.ReflectionOnlyLoadFrom()

请参阅此处了解更多信息 - http://msdn.microsoft.com/en-us/library/ms172331.aspx

于 2013-06-18T12:42:25.933 回答
1

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

In other words, checking the SNK of an assembly is not that useful.

于 2013-06-18T12:43:28.470 回答