Alta

@angular/router: Denegación de servicio mediante coincidencia no válida de rutas de outlets con ruta vacía en Server-Side Rendering (SSR)

  • Publicada: 20.10.2026
  • Actualizado: 20.10.2026 18:20

Se ha identificado una vulnerabilidad de denegación de servicio (DoS) en @angular/router cuando Server-Side Rendering (SSR) está habilitado en Node.js (V8).

Durante el reconocimiento de rutas, @angular/router no valida si un segmento de outlet auxiliar en la URL coincide con una ruta configurada para ese nombre de outlet específico. Debido a que los grupos de outlets de ruta vacía no configurados (como a:/(), x:/(...) o ///(...)) no se descartan durante la coincidencia, el router reevalúa repetidamente la configuración de rutas frente a cada segmento de outlet arbitrario proporcionado en la URL.

Cuando una URL de solicitud contiene múltiples segmentos arbitrarios de outlets con ruta vacía, esta coincidencia indebida obliga al router a instanciar árboles ActivatedRouteSnapshot duplicados, ejecutar repetidamente guardas y resolvers de rutas canMatch, y asignar copias independientes de parámetros de ruta y queryParams para cada outlet no configurado.

Un atacante remoto no autenticado puede explotar este comportamiento enviando solicitudes con segmentos de outlet manipulados para agotar el heap de memoria de Node.js o sobrecargar los recursos de CPU, provocando la terminación del worker de SSR y la interrupción del servicio.

Impacto

La explotación exitosa permite a un atacante remoto no autenticado agotar el heap de Node.js con una única solicitud manipulada o una pequeña cantidad de solicitudes concurrentes, terminando el proceso worker de SSR debido a un bloqueo fatal por memoria insuficiente (out-of-memory) en el heap de JavaScript. Cuando las rutas coincidentes declaran guardas o resolvers canMatch, una sola solicitud corta también puede desencadenar ejecuciones repetidas de guardas o resolvers, incrementando la carga en los servicios de backend y reteniendo abiertas las conexiones de los workers.

  • Asignación transitoria: La memoria se libera una vez completado el reconocimiento de la ruta; no hay una fuga de memoria persistente. El impacto principal es la terminación del proceso.
  • SPAs del lado del cliente no afectadas: Las aplicaciones Angular del lado del cliente que se ejecutan en el navegador no son vulnerables, ya que el consumo de memoria del navegador no cruza un límite de seguridad.
  • Prerenderizado (SSG) no afectado: El prerenderizado en tiempo de compilación no procesa URLs de solicitud suministradas por atacantes.

Condiciones previas para el ataque y configuraciones vulnerables

Una aplicación se ve afectada únicamente si se cumplen todas las condiciones siguientes:

  1. SSR habilitado: La aplicación se renderiza bajo demanda en un servidor Node.js / V8.
  2. Configuración de rutas susceptible: Al menos un nivel de la configuración de rutas contiene:
    • una ruta de trayectoria vacía (path: "") (p. ej., {path: "", component: ShopPage}), o bien
    • una ruta asignada a un outlet nombrado (p. ej., {path: "dashboard", children: [{path: ":id", outlet: "detail", component: DetailPanel}]}).
  3. Reenvío de línea de solicitud ascendente: Las líneas de solicitud llegan al proceso Node.js sin ser rechazadas previamente por proxys perimetrales. Node.js acepta encabezados de solicitud de hasta 16 KiB de forma predeterminada. La amplificación de guardas/resolvers solo requiere una URL corta.
  4. Tamaño de heap restringido: Los heaps de los workers tienen un tamaño lo suficientemente reducido en relación con la carga útil de la solicitud y la concurrencia (p. ej., contenedores o instancias serverless configuradas con 128 MiB–1 GiB).

Ejemplos de carga útil de explotación

Frente a una configuración con rutas de trayectoria vacía (path: "") y parámetros de consulta:

http
GET /shop/(a:/()//b:/()//c:/()//...)?param1=value&param2=value... HTTP/1.1
Host: example.com

Frente a una configuración con rutas hermanas o con outlets nombrados:

http
GET /dashboard/(detail:1//x:/(detail:1//x:/(...)//y:/(...))//y:/(...)) HTTP/1.1
Host: example.com

Qué hacer

Parches

El problema se resuelve en angular/angular#71055.. El router ahora requiere que cada grupo de segmentos de outlet secundarios coincida con una ruta configurada para su outlet de destino antes de desempaquetar segmentos secundarios o completar una coincidencia, y evita que grupos de outlets de ruta vacía no configurados coincidan con rutas declaradas para otros outlets.

Versiones parcheadas:

  • 22.2.1
  • 21.2.25
  • 20.3.33

Las versiones anteriores a la v20 también están afectadas, pero ya no tienen soporte y no recibirán un parche.

Mitigaciones y soluciones temporales

Si no puede actualizar inmediatamente a una versión corregida, aplique una o más de las siguientes mitigaciones:

  1. Rechazar URLs con paréntesis o outlets de ruta vacía en middleware o WAF (Recomendado): En @angular/router, los grupos de outlets auxiliares en una URL siempre usan paréntesis (...), y los grupos de outlets de ruta vacía en una URL siempre adoptan la forma :/( , (/ o ///( .

    • Si su aplicación no utiliza outlets nombrados (auxiliares) en las URLs, rechace las solicitudes cuya ruta contenga ( o ) antes de que Angular SSR procese la solicitud.
    • Si su aplicación utiliza outlets nombrados, rechace las solicitudes cuya ruta contenga secuencias de outlets de ruta vacía (:/( , (/ o ///( ).

    A diferencia de los límites de longitud de URL, esto bloquea por completo tanto el agotamiento del heap como la amplificación de guardas/resolvers mediante URLs cortas:

    ts
    // server.ts (placed before Angular SSR handler)
    app.use((req, res, next) => {
      let pathname: string;
      try {
        pathname = decodeURI(req.url.split(/[?#]/, 1)[0]);
      } catch {
        res.status(400).send("Bad Request");
        return;
      }
    
      // Option A: If the app does not use named outlets in URLs, block all parenthesized groups:
      if (/[()]/.test(pathname)) {
        res.status(400).send("Bad Request");
        return;
      }
    
      // Option B: If the app uses named outlets, block only empty-path outlet groups:
      if (/:\/\(|\(\//\(|\/\/\/\(/.test(pathname)) {
        res.status(400).send("Bad Request");
        return;
      }
    
      next();
    });
  2. Limitar la longitud de la URL en el proxy inverso o middleware: Configure su proxy perimetral, firewall de aplicaciones web (WAF) o proxy inverso para rechazar solicitudes con URLs excesivamente largas (p. ej., que superen los 2,048 bytes). La porción de outlet de la carga útil está en la ruta, por lo que debe limitar el destino completo de la solicitud y no solo la cadena de consulta. Esto reduce, pero no elimina, la amplificación de guardas/resolvers, que solo requiere una URL corta.

  3. Aumentar el Old Space de Node.js: Aumentar --max-old-space-size eleva el tamaño de la solicitud y la concurrencia requeridos para agotar la memoria, aunque no elimina el problema de raíz.

Software afectado

Haz clic en una tecnología para ver todas sus vulnerabilidades.

PlataformaPaqueteVersiones vulnerablesCorregida en
Paquete de npm @angular/router >= 22.0.0, < 22.2.1, >= 21.0.0, < 21.2.25, >= 20.0.0, < 20.3.33, <= 19.2.25 22.2.1, 21.2.25, 20.3.33

Referencias

Puntuación CVSS -
Vector CVSS
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Debilidad (CWE)
CWE-400, CWE-405
Plataforma
npm
Paquete
@angular/router
Publicada
20.10.2026
Actualizado
20.10.2026 18:20

Fuentes y licencias · Editado o traducido por DockRay; se mantienen los derechos y las licencias de las fuentes.

OSV / GitHub Advisory Database - GHSA-62vg-58rm-qff7 - CC BY 4.0

Historial de vulnerabilidades: @angular/router

Todas las vulnerabilidades publicadas de este paquete (Paquete de npm), de la más reciente a la más antigua. Muestra si es un fallo aislado o un paquete que hay que vigilar.

Entradas en total
2
Primera → última
09.2026 10.2026
Sin corrección
0
Explotada en ataques
0

Distribución por gravedad

  • Alta 2

Divulgaciones por año

  1. 2026: 2
  1. @angular/router: Denegación de servicio mediante coincidencia no válida de rutas de outlets con ruta vacía en Server-Side Rendering (SSR) esta entrada
    Alta CVE-2026-111752 >= 22.0.0, < 22.2.1, >= 21.0.0, < 21.2.25, >= 20.0.0, < 20.3.33, <= 19.2.25 22.2.1, 21.2.25, 20.3.33
  2. Alta CVE-2026-101896 >= 22.0.0, < 22.2.0, >= 21.0.0, < 21.2.24, >= 20.0.0, < 20.3.32, <= 19.2.25 22.2.0, 21.2.24, 20.3.32

Identifica las vulnerabilidades de tu aplicación

Con la integración de DockRay y el inventario de software activado, DockRay compara las versiones notificadas de los componentes con las vulnerabilidades conocidas y avisa de las coincidencias confirmadas. La cobertura depende de la tecnología compatible y de los avisos disponibles.

Conectar tu aplicación
Newsletter DockRay

La seguridad de tus aplicaciones en tu correo

Vulnerabilidades importantes, recomendaciones concretas y consejos prácticos para tus aplicaciones. Elige tus tecnologías y sigue lo que importa para tu proyecto.

  • Un resumen diario de nuevas vulnerabilidades, también las críticas.
  • Avisos sobre actualizaciones importantes.
  • Consejos prácticos sobre seguridad y monitorización de aplicaciones.

Déjalo vacío para recibir avisos de todas las tecnologías.

Suscripción gratuita. Date de baja con un clic en cualquier correo.