7

.NET 1.x では、アセンブリでStrongNameIdentityPermissionAttributeを使用して、署名されたコードのみがアセンブリにアクセスできるようにすることができました。MSDNのドキュメントによると、

.NET Framework バージョン 2.0 以降では、呼び出し元のアセンブリが完全に信頼されている場合、ID アクセス許可の要求は効果がありません。

これは、完全に信頼できるアプリケーションはすべて、私のセキュリティ要求をバイパスできることを意味します。

許可されていないコードが .NET 2.0 のアセンブリにアクセスするのを防ぐにはどうすればよいですか?

4

3 に答える 3

5

エリックの提案に従って、私は自分でキーをチェックして解決しました。保護したいコードに、次の呼び出しを追加します。

EnsureAssemblyIsSignedByMyCompany( Assembly.GetCallingAssembly() );

次に、そのメソッドの実装は

  /// <summary>
  /// Ensures that the given assembly is signed by My Company or Microsoft.
  /// </summary>
  /// <param name="assembly"></param>
  private static void EnsureAssemblyIsSignedByMyCompany( Assembly assembly )
  {
     if ( assembly == null )
        throw new ArgumentNullException( "assembly" );

     byte[] pubkey = assembly.GetName().GetPublicKeyToken();
     if ( pubkey.Length == 0 )
        throw new ArgumentException( "No public key token in assembly." );

     StringBuilder builder = new StringBuilder();
     foreach ( byte b in pubkey )
     {
        builder.AppendFormat( "{0:x2}", b );
     }
     string pkString = builder.ToString();
     if ( pkString != "b77a5c561934e089" /* Microsoft */ &&
          pkString != "abababababababab" /* Ivara */ )
     {
        throw new ArgumentException( "Assembly is not signed by My Company or Microsoft. You do not have permission to call this code." );
     }
  }

** 罪のない人を保護するために名前とキーが変更されました。実名や企業との類似性は単なる偶然です。*

于 2009-01-07T20:25:08.827 に答える
1

この記事を参照してください:
http://blogs.msdn.com/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx

特にこの部分:

.NET の最近のバージョンでは、「完全な信頼は完全な信頼を意味します」。つまり、完全に信頼できるコードは、実際に署名されているかどうかにかかわらず、「この鍵で署名された」などの要求を含むすべての要求を満たします。

それはセキュリティシステムの致命的な欠陥ではありませんか? いいえ。完全に信頼されたコードには、特定のアセンブリに関連付けられた証拠を制御する機能があるため、完全に信頼されたコードには常にそれを行う機能がありました。証拠を制御できれば、Microsoft から来たように見えるアセンブリを偽造できますが、問題ありません。(そして、プロセスに悪意のある完全信頼コードが既にある場合は、既に失われています。Microsoft が署名したアセンブリを偽装する必要はありません。ユーザーが実行できることは何でも実行できる力が既にあります。)

どうやら、.Net 設計者は、.Net 1.x の完全な信頼コードに対しても、この属性があまり効果的ではないと感じていたようです。

于 2009-01-07T17:15:24.093 に答える
1

ジョエルが指摘したように、あなたは CAS に関して運が悪いです。ただし、Assembly.GetCallingAssembly() を使用して呼び出し元のコードを含むアセンブリへの参照を取得し、そのアセンブリの厳密な名前を手動で確認することにより、保護する必要があるメソッドで自分でチェックできる場合があります。

于 2009-01-07T18:34:02.717 に答える