如何防止未经授权的代码访问.NET 2.0中的程序集?

时间:2009-01-07 17:03:58

标签: .net-2.0 code-access-security

在.NET 1.x中,您可以使用程序集上的StrongNameIdentityPermissionAttribute来确保只有您签名的代码才能访问程序集。根据MSDN文档,

  

在.NET Framework 2.0及更高版本中,对身份的要求   如果调用程序集具有完全信任,则权限无效。

这意味着任何具有完全信任的应用程序都可以绕过我的安全需求。

如何防止未经授权的代码访问.NET 2.0中的程序集?

3 个答案:

答案 0 :(得分:5)

根据Eric的建议,我通过自己检查密钥解决了这个问题。在我想保护的代码中,我添加了以下调用,

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." );
     }
  }

**更改名称和密钥以保护无辜者。任何与真实姓名或公司的相似之处仅仅是巧合。*

答案 1 :(得分:1)

参见这篇文章:
http://blogs.msdn.com/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx

特别是这部分:

  

在.NET的最新版本中,“完全信任意味着完全信任”。也就是说,完全受信任的代码满足所有需求,包括对“使用此密钥签名”等内容的需求,是否实际已签名。

     

这不是安全系统中的致命缺陷吗?不可以。完全受信任的代码总是能够做到这一点,因为完全受信任的代码能够控制与给定程序集关联的证据。如果您可以控制证据,那么您可以伪造一个看起来像是来自Microsoft的程序集,没问题。 (如果你的进程中已经有恶意的完全信任代码,那么你已经丢失了 - 它不需要冒充微软签名的程序集;它已经有能力做任何用户可以做的事情。)

显然,.Net设计人员认为这个属性对于.Net 1.x中的完全信任代码也不是很有效。

答案 2 :(得分:1)

正如乔尔所说,你对CAS没有好运。但是,您可以通过使用Assembly.GetCallingAssembly()获取对包含调用代码的程序集的引用来自行检查需要保护的任何方法,然后手动检查该程序集上的强名称。