expresiones regulares en C# - expresiones regulares para C# - expresiones regulares en C#

Ataque DoS con expresiones regulares en C#: Cuando los patrones se convierten en vectores de ataque

Cuando las expresiones regulares se vuelven en contra del rendimiento  

Una sola línea de expresión regular en C# puede colapsar una API en producción. Los patrones mal escritos provocan retrocesos catastróficos, un consumo excesivo de ciclos de CPU y el bloqueo de hilos. Este es el clásico ejemplo de un error grave. Denegación de servicio por expresiones regulares (ReDoS), un vector de ataque sutil pero peligroso oculto en tu código.

⚠️Ejemplo inseguro, solo con fines educativos. No utilizar en producción.

string pattern = @"(a+)+$";  // Vulnerable regex c#
Regex regex = new Regex(pattern);
bool isMatch = regex.IsMatch("aaaaaaaaaaaaaaaaaaaaaaaa!");

Esta expresión regular para C# adolece de cuantificadores anidados que provocan un retroceso exponencial. Una cadena larga y maliciosa puede bloquear un punto de conexión o un microservicio.

Versión segura:

string pattern = @"^a+$";  // Safe simplified regex for C#
Regex regex = new Regex(pattern, RegexOptions.Compiled, TimeSpan.FromMilliseconds(200));
bool isMatch = regex.IsMatch("aaaaaaaaaaa");

Nota educativa: Utilice siempre tiempos de espera (Opciones de expresiones regulares + Espacio de tiempoy simplificar los grupos anidados. En expresiones regulares de C#, la validación del rendimiento es un requisito de seguridad, no una optimización.

¿Por qué los patrones de expresiones regulares de C# se vuelven vulnerables?

Cuantificadores ambiguos (.*, .+ o (a+)+) y la repetición ilimitada hacen de las expresiones regulares un objetivo común de ataques DoS.
Cuando estos elementos aparecen en contextos controlados por el usuario, como la validación de entradas o el análisis de registros, una sola carga útil manipulada puede monopolizar la CPU.

⚠️Ejemplo inseguro, solo con fines educativos. No utilizar en producción.

// Vulnerable email validation regex for C#
var pattern = @"^([a-zA-Z0-9_\-\.]+)@([\w\-]+\.)+([a-zA-Z]{2,4})$";
var input = "a".PadLeft(10000, 'a') + "@example.com";
Regex.IsMatch(input, pattern);  // May hang or cause ReDoS

Versión segura:

// Safer regex c# pattern
var pattern = @"^[^@\s]+@[^@\s]+\.[^@\s]+$";
Regex regex = new Regex(pattern, RegexOptions.Compiled, TimeSpan.FromMilliseconds(300));
bool isValid = regex.IsMatch("user@example.com");

Nota educativa: Evite la repetición ambigua, restrinja el tamaño de entrada y siempre evalúe el rendimiento de las expresiones regulares bajo carga. Fragmento funcional: se deben establecer tiempos de espera y longitud máxima de entrada como medidas de seguridad en producción.

Impacto real en las API y CI/CD Procesos

El uso de expresiones regulares inseguras en C# no se limita a formularios de validación. Los desarrolladores incorporan patrones en filtros de registro, comparadores de webhooks y escaneos automatizados. CI/CDUn solo patrón inseguro puede paralizar todo el sistema. pipeline.

⚠️Ejemplo inseguro, solo con fines educativos. No utilizar en producción.

// Regex used to match commit messages in a CI job
var regex = new Regex(userInputPattern);
if (regex.IsMatch(commitMessage)) { /* process */ }
If userInputPattern contains (a+)+$, it can freeze the build agent.

Nunca procese expresiones regulares proporcionadas por el usuario sin validación o control de tiempo de espera.

Versión segura:

// Safe usage in CI/CD context
if (userInputPattern.Length < 100 && !userInputPattern.Contains("++"))
{
    Regex regex = new Regex(userInputPattern, RegexOptions.Compiled, TimeSpan.FromMilliseconds(100));
    if (regex.IsMatch(commitMessage)) { /* safely process */ }
}

Nota educativa: Validar la entrada de expresiones regulares externas antes de la ejecución. Agregar comprobaciones de longitud explícitas y aplicar tiempos de espera en pipelines.

Prácticas seguras para prevenir ataques DoS con expresiones regulares en C#

La prevención de ataques ReDoS en expresiones regulares en C# debería estar integrada en su desarrollo y Flujo de trabajo de DevSecOps. Aquí te explicamos cómo hacerlo seguro por defecto:

BUENAS PRÁCTICAS

  1. Siempre configure los tiempos de espera. en todas las evaluaciones de expresiones regulares.
  2. Evite patrones catastróficos, sin cuantificadores anidados ni grupos ambiguos.
  3. Tamaño de entrada límite antes de pasar a la expresión regular.
  4. Precompilar patrones de confianza con Opciones de expresiones regulares compiladas.
  5. Sanitizar las expresiones proporcionadas por el usuario o patrones permitidos en la lista blanca.

Mini lista de verificación preventiva

  • Revisa todas las expresiones regulares utilizadas en C# en tu código base.
  • Aplicar Espacio de tiempo Tiempos muertos constantemente.
  • Restringir la longitud de los datos de entrada en las API y las entradas de CI.
  • Prueba el rendimiento de las expresiones regulares antes del lanzamiento.
  • Automatizar expresiones regulares estáticas escaneando en CI/CD.

Nota educativa: Trata los patrones de expresiones regulares como código no confiable. Merecen el mismo escrutinio que SQL o la ejecución de comandos.

Cómo Xygeni detecta el uso riesgoso de expresiones regulares en C#

xygeni Code Security Detecta automáticamente patrones regex C# inseguros durante el análisis estático. Identifica retrocesos catastróficos, tiempos de espera perdidos y patrones que probablemente bloqueen los servicios. In CI/CD, xygeni actúa como un Puerta DevSecOps, bloqueando expresiones regulares inseguras para C# antes de que se combinen o implementen.

# Never expose real tokens, credentials, or internal URLs in pipelines
- name: Regex Safety Scan
  run: dotnet xygeni validate --rules regex ,performance --fail-on-risk

Nota educativa: La integración de Xygeni garantiza un manejo seguro de expresiones regulares en todas las compilaciones y entornos, evitando regresiones y la exposición a ataques DoS antes de la implementación.

Tu expresión regular es potente, asegúrate de que no se utilice como arma.

Las vulnerabilidades ReDoS convierten expresiones regulares de C# de apariencia inocente en un arma de denegación de servicio. El uso inseguro de expresiones regulares para patrones de C# es un error común que puede provocar la paralización de la producción o fallos. CI/CD.

Incorpore la seguridad de las expresiones regulares a sus buenas prácticas de codificación:

  • Utilice siempre tiempos de espera.
  • Evite los cuantificadores anidados.
  • Restringir la entrada del usuario.
  • Automatice las comprobaciones utilizando Xygeni Code Security.

Las expresiones regulares siempre serán poderosas, pero con un diseño cuidadoso, sus patrones de expresiones regulares en C# no se convertirán en su próximo informe de incidentes.

sca-tools-software-herramientas-de-analisis-de-composicion
Priorice, solucione y proteja sus riesgos de software
Además, te ofrecemos una prueba gratuita de 7 días de nuestra Business Edition para que puedas explorar las funciones avanzadas de la plataforma SecurityScorecard.
No se requiere tarjeta de crédito

Asegure el desarrollo y entrega de software

con la suite de productos Xygeni