Как я могу предотвратить доступ несанкционированного кода к моей сборке в .NET 2.0?

StackOverflow https://stackoverflow.com/questions/421137

  •  05-07-2019
  •  | 
  •  

Вопрос

В .NET 1.x вы можете использовать StrongNameIdentityPermissionAttribute в вашей сборке, чтобы гарантировать, что только код, подписанный вами, сможет получить доступ к вашей сборке. Согласно документации MSDN,

  

В .NET Framework версии 2.0 и выше требования к идентичности   разрешения неэффективны, если вызывающая сборка полностью доверяет.

Это означает, что любое приложение с полным доверием может просто обойти мои требования безопасности.

Как я могу предотвратить несанкционированный доступ к моей сборке в .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 (), чтобы получить ссылку на сборку, содержащую вызывающий код, а затем вручную проверить строгое имя этой сборки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top