Service Worker Malicioso
Un service worker registrado sin restricciones de scope puede interceptar todas las requests de red de un dominio, incluyendo las de otras páginas.
Cómo Funciona
Los service workers actúan como un proxy de red entre tu app y el servidor. Si un usuario puede registrar un service worker en el scope raíz ('/'), ese worker intercepta todos los fetch del origen — incluyendo formularios de login y llamadas a la API. Vulnerabilidades XSS o endpoints de registro abiertos pueden permitir que atacantes planten service workers persistentes.
// MAL: sin restricción de scope, se registra en la raíz por default
navigator.serviceWorker.register('/sw.js');// BIEN: restringe el scope solo a las rutas que tu PWA necesita
navigator.serviceWorker.register('/app/sw.js', {
scope: '/app/' // solo intercepta requests de /app/*
});Ejemplo Real
Investigadores demostraron XSS persistente via service workers en sitios que permitían JavaScript proporcionado por usuarios o endpoints de registro de SW abiertos. Una vez registrado, el SW malicioso sobrevive a recargas de página y puede exfiltrar credenciales indefinidamente.
Cómo Prevenirlo
- Siempre establece un scope explícito al registrar service workers
- Sirve los archivos de service worker con headers 'Service-Worker-Allowed' restringidos a la ruta de tu app
- Agrega un header Content-Security-Policy que restrinja las fuentes de scripts
- Audita qué URLs pueden registrar service workers y requiere autenticación para esos endpoints
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Contaminación de Prototipo
highHacer merge de objetos controlados por el usuario sin filtrar permite que atacantes modifiquen Object.prototype y afecten todos los objetos de la app.
ReDoS (Denegación de Servicio por Regex)
mediumLas expresiones regulares con cuantificadores anidados pueden tomar tiempo exponencial con ciertos inputs, congelando el event loop de Node.js.
Aleatoriedad Insegura
highUsar Math.random() para valores sensibles como tokens o IDs es predecible y puede romperse por fuerza bruta.