El CSP en dicha configuración debería habilitar las siguientes medidas de seguridad:
- Deshabilitar scripts en línea
- Deshabilitar estilos en línea
- Deshabilitar todo uso de funciones de JavaScript peligrosas (por ejemplo, eval)
- Forzar que todo el contenido se cargue solo desde el dominio existente. Esto aplica a:
- JavaScript
- CSS
- Fuentes (por ejemplo, WOFF)
- Ajax (XmlHttpRequest y similares)
- WebSockets
- video
- Objetos (por ejemplo, Flash, applets de Java)
- SVGs
- activos de WebGL
- Marcos
- Imágenes
- Probablemente algunas otras cosas que olvidé ...
Como tal, XSS debería ser posible solo en los casos en que los recursos en el dominio pueden ser controlados por un atacante, como usted mencionó.
Puede bloquear el CSP aún más configurando default-src 'none'
y luego habilitando explícitamente solo los tipos de contenido que espera usar en el sitio. Esto ayuda a reducir aún más su superficie de ataque al deshabilitar tipos de contenido como Flash, applets de Java, SVG, lienzos, etc. cuando no los está utilizando.
Un vector adicional que quizás no haya considerado es Anulaciones de la hoja de estilo relativa al camino (PRSSI) , de lo contrario conocido como vulnerabilidades de sobrescritura de ruta relativa (RPO). Estos funcionan aprovechando el comportamiento de manejo de URL en algunos software de CMS, donde los caracteres de ruta aparecen después de que se toma un script como parámetros (por ejemplo, example.com/wiki/index.php/Something
muestra la página Something
). Cuando se incluye una hoja de estilo relativa a la ruta (por ejemplo, main.css
en lugar de /main.css
), esto puede abusarse algunas veces. En nuestro ejemplo, debido a que main.css
se importa en relación con la ruta actual, una inclusión en la URL de ejemplo anterior podría hacer que el navegador intente cargar example.com/wiki/index.php/main.css
como una hoja de estilo. Si puedes crear una página wiki llamada main.css
, esto te permitiría controlar el contenido de esa hoja de estilo y potencialmente cargar CSS malicioso (por ejemplo, con la directiva expression
). Puedes hacer lo mismo con las importaciones de JavaScript relativas a la ruta. La solución aquí es siempre hacer referencia al contenido por su ruta canónica completa.