138 votes

Est-il possible de mettre un code malveillant dans une expression régulière ?

Je veux ajouter de l'expression régulière de la capacité de recherche à mon public de la page web. Autres que HTML codant pour la sortie, j'ai besoin de faire quelque chose afin de se prémunir contre les utilisateurs malveillants d'entrée?

Les recherches Google sont envahis par des gens en train de résoudre le problème inverse-- utiliser des expressions régulières pour détecter les entrées malveillantes--ce qui ne m'intéressent pas. Dans mon scénario, l'entrée de l'utilisateur est une expression régulière.

Je vais utiliser la Regex de la bibliothèque .NET (C#).

216voto

tchrist Points 47116

Déni de Service Préoccupations

La préoccupation la plus courante avec les regexes est un déni de service (ddos) à travers les modes pathologiques qui vont exponentielle - ou même des super‐exponentielle! - et donc, semble prendre une éternité à résoudre. Ceux-là ne peuvent apparaître sur certaines données d'entrée, mais en général, on peut en créer un dans lequel cela n'a pas d'importance.

Ceux qui ce sont pourra varier en fonction de la façon intelligente de la regex compilateur que vous utilisez, parce que certains de ceux-ci peuvent être détectées lors de la compilation. Regex compilateurs qui mettent en œuvre la récursivité ont généralement un haut‐récursivité‐profondeur de comptoir pour la vérification de la non progression de la maladie.

Russ Cox excellent 2007 document sur l' Expression Régulière Correspondant Peut Être Simple Et Rapide (mais il est lent dans Java, Perl, PHP, Python, Ruby, ...) parle des façons les plus modernes de Fan, qui tous semblent dériver de Henry Spencer code, souffrent d'une dégradation des performances, mais dans le cas où Thompson‐style NFA a pas de tels problèmes.

Si vous n'admet que des modèles qui peuvent être résolus par DFAs, vous pouvez les compiler comme telle, et ils vont courir plus vite, peut-être beaucoup plus rapide. Cependant, il faut du temps pour ce faire. La Cox document mentionne cette approche et de son cortège de problèmes. Il s'agit d'un classique de l'espace–temps.

Avec un DFA, vous passez plus de temps à le construire (et de l'allocation de plus en plus d'états), alors qu'avec un NFA vous passez plus de temps à l'exécution, car il peut être de plusieurs états en même temps, et de mandature pouvez manger votre déjeuner et votre PROCESSEUR.

Le déni‐de‐Service Solutions

Probablement la façon la plus raisonnable pour répondre à ces modèles qui sont en train de perdre à la fin d'une course avec la chaleur de la mort de l'univers est de les envelopper avec une minuterie qui place effectivement une durée maximale autorisée pour leur exécution. Habituellement, ce sera beaucoup, beaucoup moins que le délai d'expiration par défaut que la plupart des serveurs HTTP fournir.

Il existe différentes façons de mettre en œuvre ces, allant d'un simple alarm(N) au niveau C, à une sorte d' try {} bloquer les captures d'alarme de type exceptions près, tout le chemin à la fraie un nouveau thread est créé spécialement avec une contrainte de temps construit à droite dans.

Code Des Légendes

En regex langues qui admettent code des légendes, un mécanisme de l'autorisation ou non de la chaîne que vous allez compiler doit être fourni. Même si le code des légendes que sont le code dans la langue que vous utilisez, vous devez les limiter; ils n'ont pas à être en mesure d'appeler du code externe, même s'ils peuvent, vous avez beaucoup plus de problèmes.

Par exemple, en Perl, on ne peut pas avoir de code de légendes dans les regexes créé à partir de la chaîne d'interpolation (car celles-ci seraient, comme ils sont compilés au cours de l'exécution), à moins que le spécial lexicalement étendue de pragma use re "eval"; dans active dans le champ d'application actuel.

De cette façon, personne ne peut se faufiler dans un code de légende pour exécuter des programmes comme rm -rf *, par exemple. Parce que le code de légendes sont si sensibles à la sécurité, Perl désactive par défaut sur tous les interpolées chaînes, et vous devez sortir de votre façon de les ré‐activer.

Défini par l'utilisateur \P{roperties}

Il reste un plus de sécurité sensible à la question relative à l'Unicode des propriétés de style comme \pM, \p{Pd}, \p{Pattern_Syntax}ou \p{Script=Greek} - qui peut exister dans certains regex compilateurs qui prennent en charge que la notation.

Le problème est que dans certains de ces cas, les propriétés de l'utilisateur extensible. Cela signifie que vous pouvez avoir des propriétés personnalisées qui sont de véritables code des légendes à des fonctions nommées dans certains namepace, comme \p{GoodChars} ou \p{Class::Good_Characters}. Comment votre langue poignées de ceux qui peut-être intéressant de regarder.

Le bac à sable

En Perl, un bac à sable compartiment via l' Safe module de donner le contrôle de l'espace de noms de la visibilité. D'autres langues offrent le même type de bac à sable technologies. Si de tels dispositifs sont disponibles, vous voudrez peut-être regarder en eux, parce qu'ils sont spécifiquement conçus pour limité l'exécution de code non fiable.

20voto

Brian Bloniarz Points 271

Ajoutant à l’excellente réponse de tchrist : les mêmes Russ Cox qui a écrit la page « Expression régulière » a également publié le code ! RE2 est une bibliothèque C++ qui garantit O(length_of_regex) DUREE et limite configurable-l’utilisation de la mémoire. Il est utilisé dans Google afin que vous pouvez taper une regex dans google recherche de code--ce qui signifie qu’il a été testé de bataille.

13voto

SLaks Points 391154

Oui.

Regexes peut être utilisé pour effectuer des attaques DOS.
Il n’y a pas de solution simple.

6voto

Bruce Ediger Points 294

Vous voudrez lire cet article:

Changement de contexte non sécurisé: inoculer des expressions régulières pour la survie Le document traite davantage de ce qui peut mal tourner avec les moteurs d’expression classiques (par exemple PCRE), mais cela peut vous aider à comprendre ce que vous êtes en train de faire.

5voto

Bryan Oakley Points 63365

Vous avez non seulement à vous soucier de la correspondance elle-même, mais comment vous faites la correspondance. Par exemple, si votre entrée passe par une sorte de eval phase ou de la substitution de commande sur son chemin vers le moteur d'expression régulière, il pourrait être le code qui est exécuté à l'intérieur du modèle. Ou, si votre syntaxe d'expression régulière permet de commandes incorporées vous avez à se méfier de ce que, trop. Puisque vous n'avez pas la langue dans votre question, il est difficile de dire avec certitude ce que toutes les implications de sécurité.

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