許可されていないコードが.NET 2.0のアセンブリにアクセスするのを防ぐにはどうすればよいですか?
-
05-07-2019 - |
質問
.NET 1.xでは、 StrongNameIdentityPermissionAttribute をアセンブリに追加して、自分が署名したコードのみがアセンブリにアクセスできるようにします。 MSDNドキュメントによると、
.NET Frameworkバージョン2.0以降では、IDの要求 呼び出し元アセンブリに完全な信頼がある場合、アクセス許可は無効になります。
これは、完全に信頼できるアプリケーションであれば、セキュリティ要求を回避できることを意味します。
不正なコードが.NET 2.0のアセンブリにアクセスするのを防ぐにはどうすればよいですか?
解決
エリックの提案に従って、私は自分でキーをチェックすることでそれを解決しました。保護するコードに、次の呼び出しを追加します。
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." );
}
}
**無実の人を保護するために名前とキーが変更されました。本名や会社に似ていることは単なる偶然です。*
他のヒント
こちらの記事をご覧ください:
http:// blogs.msdn.com/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx
特にこの部分:
.NETの最近のバージョンでは、「完全な信頼とは完全な信頼」を意味します。つまり、完全に信頼されたコードは、実際に署名されたかどうかに関係なく、「このキーで署名されました」などの要求を含むすべての要求を満たします。
これはセキュリティシステムの致命的な欠陥ではありませんか?いいえ。完全に信頼できるコードには、特定のアセンブリに関連付けられた証拠を制御する機能があるため、完全に信頼できるコードには常にそれを行う機能がありました。証拠を制御できれば、Microsoftから来たように見えるアセンブリを偽造できます。問題ありません。 (また、プロセスに悪意のある完全信頼コードが既にある場合は、すでに失われています。Microsoft署名付きアセンブリになりすます必要はありません。ユーザーができることはすべて実行できます。)
どうやら、.Netデザイナーは、この属性は.Net 1.xの完全信頼コードに対してもあまり効果的ではないと感じていたようです。
ジョエルが指摘したように、CASに関しては運が悪い。ただし、Assembly.GetCallingAssembly()を使用して呼び出しコードを含むアセンブリへの参照を取得し、そのアセンブリの厳密な名前を手動で確認することで、保護する必要のあるメソッドで自分でチェックできる場合があります。