27 votes

Est-il sûr d'appeler Type.GetType avec un nom de type non approuvé?

Je suis tombé sur le texte suivant dans une revue de code:

Type type = Type.GetType(typeName);
if (type == typeof(SomeKnownType))
    DoSomething(...); // does not use type or typeName

typeName provient d'une requête AJAX et n'est pas validé. Est-ce à poser de problèmes de sécurité potentiels? Par exemple, est-il possible qu'inattendu de l'exécution d'un code, ou pour l'ensemble de la demande de blocage (déni de service), comme le résultat de chargement des types arbitraires de l'arbitraire assemblées?

(Je suppose que certaines joker pourrait tenter d'épuiser la mémoire disponible par le chargement de chaque type de chaque assembly dans le GAC. Quelque chose de pire?)

Notes:

  • C'est un ASP.NET application en cours d'exécution sous une Confiance totale.
  • Le résultant type est uniquement utilisé comme indiqué ci-dessus. Aucune tentative n'est faite pour instancier le type.

18voto

vcsjones Points 51910

Non, ce n'est pas du tout en sécurité. Type.GetType va charger une assemblée si elle n'a pas été chargé avant:

GetType provoque le chargement de l'assemblée spécifié dans typeName.

Alors, quel est le problème avec le chargement d'une assemblée? Hormis l'aide de la mémoire supplémentaire comme Daniel souligne .NET assemblées peuvent exécuter du code lorsqu'ils chargent, même si cette fonctionnalité n'est pas exposé à la normale compilateurs comme C# et VB.NET. Ceux-ci sont appelés module initialiseurs.

Le module de l'initialiseur d'exécution de la méthode à, ou un peu avant, le premier accès à tous les types, des méthodes ou des données définies dans le module

Juste le fait que vous êtes le chargement d'une assemblée et d'un examen de ses types est suffisant pour obtenir le module d'initialiseur à exécuter.

Quelqu'un avec un habilement écrite de l'assemblée (à dire en utilisant ilasm et de l'écriture MSIL brut) peut exécuter du code tout en obtenant l'assemblée chargée et que vous examinant les types. C'est pourquoi nous avons de l'Assemblée.ReflectionOnlyLoad, donc nous pouvons charger l'assembly dans un non-exécutable de l'environnement.


J'ai fait un peu plus de réflexion sur ce et de la pensée d'un peu plus de cas.

Considérez que votre Pool d'Applications est réglé pour fonctionner en 64 bits. Maintenant, imaginez que votre attaquant utilise le service AJAX pour tenter de charger un assembly qui est strictement pour architecture x86 uniquement. Par exemple, il y en a un dans mon GAC appelé Microsoft.SqlServer.Réplication x86 seulement, il n'est pas AMD64 contre-partie. Si je demande à votre service de charger cette assemblée, vous devez obtenir un BadImageFormatException. En fonction de ce que la garde des clauses que vous avez en place autour de chargement de l'assemblée, les exceptions non gérées pourrait totalement faire baisser votre pool d'applications.

4voto

Daniel A. White Points 91889

Il pourrait potentiellement consommer de la mémoire si les bibliothèques ne sont pas en mémoire.

J'aurais un Dictionary<string, Type> comme liste autorisée.

 var whitelist = new Dictionary<string, Type>;
whitelist.Add("MyType", typeof(MyType));
 

0voto

codenoire Points 1017

Il n'y a aucun danger hérité à se référer au type lui-même. La confiance dans .NET est au niveau de l'assemblage. S'il n'y a aucun assembly disponible qui contient le type spécifié, votre appel renverra simplement un null. En conséquence, quelqu'un doit rendre l'assembly disponible pour le code - les assemblys n'apparaissent pas simplement de nulle part.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X