test regulares regular probar palabra expresiones expresion exacta especiales espacio ejemplos caracteres blanco alfanumerico regex security

regex - regulares - ¿Hay alguna forma de poner código malicioso en una expresión regular?



javascript regex test (6)

Preocupaciones de denegación de servicio

La preocupación más común con las expresiones regulares es un ataque de denegación de servicio a través de patrones patológicos que se vuelven exponenciales, ¡o incluso súper exponenciales! - y así parece tomar una eternidad para resolver. Estos pueden aparecer solo en datos de entrada particulares, pero generalmente uno puede crear uno en el que esto no importe.

Depende de qué tan inteligente sea el compilador de expresiones regulares que está utilizando, ya que algunos de ellos pueden detectarse durante el tiempo de compilación. Los compiladores de Regex que implementan la recursión suelen tener un contador de profundidad de recursividad incorporado para verificar la no progresión.

El excelente artículo de Russ Cox de 2007 sobre Concordancia de expresión regular puede ser simple y rápido (pero es lento en Java, Perl, PHP, Python, Ruby, ...) habla sobre las formas en que la mayoría de las NFA modernas parecen derivar del código de Henry Spencer , sufren una grave degradación del rendimiento, pero donde un NFA de estilo Thompson no tiene tales problemas.

Si solo admite patrones que pueden resolverse mediante DFA, puede compilarlos como tales y se ejecutarán más rápido, posiblemente mucho más rápido. Sin embargo, toma tiempo hacer esto. El documento de Cox menciona este enfoque y sus problemas concomitantes. Todo se reduce a una clásica relación de tiempo y espacio.

Con un DFA, pasa más tiempo construyéndolo (y asignando más estados), mientras que con un NFA pasa más tiempo ejecutándolo, ya que puede tratarse de varios estados al mismo tiempo, y retroceder puede consumir su almuerzo y su CPU.

Soluciones de denegación de servicio

Probablemente la forma más razonable de abordar estos patrones que están en el lado perdedor de una carrera con la muerte por calor del universo es envolverlos con un temporizador que de hecho coloca una cantidad de tiempo máxima permitida para su ejecución. Por lo general, esto será mucho, mucho menos que el tiempo de espera predeterminado que proporcionan la mayoría de los servidores HTTP.

Hay varias formas de implementarlas, que van desde una alarm(N) simple alarm(N) en el nivel C, hasta algún tipo de try {} bloquear las excepciones de tipo de alarma de captura, hasta generar un nuevo hilo creado especialmente con un restricción de tiempo integrada en ella.

Llamadas de código

En los lenguajes regex que admiten llamadas codificadas, se debe proporcionar algún mecanismo para permitir o no permitirlas a partir de la cadena que va a compilar. Incluso si los textos destacados de las líneas son solo para codificar en el idioma que está utilizando, debe restringirlos; no tienen que poder llamar al código externo, aunque si pueden, usted tiene problemas mucho más grandes.

Por ejemplo, en Perl, uno no puede tener texto destacado en expresiones regulares creadas a partir de la interpolación de cadenas (como sería, ya que están compiladas durante el tiempo de ejecución), a menos que el pragma de ámbito léxico especial use re "eval"; en activo en el alcance actual.

De esta forma, nadie puede colarse en una llamada de código para ejecutar programas del sistema como rm -rf * , por ejemplo. Debido a que los textos destacados de las líneas son tan sensibles a la seguridad, Perl los desactiva de forma predeterminada en todas las cadenas interpoladas, y debe hacer un esfuerzo por volver a habilitarlos.

Definido por el usuario / P {roperties}

Sigue habiendo un problema más sensible a la seguridad relacionado con las propiedades de estilo Unicode, como /pM , /p{Pd} , /p{Pattern_Syntax} o /p{Script=Greek} - que pueden existir en algunos compiladores de expresiones regulares que admiten esa notación.

El problema es que en algunos de estos, el conjunto de propiedades posibles es extensible por el usuario. Esto significa que puede tener propiedades personalizadas que son llamadas de códigos reales a funciones con nombre en algún espacio de nombre particular, como /p{GoodChars} o /p{Class::Good_Characters} . Cómo vale la pena mirar cómo maneja su lenguaje.

Sandboxing

En Perl, un compartimiento de espacio aislado a través del módulo Safe daría control sobre la visibilidad del espacio de nombres. Otros idiomas ofrecen tecnologías similares de sandboxing. Si dichos dispositivos están disponibles, es posible que desee examinarlos, ya que están específicamente diseñados para la ejecución limitada del código que no es de confianza.

Deseo agregar la capacidad de búsqueda de expresión regular a mi página web pública. Además de HTML codifica la salida, ¿tengo que hacer algo para protegerme contra la entrada de usuarios maliciosos?

Las búsquedas de Google se ven inundadas por personas que resuelven el problema inverso, el uso de expresiones regulares para detectar entradas maliciosas, que no me interesan. En mi caso, la entrada del usuario es una expresión regular.

Usaré la biblioteca Regex en .NET (C #).


Agregando a la excelente respuesta de tchrist: ¡el mismo Russ Cox que escribió la página de "Expresión regular" también ha lanzado el código! re2 es una biblioteca C ++ que garantiza el tiempo de ejecución O (length_of_regex) y el límite de uso de la memoria configurable. Se usa en Google para que pueda escribir una expresión regular en la búsqueda de códigos de Google, lo que significa que ha sido probado en batalla.


No solo debe preocuparse por el emparejamiento en sí mismo, sino también por cómo lo hace. Por ejemplo, si su entrada pasa por algún tipo de fase de evaluación o sustitución de comando en su camino al motor de expresión regular, puede haber código que se ejecute dentro del patrón. O bien, si la sintaxis de su expresión regular permite comandos integrados, también debe tener cuidado con eso. Como no especificó el idioma en su pregunta, es difícil decir con certeza cuáles son las implicaciones de seguridad.




Una buena forma de probar los RegEx para detectar problemas de seguridad (al menos para Windows) es la herramienta de borrado SDL RegEx lanzada recientemente por Microsoft. Esto puede ayudar a evitar la construcción RegEx patológicamente mala.