Insecure HTTP Header Setting: Content Security Policy (CSP)
Configuración de encabezado HTTP inseguro: Content Security Policy (CSP)
Descripción
La Content Security Policy (CSP) es un estándar de seguridad informática que proporciona una capa adicional de protección contra el Cross-Site Scripting (XSS), el clickjacking y otros ataques del lado del cliente que se basan en la ejecución de contenido malicioso en el contexto de un recurso web de confianza.
Puede especificar de forma selectiva qué fuentes de datos deben permitirse en su aplicación web utilizando las directivas CSP adecuadas en los encabezados de respuesta HTTP. Este artículo muestra cómo utilizar los encabezados CSP para proteger los sitios web contra los ataques XSS y otros intentos de eludir la política de mismo origen (same-origin policy).
La CSP se puede habilitar indicando al navegador una directiva Content-Security-Policy en un encabezado de respuesta:
Content-Security-Policy: script-src 'self';
O en una etiqueta meta;
<meta http-equiv="Content-Security-Policy" content="script-src 'self';">
Puede restringir la carga de scripts solo al mismo dominio en el ejemplo anterior. También limitará las ejecuciones de scripts en línea (inline) en los atributos de los elementos y los manejadores de eventos.
Existen varias directivas que puede utilizar al declarar la CSP:
- script-src: Restringe los recursos de carga de scripts a los que haya declarado. Por defecto, deshabilita las ejecuciones de scripts en línea (inline) a menos que permita las funciones de evaluación y los scripts en línea mediante las palabras clave unsafe-eval y unsafe-inline.
- base-uri: El elemento base se utiliza para resolver una URL relativa a una absoluta. Al utilizar esta directiva CSP, puede definir todas las URL posibles que podrían asignarse al atributo base-href del documento.
- frame-ancestors: Es muy similar al encabezado HTTP X-Frame-Options. Define las URL mediante las cuales la página se puede cargar en un iframe.
- frame-src / child-src: frame-src es la versión en desuso de child-src. Ambas definen las fuentes que pueden ser cargadas por iframe en la página. (Tenga en cuenta que frame-src se reintrodujo en CSP 3).
- object-src : Define los recursos que se pueden cargar mediante la incrustación, como archivos Flash o Applets de Java.
- img-src: Como su nombre indica, define los recursos desde los cuales se pueden cargar las imágenes.
- connect-src: Define los objetivos en la lista blanca para los objetos XMLHttpRequest y WebSocket.
- default-src: Es una alternativa (fallback) para las directivas que terminan principalmente con el sufijo
-src. Cuando las siguientes directivas no están definidas, se utilizará en su lugar el valor asignado a default-src:child-srcconnect-srcfont-srcimg-srcmanifest-srcmedia-srcobject-srcscript-srcstyle-src
Al configurar las directivas CSP, también puede utilizar algunas palabras clave de CSP:
- none: Deniega la carga de recursos desde cualquier lugar.
- self : Apunta a la URL del documento (dominio + puerto).
- unsafe-inline: Permite ejecutar scripts en línea (inline).
- unsafe-eval: Permite la ejecución de funciones de evaluación como eval().
Además de las palabras clave de CSP, puede usar un comodín (wildcard) o solo un esquema al definir URL en la lista blanca para los puntos de acceso. El comodín se puede usar para las porciones de subdominio y puerto de las URL:
Content-Security-Policy: script-src https://*.ostorlab.com;
Content-Security-Policy: script-src https://ostorlab.com:*;
Content-Security-Policy: script-src https://ostorlab.com:*;
También es posible establecer una CSP en modo Report-Only (solo informe) en lugar de forzarla inmediatamente en el período de migración. De este modo, puede ver las infracciones de la política CSP en el estado actual de su sitio web mientras migra a CSP:
Content-Security-Policy-Report-Only: script-src 'self'; report-uri: https://ostorlab.com;
Soporte de CSP en navegadores
La Content Security Policy es compatible con todos los principales navegadores modernos y lo ha sido durante muchos años. No es compatible con Internet Explorer.
Chrome:
- Content-Security-Policy CSP
Level 3-Chrome 59+( Soporte parcial ) - Content-Security-Policy CSP
Level 2-Chrome 40+( Soporte completo desde enero de 2015 ) - Content-Security-Policy CSP
1.0-Chrome 25+ - X-Webkit-CSP
Deprecated-Chrome 14-24
Firefox:
- Content-Security-Policy CSP
Level 3-Firefox 58+( Soporte parcial ) - Content-Security-Policy CSP
Level 2-Firefox 31+( Soporte parcial desde julio de 2014 ) - Content-Security-Policy CSP
1.0-Firefox 23+( Soporte completo ) - X-Content-Security-Policy
Deprecated-Firefox 4-22
Safari:
- Content-Security-Policy CSP
Level 3-Safari 15.4+( Soporte parcial ) - Content-Security-Policy CSP
Level 2-Safari 10+ - Content-Security-Policy CSP
1.0-Safari 7+ - X-Webkit-CSP
DeprecatedSafari 6
Edge:
- Content-Security-Policy CSP
Level 3-Edge 79+( Soporte parcial ) - Content-Security-Policy CSP
Level 2-Edge 15+( Parcial, 76+ Completo ) - Content-Security-Policy CSP
1.0-Edge 12+
Internet Explorer:
- X-Content-Security-Policy
Deprecated-IE 10-11( solo admite sandbox )
Recomendación
- Habilite la CSP en su sitio web enviando Content-Security-Policy en los encabezados de respuesta HTTP que instruyen al navegador a aplicar las políticas que especificó.
- Aplique la lista blanca y las políticas de la forma más estricta posible.
- Vuelva a escanear su aplicación para ver si Ostorlab identifica alguna debilidad en sus políticas.
- Use frame-src para evitar que se carguen iFrames en su sitio:
Content-Security-Policy:frame-src 'none' - Use script-src para evitar que se cargue JavaScript en su sitio:
Content-Security Policy:script-src 'none' - Restrinja el contenido que no sean imágenes con img-src:
Content-Security-Policy: default-src 'self'; img-src *; - Use default-src para permitir que el contenido se cargue solo desde el mismo origen, su sitio web y sus subdominios:
Content-Security-Policy: default-src 'self' *.sucuri.net; - Solo permita medios u otros scripts ejecutables del mismo origen:
Content-Security-Policy: default-src 'self'; img-src *; media-src sucuri.net; script-src sucuri.net; - Solo permita imágenes, scripts, acciones de formulario y CSS del mismo origen:
default-src 'none'; script-src 'self'; img-src 'self'; style-src 'self';base-uri 'self';form-action 'self'
Enlaces
Estándares
- OWASP_ASVS_L3:
- V2_2_5
- PCI_STANDARDS:
- REQ_6_2
- REQ_6_3
- REQ_6_4
- REQ_11_3
- HIPAA_CONTROLS:
- SECURITY212
- SECURITY213