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 に置き換えることもできます。

つまり、アセンブリの SNK をチェックすることはあまり役に立ちません。

于 2013-06-18T12:43:28.470 に答える