Comentario: Prefacio: Después de que aparezca HTML5, la seguridad de la red ha atraído una atención más extendida. ¿Qué mejoras ha realizado la Web a la seguridad de la red? ¿Cómo enfrentamos un fraude y ataques cibernéticos cada vez más peligrosos? El siguiente artículo habla sobre la última solución de W3C a este problema. Si tengo la oportunidad en el futuro, llevaré a cabo contenido HTML5 en XSS, P3P, Política homóloga, CORS (intercambio de recursos de dominio cruzado) y CSP.
La política de seguridad de la red mundial se basa en una política homóloga. Por ejemplo, el código solo puede acceder a los datos, pero no tiene permisos de acceso. Cada fuente está separada del resto de la red, creando una caja de arena segura para los desarrolladores. Esto es perfecto en teoría, pero ahora los atacantes han encontrado una forma inteligente de destruir el sistema.Este es un ataque de secuencia de comandos de sitio cruzado XSS, evitando políticas homólogas a través de contenido falso y clics en trucos. Este es un gran problema, si el atacante inyecta con éxito el código, se filtrará una cantidad considerable de datos del usuario.
Ahora presentamos una estrategia de defensa de seguridad nueva y efectiva para mitigar este riesgo, que es la Política de Seguridad de Contenido (CSP).
Fuente de la lista blanca
El núcleo de los ataques XSS es que el navegador no puede decir si el script es inyectado por un tercero o es realmente parte de su aplicación. Por ejemplo, el botón Google +1 cargará y ejecutará código desde https://apis.google.com/js/plusone.js, pero no podemos esperar que se indique desde las imágenes en el navegador si el código es realmente de apis.google.com o de apis.evil.example.com. El navegador descarga y ejecuta una solicitud de página para cualquier código, independientemente de su fuente.
CSP define el encabezado de control-seguridad de contenido para permitirle crear una lista blanca de fuentes confiables, de modo que el navegador solo ejecute y haga recursos de esas fuentes, en lugar de confiar ciegamente en todo lo que proporciona el servidor. Incluso si un atacante puede encontrar una vulnerabilidad para inyectar un script, no se ejecutará porque la fuente no está incluida en la lista blanca.
El botón Google +1 anterior es un ejemplo, porque creemos que apis.google.com proporciona un código válido, así como a nosotros mismos, podemos definir una política que permita al navegador ejecutar scripts de una de las dos fuentes a continuación.
Content-Security-Policy: script-src 'self' https://apis.google.com
¿No es muy simple? Script-SRC puede controlar los permisos relacionados con el script para páginas especificadas. De esta manera, el navegador solo descargará y ejecutará scripts desde y desde esta página en sí.
Una vez que definimos esta política, el navegador arrojará un error cuando detecte el código inyectado (tenga en cuenta qué navegador es).
Las políticas de seguridad de contenido se aplican a todos los recursos comunes
Aunque los recursos de script son los riesgos de seguridad más obvios, CSP también proporciona un rico conjunto de instrucciones que permiten a las páginas controlar la carga de varios tipos de recursos, como los siguientes tipos:
Content-Src: restringir el tipo de conexión (por ejemplo, XHR, WebSockets y eventsource)
Font-Src: controla la fuente de fuentes de red. Por ejemplo, puede usar las fuentes web de Google a través de font-src https://themes.googleusercontent.com.
Frame-Src: enumera la fuente de marcos que se pueden incrustar. Por ejemplo, Frame-SRC https://youtube.com solo permite videos integrados en YouTube. .
IMG-SRC: Define la fuente de la imagen cargable.
Media-Src: restringir la fuente de video y audio.
Object-Src: restringir la fuente de flash y otros complementos.
Style-Src: similar a Script-Src, solo funciona en el archivo CSS.
Por defecto, todas las configuraciones están encendidas sin restricciones. Puede separar múltiples instrucciones de Semicolons, pero de manera similar a Script-Src https: //host1.com; script-src https://host2.com, la segunda instrucción será ignorada. La forma correcta de escribirlo es script-src https://host1.com https://host2.com.
Por ejemplo, tiene una aplicación que necesita cargar todos los recursos desde una red de distribución de contenido (CDN, por ejemplo https://cdn.example.net) y saber que el contenido de no se necesita marcos ni complementos, su estrategia podría verse así:
Content-Security-Policy: default-src https://cdn.example.net; Frame-Src 'Ninguno'; Object-Src 'Ninguno'
detalle
El encabezado HTTP que usé en mi ejemplo es la política de seguridad de contenido, pero los navegadores modernos ya han proporcionado soporte a través de los prefijos: Firefox utiliza X-Content-Security-Polyicy, WebKit usa X-Webkit-CSP. En el futuro, pasará gradualmente a estándares unificados.
La estrategia se puede configurar para cada página diferente, que proporciona mucha flexibilidad. Porque algunas páginas en su sitio pueden tener botones Google +1, mientras que otras no.
La lista de origen de cada instrucción puede ser bastante flexible. Puede especificar un patrón (datos:, https :), o especificar un nombre de host en un rango (ejemplo.com, que coincide con cualquier fuente, cualquier modo y cualquier puerto en el host), o especifique un URI completo (https://example.com:443, específicamente el protocolo HTTPS, ejemplo de dominio de ejemplo.com, puerto 443).
También puede usar cuatro palabras clave en la lista de origen:
Ninguno: puede esperar que no coincidan con cualquier cosa
Self: igual que la fuente actual, pero no contiene subdominios
inseguro en línea: permite JavaScript en línea y CSS
Insafe-Eval: mecanismos que permiten el texto a JS, como Eval
Tenga en cuenta que estas palabras clave deben cotizarse.
Salvadera
Hay otra instrucción que vale la pena discutir aquí: Sandbox. Es algo inconsistente con otras instrucciones. Controla principalmente el comportamiento tomado en la página, en lugar de los recursos que la página puede cargar. Si esta propiedad está configurada, la página se comportará como un marco con la propiedad Sandbox establecida. Esto tiene una amplia gama de impacto en la página, como prevenir los envíos de formularios, etc. Esto está un poco más allá del alcance de este artículo, pero puede encontrar más información en la sección Configuración del logotipo de Sandbox de la especificación HTML5.
Código en línea dañino
CSP se basa en las medidas blancas de origen, pero no resuelve la mayor fuente de ataques XSS: inyección en línea de script. Si un atacante puede inyectar etiquetas de script que contienen código dañino (<Script> sendMydatoEvildOtCom (); </script>), el navegador no tiene un buen mecanismo para distinguir esta etiqueta. CSP solo puede resolver este problema prohibiendo completamente los scripts en línea.
Esta prohibición incluye no solo etiquetas de script integradas en el script, sino también manejadores de eventos en línea y Javascrpt: URLS. Debe poner el contenido de la etiqueta de script en un archivo externo y reemplazar JavaScript: y <a ... onClick = [javaScript]> con el addEventListener apropiado. Por ejemplo, puede poner el siguiente formulario:
<script>
función doamazingThings () {
alerta ('¡Soy increíble!');
}
</script>
<botón> ¿Soy increíble? </boton>
Reescribir a la siguiente forma:
<!-Amazing.html->
<script src = 'amable.js'> </script>
<botón> ¿Soy increíble? </boton>
// Amazing.js
función doamazingThings () {
alerta ('¡Soy increíble!');
}
document.addeventListener ('DomContentReady', function () {
document.getElementById ('Amazing')
.adDeventListener ('hacer clic', doamazingthings);
});
Independientemente de si usa CSP o no, el código anterior en realidad tiene mayores ventajas. JavaScript en línea mezcla completamente la estructura y el comportamiento, no debe hacerlo. Además, los recursos de divulgación son más fáciles de almacenar en los navegadores, más fáciles de entender para los desarrolladores y son fáciles de compilar y comprimir. Si usa el código de divulgación, escribirá un mejor código.
Los estilos en línea deben procesarse de la misma manera, tanto los atributos de estilo como las etiquetas de estilo deben extraerse en la hoja de estilo externa. Esto puede evitar todo tipo de fuga de datos mágicos.
Si tiene que tener scripts y estilos en línea, puede establecer el valor 'inseguro en línea para el atributo script-src o style-src. Pero no hagas esto. Prohibir los scripts en línea es la garantía máxima de seguridad proporcionada por CSP. Al mismo tiempo, los estilos en línea prohibidos pueden hacer que su aplicación sea más segura y más robusta. Es una compensación, pero vale la pena.
Evaluación
Incluso si un atacante no puede inyectar el script directamente, puede inducir su aplicación a convertir el texto insertado en un script ejecutable y ejecutarlo en sí mismo. eval (), NewFunction (), SetTimeOut ([String], ...) y SetInterval ([String], ...) pueden convertirse en portadores tan peligrosos. La estrategia para que CSP se dirige a este riesgo es bloquear estos vectores por completo.
Esto tiene algunas implicaciones en la forma en que construye su aplicación:
Analice JSON a través de JSON. Los navegadores después de IE8 admiten operaciones JSON locales, que es completamente segura.
Reescribe el método de llamada de SetTimeOut y SetInterval por funciones en línea en lugar de cadenas. Por ejemplo:
setTimeOut (document.queryselector ('a'). style.display = 'none';, 10);
Se puede reescribir como:
setTimeOut (function () {document.querySelector ('a'). style.display = 'none';}, 10);
Evite las plantillas en línea en tiempo de ejecución: muchas bibliotecas de plantillas usan una nueva función () para acelerar la generación de plantillas. Esto es ideal para programas dinámicos, pero es arriesgado para el texto malicioso.
Informe
CSP puede bloquear los recursos no confiables en el lado del servidor, lo cual es muy útil para los usuarios, pero es muy útil para nosotros enviar varias notificaciones al servidor, para que podamos identificar y solucionar cualquier inyección de script maliciosa. Para este propósito, puede instruir al navegador que envíe un informe de intercepción en formato JSON a una dirección a través de la Directiva Report-URI.
Content-Security-Policy: default-src 'self'; ...; informar-uri /my_amazing_csp_report_parser;
El informe se verá así:
{
CSP-Report: {
document-uri :,
referente :,
bloqueado-uri :,
Violent-Directive: script-src 'self' https://apis.google.com,
Original-Policy: script-src 'self' https://apis.google.com; Informe-uri
}
}
La información contenida en él lo ayudará a identificar la situación de bloqueo, incluido el documento-URI que ocurre, el referente de página, el recurso que viola la política de la página, la directiva violada y la política original de todo el contenido de la página.
Uso realista
CSP ahora está disponible en los navegadores Chrome 16+ y Firefox 4+, y se espera que reciba un soporte limitado en IE10. Safari aún no es compatible, pero la construcción nocturna WebKit está disponible, por lo que se espera que Safari sea compatible con la iteración a continuación.
Veamos algunos casos de uso comúnmente utilizados a continuación:
Caso real 1: Widget de redes sociales
El botón Google +1 incluye scripts de https://apis.google.com, así como iframes integrados de https://plusone.google.com. Su política debe incluir estas fuentes para usar el botón Google+1. La estrategia más fácil es script-src https://apis.google.com; Frame-src https://plusone.google.com. También debe asegurarse de que los fragmentos JS proporcionados por Google se almacenen en archivos JS externos.
Hay muchas soluciones de implementación para el botón como Facebook. Le recomiendo que se adhiera a la versión de iframe, ya que se mantiene bien aislado del resto de su sitio. Esto requiere el uso de la directiva Frame-SRC https://facebook.com. Tenga en cuenta que de forma predeterminada, el código iframe proporcionado por Facebook usa la ruta relativa //facebook.com. Modifique este código a https://facebook.com. No hay necesidad de que HTTP no lo use.
El botón de tweet de Twitter depende del script y el marco, tanto desde https://platform.twitter.com (Twitter proporciona una URL relativa de forma predeterminada, edite el código al copiarlo para especificarlo como https).
Otras plataformas tienen situaciones similares y se pueden resolver de manera similar. Recomiendo configurar el SRC predeterminado a ninguno y luego mirar la consola para verificar qué recursos necesita usar para asegurarse de que el widget funcione correctamente.
El uso de múltiples widgets es muy simple: simplemente fusione todas las directivas de políticas y recuerde reunir la configuración de la misma directiva. Si desea usar los tres widgets anteriores, la estrategia se verá así:
script-src https://apis.google.com https://platform.twitter.com; Frame-src https://plusone.google.com https://facebook.com https://platform.twitter.com
Caso real 2: defensa
Supongamos que visita un sitio web bancario y desea asegurarse de que solo se carguen los recursos que necesita. En este caso, comience a establecer un permiso predeterminado para bloquear todo (predeterminado-SRC 'Ninguno') y cree la política desde cero.
Por ejemplo, un sitio web bancario necesita cargar imágenes, estilos y scripts del CDN desde https://cdn.mybank.net, y conectarse a https://api.mybank.com/ a través de XHR para extraer varios datos. También necesita usar un marco, pero los marcos son de páginas locales que no son de terceros. No hay flash, fuentes y otro contenido en el sitio web. En este caso podemos enviar el encabezado CSP más estricto es:
Content-Security-Policy: default-SRC 'Ninguno'; script-src https://cdn.mybank.net; style-src https://cdn.mybank.net; img-src https://cdn.mybank.net; conectar-src https://api.mybank.com; marco-src 'yo'
Caso real 3: Use solo SSL
Un administrador del foro de anillo de bodas quiere que todos los recursos se carguen de manera segura, pero no quiere escribir demasiado código; Reescribir una gran cantidad de scripts y estilos en línea del foro de terceros está más allá de su habilidad. Entonces, la siguiente estrategia será muy útil:
Content-Security-Policy: Predeterminado SRC HTTPS:; script-src https: 'insegurar en línea'; https de style-src: 'inseguro en línea'
Aunque el SRC predeterminado especifica HTTPS, los scripts y los estilos no se heredan automáticamente. Cada directiva anulará por completo el tipo de recurso predeterminado.
futuro
El grupo de trabajo de seguridad de aplicaciones web del W3C está desarrollando detalles de las especificaciones de política de seguridad de contenido. La versión 1.0 ingresará a la etapa de revisión final, que está muy cerca de lo que se describe en este artículo. El grupo de correo electrónico de WebAppSec@ está discutiendo la versión 1.1, y los fabricantes de navegadores también están trabajando arduamente para consolidar y mejorar la implementación de CSP.
CSP 1.1 tiene algunas cosas interesantes en el Artboard que vale la pena enumerar por separado:
Agregar políticas a través de metaetiquetas: la forma preferida de establecer CSP es los encabezados HTTP, lo cual es muy útil, pero será más directo a través de etiquetas o scripts, pero aún no se ha finalizado. WebKit ha implementado la función de la configuración de permisos a través de Meta Elements, por lo que ahora puede probar la siguiente configuración en Chrome: Agregar <metahttp-oquiv = x-webkit-csp content = [Policy va aquí]> al encabezado del documento.
Incluso puede agregar políticas a través de scripts en tiempo de ejecución.
API DOM: si esta función se agrega a la siguiente iteración de CSP, puede consultar la política de seguridad actual de la página a través de JavaScript y ajustarla de acuerdo con diferentes situaciones. Por ejemplo, si eval () está disponible, la implementación de su código puede ser ligeramente diferente. Esto es muy útil para el autor del marco JS; Y la especificación API sigue siendo muy incierta, puede encontrar la última iteración en la sección de interfaz de script de la especificación del borrador.
Nuevas directivas: se están discutiendo muchas directivas nuevas, incluido el script-noz: los scripts en línea solo se pueden usar si se utilizan los elementos de script especificados explícitamente; Tipo de complemento: esto limitará el tipo de complemento; Form-Action: permita que el formulario se envíe solo a una fuente específica.
Si está interesado en discusiones sobre estas características futuras, puede leer el archivo de la lista de correo o agregarlo a la lista de correo.
Este artículo se traduce de:
Extraído de: Blog de Jiang Yujie