Compararía aceptar expresiones regulares proporcionadas por el usuario para analizar la mayoría de las entradas de usuario estructuradas, como cadenas de fecha o markdown, en términos de riesgo de ejecución de código. Las expresiones regulares son mucho más complejas que las cadenas de fecha o la reducción (aunque la producción segura de html a partir de la reducción no confiable tiene sus propios riesgos) y, por lo tanto, representa más espacio para la explotación, pero el principio básico es el mismo: la explotación implica encontrar efectos secundarios inesperados del análisis / Proceso de compilación / emparejamiento.
La mayoría de las bibliotecas de expresiones regulares están maduras y forman parte de la biblioteca estándar en muchos idiomas, lo cual es un indicador bastante bueno (pero no cierto) de que está libre de problemas importantes que conducen a la ejecución del código.
Es decir, lo hace aumenta tu superficie de ataque, pero no es irrazonable tomar la decisión medida de aceptar ese riesgo relativamente menor.
Los ataques de denegación de servicio son un poco más complicados. Creo que la mayoría de las bibliotecas de expresiones regulares están diseñadas teniendo en cuenta el rendimiento, pero no cuentan con la mitigación de la entrada intencionalmente lenta entre sus objetivos de diseño principales. La conveniencia de aceptar expresiones regulares provistas por el usuario desde la perspectiva DoS depende más de la biblioteca.
Por ejemplo, la biblioteca de expresiones regulares .NET acepta un tiempo de espera que podría usarse para mitigar los ataques DoS.
RE2 garantiza la ejecución en tiempo lineal al tamaño de entrada que puede ser aceptable si sabe que su búsqueda se encuentra dentro de un límite de tamaño razonable.
En situaciones donde la disponibilidad es absolutamente crítica o si intentas minimizar lo más posible la superficie de ataque, tiene sentido evitar aceptar expresiones regulares de usuario, pero creo que es una práctica defendible.