Question

Dans .NET 1.x, vous pouvez utiliser StrongNameIdentityPermissionAttribute sur votre assembly pour garantir que seul le code signé par vous puisse accéder à votre assembly. Selon la documentation MSDN,

  

Dans .NET Framework version 2.0 et ultérieure, demandes d'identité   les autorisations sont inefficaces si l'assembly appelant dispose d'une confiance totale.

Cela signifie que toute application bénéficiant d'une confiance totale peut simplement contourner mes exigences en matière de sécurité.

Comment puis-je empêcher un code non autorisé d'accéder à mon assembly dans .NET 2.0?

Était-ce utile?

La solution

Selon la suggestion d'Eric, j'ai résolu le problème en vérifiant moi-même la clé. Dans le code que je veux protéger, j'ajoute l'appel suivant,

EnsureAssemblyIsSignedByMyCompany( Assembly.GetCallingAssembly() );

Ensuite, la mise en oeuvre de cette méthode est

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

** Les noms et les clés ont été modifiés pour protéger les innocents. Toute ressemblance avec de vrais noms ou des sociétés n’est qu’une coïncidence. *

Autres conseils

Voir cet article:
http: // blogs.msdn.com/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx

En particulier cette partie:

  

Dans les versions récentes de .NET, "confiance totale signifie confiance totale". C’est-à-dire qu’un code entièrement fiable répond à toutes les demandes, y compris à des demandes telles que "a été signé avec cette clé", qu’il ait été signé ou non.

     

N’est-ce pas une faille mortelle dans le système de sécurité? Non. Le code entièrement sécurisé a toujours eu la possibilité de le faire, car il permet de contrôler les preuves associées à un assembly donné. Si vous pouvez contrôler les preuves, vous pouvez alors créer un assemblage qui semble provenir de Microsoft, pas de problème. (Et si votre processus contient déjà du code de confiance totalement malveillant, vous avez déjà perdu votre mot de passe - il ne doit pas emprunter l'identité d'assemblys signés Microsoft; il a déjà le pouvoir de faire tout ce que l'utilisateur peut faire.)

Apparemment, les concepteurs .Net ont estimé que cet attribut n'était pas très efficace pour un code de confiance complet dans .Net 1.x.

Comme Joël l'a indiqué, vous n'avez aucune chance en ce qui concerne les SAE. Cependant, vous pouvez éventuellement vérifier vous-même quelle que soit la méthode à protéger en utilisant Assembly.GetCallingAssembly () pour obtenir une référence à l'assembly contenant le code appelant, puis vérifiez manuellement le nom fort de cet assembly.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top