Por qué necesitas una política de seguridad de contenido sólida
por Sebastian Grimm
Security SpecialistLa Importancia de los Encabezados de Seguridad
¿Qué es un CSP?
Piensa en el CSP como tu segunda línea de defensa. Si un atacante logra encontrar una vulnerabilidad, el CSP hace mucho más difícil que la explote. Consideremos un ejemplo concreto.
El Peligro del Cross-Site Scripting
Podrías pensar, "Pero si mi aplicación no es vulnerable a XSS, ¿no aporta nada un CSP?" ¿Estás realmente seguro de que no eres vulnerable? XSS puede ser uno de los métodos de ataque 'clásicos', pero sigue siendo un problema que afecta a muchas organizaciones. Más del 30% de las aplicaciones evaluadas por Computest Security en el último año fueron vulnerables a alguna forma de XSS [3]. Ten en cuenta que el cliente promedio de Computest Security ya es muy consciente de la seguridad y realiza pruebas de seguridad regularmente en sus aplicaciones. Por lo tanto, el número real de aplicaciones vulnerables a XSS probablemente sea aún mayor. No es un lujo establecer un CSP fuerte. Puede proporcionar ese extra de seguridad que necesitas para mitigar riesgos desconocidos.
¿Cómo Funciona el CSP?
Como con toda pregunta interesante, la respuesta es: depende. En este caso, depende de tu aplicación y cómo está estructurada. Veamos algunos ejemplos de posibles CSPs devueltos como encabezados de respuesta HTTP.

Centrarse en la directiva script-src, que maneja todas las fuentes de JavaScript como archivos *.js o código en línea entre etiquetas , esta directiva te protege contra vulnerabilidades con el mayor impacto.
Si tu aplicación (https://example.com) está configurada de manera que todo el JavaScript utilizado proviene de un dominio dedicado (https://js.example.com), entonces un CSP que te proteja contra muchos tipos de ataques XSS podría verse así:

Cualquier script cargado desde otra fuente no se ejecutará. Lo mismo aplica para cualquier JavaScript en línea. Si también se necesitan incluir scripts desde el mismo dominio que aloja la aplicación, podría verse así:


Este valor debe coincidir con el valor especificado en una etiqueta en la misma respuesta.

Si no se incluye el nonce adecuado, el código no se ejecuta. El valor del nonce cambia con cada solicitud, lo que impide que un atacante lo prediga con anticipación, haciendo que cualquier vulnerabilidad XSS potencial no sea explotable. Un método alternativo es usar un valor hash, calculado sobre el contenido completo de la etiqueta , asegurando que hashes no coincidentes signifiquen que no hay ejecución. Esto previene que un atacante inyecte su código malicioso.
Si no desarrollaste tu aplicación con un CSP en mente, elige una solución que se adapte a tu arquitectura. Afortunadamente, existen bibliotecas para varios frameworks de aplicaciones web que facilitan la implementación.
Los ejemplos proporcionados aquí no muestran todas las posibilidades de un CSP. Permite configuraciones detalladas para todos los recursos potenciales en una página HTML. ¿Interesado? Los enlaces al final de este blog ofrecen material de lectura adicional.
Errores de Implementación con un CSP
- Si incluyes 'unsafe-inline' en la directiva script-src, esto permite todo el JavaScript en línea. Como su nombre indica, esto presenta un alto riesgo, anulando la mayoría de los beneficios de un CSP.
- Cuando se pueden subir y descargar archivos desde el dominio de la aplicación, existe un alto riesgo de que esto pueda ser explotado para eludir un CSP que permita ‘self’ en la directiva script-src, haciendo que tu aplicación sea vulnerable.
- Si permites un CDN o un host de fuente pública como AWS S3 (por ejemplo, https://s3.eu-central-1.amazonaws.com), un atacante puede usar estos servicios para alojar sus exploits maliciosos. Cualquiera puede crear una cuenta AWS para alojar recursos en S3, lo que representa riesgos potenciales.
- Si usas nonces, deben ser suficientemente aleatorios y usarse solo una vez. De lo contrario, un atacante puede reutilizar el nonce para sus ataques.
- Si permites JavaScript en línea con un valor nonce, el CSP no protege contra la inyección de JavaScript directamente en el script. Una etiqueta aprobada con un valor nonce siempre se ejecutará independientemente de su contenido.
- Los hosts permitidos con endpoints JSONP pueden ser explotados por atacantes para eludir parcialmente un CSP mediante el uso indebido de la funcionalidad de callback, potencialmente permitiendo la ejecución arbitraria de JavaScript.
Debido a estas configuraciones erróneas comunes, un CSP basado en nonce o hash combinado con 'strict-dynamic' se considera generalmente el enfoque más seguro [4]. Esto te permite especificar con precisión qué scripts pueden ejecutarse sin necesidad de incluir en la lista blanca todo el host. Un ejemplo de cómo podría verse:

Luego se puede incluir contenido adicional dentro del HTML:


