Question

Je suis en train de lire l'article approprié dans MSDN, Strong nommé assemblées et une question relative débordement de la pile, Vérification d'un ensemble pour un nom fort .

  1. Dans quelle mesure un assemblage solide nommé vérifier pour éviter la falsification?
  2. Est-il possible d'utiliser une forte attribution de noms pour vérifier un auteur de montage?

La première question qui se pose après avoir lu l'article CSharp411 NET Assemblée FAQ - Partie 3 - noms forts et signature , qui mentionne cela, entre autres problèmes de l'utilisation des noms forts:

  

" Can not Stop remplacement complet. Les noms forts ne peuvent pas empêcher un pirate de retirer la signature de nom fort, modifier malicieusement votre assemblée, resigner avec son propre clé, puis faisant passer son assemblée comme la vôtre. "

La deuxième question a l'intention de trouver les différences entre la dénomination forte et d'autres systèmes de signature comme, disons, Authenticode . Le même article MSDN mentionné énonce début:

  

« Notez, cependant, que les noms forts en eux-mêmes ne signifie pas un niveau de confiance comme celui fourni, par exemple, par une signature numérique et le certificat de support. »

Suis-je essayer d'utiliser forte dénomination pour beaucoup plus qu'il a été créé pour? A été forte appellation créée juste pour éviter les conflits de nom ou d'un nouveau type de « DLL Hell » GAC?

Était-ce utile?

La solution

Lorsque vous signez un assemblage avec un nom fort basé sur une clé privée que vous créez, cela présente les avantages suivants:

  • Un nom fort garantit l'unicité de l'identité d'un assemblage en ajoutant un jeton de clé publique et une signature numérique à l'Assemblée.
  • Un nom fort peut être adapté à une clé publique pour prouver que l'Assemblée vient de l'éditeur avec cette clé publique, et seulement cet éditeur.
  • Un nom fort fournit un contrôle fort d'intégrité. En passant les contrôles de sécurité .NET Framework garantit que le contenu de l'ensemble n'a pas été changé depuis la dernière construction.
  
    

Est-il possible d'utiliser une forte attribution de noms pour vérifier un auteur de montage?

  

Oui, comme indiqué ci-dessus forte dénomination peut vérifier l'assemblage dernière auteur. Mais il ne vérifie pas l'auteur original. Si un attaquant remplace le nom fort de votre assemblée, puis tout ce qui peut être vérifié est que vous n'êtes pas le dernier auteur de l'assemblée. S'il enlève le nom fort, aucune vérification de l'auteur peut être fait du tout.

  
    

Dans quelle mesure un assemblage solide nommé vérifier pour éviter la falsification?

  

Le code C # suivant vérifie que l'attaquant n'a pas falsifié le jeton de clé publique qui a été écrit à votre assemblée lorsque vous avez appliqué le nom fort. Il ne permet pas d'éviter la falsification, mais il peut détecter certains types de manipulation. La méthode accepte ci-dessous un tableau d'octets contenant votre jeton de clé publique, et il se compare avec le jeton réel de l'ensemble. Notez que cette technique soit efficace, votre choix doit obfuscateur de crypter la chaîne contenant votre jeton de clé publique, et seulement déchiffrer à la volée comme il est utilisé. Et sachez que vous devez avoir la permission FullTrust pour que ce code fonctionne car il utilise la réflexion sous le capot.

// Check that public key token matches what's expected.
private static bool IsPublicTokenOkay_Check(byte [] tokenExpected)
{
    // Retrieve token from current assembly
    byte [] tokenCurrent = Assembly.GetExecutingAssembly().GetName().GetPublicKeyToken();

    // Check that lengths match
    if (tokenExpected.Length == tokenCurrent.Length)
    {
        // Check that token contents match
        for (int i = 0; i < tokenCurrent.Length; i++)
            if (tokenExpected[i] != tokenCurrent[i]) 
                return false;
    }
    else
    {
        return false;
    }
    return true;
}

Tant que vous êtes en cours d'exécution dans une version du .NET Framework avant .NET 3.5 SP1, vous pouvez également forcer la vérification de la signature de nom fort dans le cas où on a retiré le nom fort par un attaquant ou le contrôle du nom fort était désactivée dans le registre. Le code suivant illustre un appel dans une méthode statique d'une autre classe appelée NativeMethods. C'est là sera appliquée la vérification.

// Check that this assembly has a strong name.
private bool IsStrongNameValid_Check()
{
    byte wasVerified = Convert.ToByte(false); 
     byte forceVerification = Convert.ToByte(true);
    string assemblyName = AppDomain.CurrentDomain.BaseDirectory + 
                          AppDomain.CurrentDomain.FriendlyName; 
    return NativeMethods.CheckSignature(assemblyName, 
                                        forceVerification, 
                                        ref wasVerified);
}

La vérification de la signature proprement dite est effectuée en utilisant comme illustré ci-dessous P / Invoke. L'utilisation du StrongNameSignatureVerificationEx API est assez alambiquée - pour une explication décente, voir cette entrée de blog .

// P/Invoke to check various security settings
// Using byte for arguments rather than bool, 
// because bool won't work on 64-bit Windows!
[DllImport("mscoree.dll", CharSet=CharSet.Unicode)]
private static extern bool StrongNameSignatureVerificationEx(string wszFilePath, 
                                                             byte fForceVerification, 
                                                             ref byte pfWasVerified);

// Private constructor because this type has no non-static members
private NativeMethods()
{
}

public static bool CheckSignature(string assemblyName, 
                                  byte forceVerification, 
                                  ref byte wasVerified)
{
    return StrongNameSignatureVerificationEx(assemblyName, 
                                             forceVerification, 
                                             ref wasVerified );
}

Notez que cela ne fonctionne pas par défaut pour les applications utilisant .NET 3.5 SP1 ou supérieur, qui a caractéristique forte by-pass nom . Il est possible de désactiver cette fonctionnalité pour votre application en ajoutant un paramètre à son fichier de configuration. Mais bien sûr, tout attaquant avec un accès en lecture / écriture à ce fichier de configuration peut revenir sur votre décision.

Autres conseils

Authenticode repose sur une autorité de certification tierce partie pour la validation du certificat. dénomination forte fonctionne comme un certificat auto-signé et peut être traité comme tel. Il n'utilise des signatures numériques standard, mais le problème réside dans la vérification de la clé publique de l'auteur de montage est en effet valide. Si vous obtenez séparément via un canal de confiance de l'auteur et vous faites confiance à ce canal, alors oui, vous pouvez le vérifier tout comme un certificat auto-signé.

Tant que vous êtes sûr le nom fort clé privée est en sécurité par l'auteur et vous connaissez la clé publique de l'auteur, vous pouvez vous assurer qu'il est pas trafiqué (dans la mesure où vous pouvez vous assurer un courriel signé numériquement n'est pas falsifié avec). Soit dit en passant, ne me méprends pas: la citation est tout à fait vrai et un attaquant peut facilement démissionner l'assemblée ou supprimer la signature existante. Cependant, l'ensemble obtenu aura une signature numérique ** différente * qui peuvent être vérifiés à l'original (si vous avez la clé publique d'origine).

Dans ce cas, il est similaire à un certificat auto-signé. Si vous pouvez en quelque sorte que la clé publique de l'auteur, vous pouvez vérifier l'autorité. Cependant, contrairement à Authenticode qui repose sur une autorité de certification, il n'y a pas simple, défini par le système, façon de distribuer la clé publique.

Je pense que les noms forts sont utiles pour versioning et peuvent être utilisés pour aider à établir les niveaux de confiance pour le code d'accès de sécurité Modifier : mais vous ne pouvez pas les utiliser pour vérifier l'assemblage est écrit par une personne de confiance ou par un auteur spécifique. Voir le commentaire de @RoadWarrior et @ la réponse à cette question RoadWarrior.

Fort de nommer votre assemblée ne fait pas inviolable.
Modifier Voir les commentaires de @RoadWarrior et @divo. Si votre application vérifie la clé privée d'origine de l'auteur de l'Assemblée et de forcer la vérification du nom fort ma déclaration est incorrecte. Cependant, si l'attaquant a accès à tous les assemblées dans votre application et / ou que vous utilisez de la boîte forte vérification du nom tel que fourni par libre du CLR puis je maintiens ce que je disais.

Cela peut être subverti par a déterminé attaquant .

Je lis une discussion il y a quelque temps sur les noms forts et la sécurité qui m'a amené à croire que pour les assemblées que nous produisons, authenticode était une meilleure garantie pour nos clients que l'ensemble provient d'une source de confiance.

Je crois qu'il ya un moyen d'utiliser le nom fort dans le but de « Trust ». Je comprends Microsoft ne recommande nom fort pour assurer le contenu de montage n'ont pas été modifiés et suggère d'utiliser « Authenticode » pour la confiance.

Mais si l'application du chargeur (l'application qui charge ces ensembles / programmes) maintient une liste des « assemblées Encrypted » qu'il peut charger; ce ne serait pas résoudre le problème « Trust »?

Par exemple, le chargeur de package peut maintenir le nom de l'assemblage avec les clés publiques et charge l'ensemble / programme par nom complet de l'ensemble?

          

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