¿Serán las cookies del mismo sitio una protección suficiente contra CSRF y XSS?

15

Debo decir que me gusta esta idea y parece que traerá una nueva forma de protección contra CSRF y XSS o al menos reducirá esos ataques.

Entonces, ¿qué tan efectiva será esta protección?

  

SameSite-cookies es un mecanismo para definir cómo deben ser las cookies.   enviado a través de dominios. Este es un mecanismo de seguridad desarrollado por Google.   y en este momento está presente en Chrome-dev (51.0.2704.4) . El propósito   de SameSite-cookies es [try] para evitar ataques CSRF y XSSI. Usted puede   Lea el borrador aquí. (Source)

    
pregunta Mirsad 30.04.2016 - 11:37
fuente

2 respuestas

16

Primero, una definición de Chrome :

  

Las cookies del mismo sitio (née "First-Party-Only" (née "First-Party")) permiten a los servidores mitigar el riesgo de CSRF y de ataques de fuga de información al afirmar que una cookie en particular solo debe enviarse con solicitudes iniciadas del mismo dominio registrable.

Entonces, ¿contra qué protege esto?

CSRF?

Las cookies del mismo sitio pueden prevenir eficazmente los ataques CSRF. ¿Por qué?

Si configura la cookie de sesión como el mismo sitio, solo se enviará si una solicitud emana de su sitio. Por lo tanto, un ataque CSRF estándar donde el atacante atrae a la víctima al sitio http://malicious.com que publica una solicitud a http://bank.com/transfer.php?amount=10000&receiver=evil_hacker no funcionará. Como malicious.com no es el mismo origen que bank.com , el navegador no enviará la cookie de sesión y transfer.php se ejecutará como si la víctima no hubiera iniciado sesión.

Esto es muy similar a cómo la configuración de un encabezado HTTP X-Csrf-Token lo protege de CSRF; nuevamente, hay algo que solo se envía si la solicitud proviene de su dominio. La propiedad del mismo sitio convierte su cookie de sesión en un token CSRF.

Entonces, ¿problema resuelto? Especie de. Hay algunas advertencias:

  • Esto solo funcionará para los navegadores que implementan esta función. Hasta ahora, muy pocos lo hacen. A menos que desee lanzar a todos los que usan un navegador un poco más antiguo debajo del bus, todavía necesitará implementar un token CSRF antiguo.
  • Si necesita un control más preciso, esto no será suficiente. Si ejecuta un sistema que muestra contenido de usuario no confiable, como un foro, no desea que las solicitudes que se originan en las publicaciones de los usuarios se consideren válidas. Si alguien publica un enlace a http://myforum.com/?action=delete_everything , no desea que se elimine nada solo porque un usuario haga clic en él. Con un token CSRF tradicional, puede controlar exactamente cuándo se usa. Con una cookie del mismo sitio, no puedes.
  • Se siguen aplicando las mismas advertencias anteriores para las antiguas protecciones CSRF. Si tiene una vulnerabilidad XSS, ninguna protección CSRF en este mundo lo protegerá.

Dicho esto, la cookie del mismo sitio sigue siendo una buena cosa que debe usarse junto con las defensas tradicionales como defensa en profundidad.

¿XSS y XSSI?

La cookie del mismo sitio no hace nada para protegerlo de ataques XSS comunes. Si un pirata informático logra engañar a su sitio para que se haga eco del script desde la URL de su sitio, se ejecutará como proveniente de su origen (después de todo, lo es) y, por lo tanto, las cookies de sesión se enviarán con todas las solicitudes del script inyectado. hace a tu dominio.

Si lees cuidadosamente la cita en tu publicación, verás que dice XSSI con una I al final, y no XSS. I significa inclusión, y XSSI está relacionado con, pero es diferente de, XSS. Aquí es una buena explicación de XSSI y cómo difiere de XSS:

  

XSSI es una forma de XSS que aprovecha el hecho de que los navegadores no impiden que las páginas web incluyan recursos como imágenes y scripts, que se alojan en otros dominios y servidores. [...] Por ejemplo, si el sitio de Bank ABC tiene un script que lee la información de la cuenta privada de un usuario, un pirata informático podría incluir ese script en su propio sitio malicioso (www.fraudulentbank.com) para obtener información de los servidores de Bank ABC cada vez que El cliente de Bank ABC visita el sitio del hacker.

Las cookies del mismo sitio lo protegen de XSSI, ya que una cookie de sesión no se enviaría con la solicitud del script y, por lo tanto, no devolvería ninguna información confidencial. Sin embargo, para XSS ordinario no hace ninguna diferencia.

    
respondido por el Anders 30.04.2016 - 14:50
fuente
1

Depende de los navegadores que desee admitir y de la configuración actual de su sitio.

Si está soportando estrictamente solo los navegadores que admiten la función, entonces debería ser suficiente si está dispuesto a:

  • No enviar cookies con navegación de nivel superior (esto es bastante restrictivo, ya que no se puede vincular a las páginas registradas externamente)
  • Asegúrese de que las operaciones no utilicen GET (o cualquier seguro Método) para realizar una operación, de lo contrario, se abre para vincular ataques como en la respuesta anterior.

Si puede vivir sin navegación de nivel superior a páginas registradas desde sitios externos, entonces SameSite: 'strict' podría ser adecuado, esta opción hace que la cookie dada no se envíe con ninguna solicitud cruzada de origen ( incluyendo los enlaces de clic, etc).

Si necesita vincularse a páginas registradas desde sitios externos, debe asegurarse de que se produzcan no cambios observables desde GET (o cualquiera de las herramientas safe method) en el servidor y debe usar SameSite: 'lax' en su lugar. Si puede garantizar esta restricción, incluso los enlaces enviados por el usuario deberían ser seguros (de todos modos, desde los ataques CRSF).

La garantía de cualquiera de estas restricciones probablemente no sea trivial en una base de código existente (además del requisito del navegador moderno), por lo que no recomendaría eliminar tokens CSRF si ya los está utilizando, ya que hay muchos lugares aún. abuso GET para desencadenar operaciones.

Si está comenzando un nuevo proyecto y no tiene la intención de admitir ningún navegador que no sea compatible con la función, probablemente valga la pena considerarlo, ya que es básicamente una sola línea de código, pero asegúrese de estar al tanto de los modos 'lax' y 'strict' y las restricciones que deberá seguir con ambos.

Respecto a SameSite: 'strict' : si está utilizando SameSite: 'strict' y un usuario hace clic en un enlace externo en una parte restringida del sitio, podría aparecer una pantalla de inicio que le preguntará si desea continuar. Lo recomendaría encarecidamente si los recursos no están destinados a vincularse externamente, en cuyo caso es probable que un enlace sea un ataque / truco.

Al tener una pantalla de presentación de este tipo, si el usuario elige continuar, no necesitará iniciar sesión nuevamente porque hacer clic en su sitio enviará SameSite -cookies porque es el mismo origen.

Si desea que la redirección se realice automáticamente, también puede agregar un encabezado Refresh: 0 para las páginas que sabe que son seguras (lo que también es una gran oportunidad para comprobar si una página determinada es en realidad seguro para ser conectado externamente, si no retrocede a la pantalla de inicio mencionada anteriormente). El principal inconveniente de este vs SameSite: 'lax' es que terminas repitiendo la navegación dos veces.

    
respondido por el Jamesernator 24.10.2018 - 05:09
fuente

Lea otras preguntas en las etiquetas