¿Por qué se considera que las vulnerabilidades CSRF son un problema con la aplicación web, en lugar de con el navegador?

3

De microsoft docs :

  

Las vulnerabilidades de CSRF son fundamentalmente un problema con la aplicación web, no con el usuario final.

Y, de hecho, la solución típica (tokens CSRF) es una solución del lado del servidor en lugar de la solución del lado del cliente.

Esa puede ser una pregunta filosófica, pero ... No estoy seguro si entiendo este enfoque. Para mí, la vulnerabilidad CSRF es cuando el navegador realiza una solicitud no autorizada; y por lo tanto, este es un problema con el navegador . Por lo tanto, se deben tomar medidas del lado del cliente, no del lado del servidor. Es el navegador el que debe dejar de realizar solicitudes no autorizadas.

Los tokens CSRF no parecen resolver este problema fundamental. Los sitios maliciosos todavía pueden usar el navegador para realizar solicitudes maliciosas. Solo se resuelve ese tipo particular de solicitudes maliciosas, pero otras no. Una posibilidad me viene a la mente: un sitio malicioso puede hacer que el navegador envíe muchas solicitudes repetidas a otro sitio, lo que efectivamente hace que el navegador participe en un ataque de DDOS.

Entonces, para resolver este problema ... ¿por qué no hacer que los navegadores sean más seguros? Un ejemplo más simple: ¿De forma predeterminada, no se permiten las solicitudes entre sitios? Esto parece tener sentido desde el punto de vista teórico: ¿por qué los diferentes dominios (esto debería significar: diferentes partes) quieren hablar con ellos mismos a través del usuario ?

    
pregunta gaazkam 17.05.2018 - 18:49
fuente

3 respuestas

3

Teóricamente, tienes razón: la web podría haber sido diseñada de tal manera que los navegadores puedan detectar y prevenir estos ataques. Sin embargo, no fue diseñado de esa manera, y no hay una solución trivial que un navegador pueda aplicar que no rompa una gran cantidad de sitios web existentes.

  

Un ejemplo más simple: de forma predeterminada, ¿no se permiten las solicitudes entre sitios?

Una "solicitud entre sitios", en el contexto de CSRF, podría ser tan simple como "una etiqueta <img> que hace referencia a una imagen alojada en otro dominio". La prevención de tales solicitudes rompería tantos sitios web que el navegador simplemente sería considerado roto por todos sus usuarios.

  

Es el navegador el que debe dejar de realizar solicitudes no autorizadas.

La solicitud solo es "no autorizada" en el sentido de que un usuario en particular no la solicitó. Esto, a primera vista, es un enfoque más prometedor: permitir que se realice la solicitud, pero no permita que se autentifique como la acción de un usuario en particular.

El problema aquí es que la gran mayoría de la autenticación utilizada por las aplicaciones web no es realmente visible para el navegador como autenticación; a lo sumo, el navegador sabe que el servidor ha solicitado que se le devuelvan una o más cadenas opacas ("cookies") en la próxima solicitud.

Por lo tanto, los navegadores tendrían que dejar de enviar todas las cookies en solicitudes que son "entre sitios", en el sentido de CSRF, al solicitar imágenes y otros activos para usar en una página HTML servida desde un dominio diferente; al enviar formularios dirigidos a un dominio diferente; etc.

  

¿Por qué los diferentes dominios (esto debería significar: diferentes partes) quieren hablar con ellos mismos a través del usuario?

Un caso de uso obvio son los sistemas de rastreo utilizados por los servicios de análisis y publicidad. Podría argumentar que estaríamos mejor si los navegadores los rompieran, pero dado que el navegador web más popular del mundo en este momento está desarrollado por una compañía que obtiene una gran parte de sus ingresos de tales servicios, es poco probable que esto suceda.

A veces, la comunicación entre servicios en el navegador realmente mejora la privacidad del usuario, si la única comunicación que puede ocurrir es en el servidor, ambos servidores deben conocer y discutir la identidad del usuario.

Si la web hubiera evolucionado teniendo en cuenta estas consideraciones de seguridad, los usos seguros del comportamiento similar a CSRF se implementarían por otros medios; pero incluso si se inventan nuevos protocolos y API ahora, es muy difícil cambiar el comportamiento predeterminado de los navegadores sin romper una gran cantidad de contenido existente.

Como tales, las funciones para proteger contra ellas, aunque sean estandarizadas, siempre serán habilitar , por lo que es necesario que el desarrollador de la aplicación realice algún trabajo para decir "No confío en la función X , así que por favor desactívelo para que no pueda ser abusado ". Cosas tales como los encabezados de la Política de seguridad de contenido y las opciones de cookies HttpOnly y SameSite son opciones opcionales. Cosas como los tokens CSRF en las formas son formas de no confiar en que el usuario tenga un navegador actualizado que implemente todas las protecciones necesarias.

    
respondido por el IMSoP 17.05.2018 - 19:41
fuente
2

Usted tiene razón en el sentido de que el problema está en el navegador en lugar de la aplicación web, y en la actualidad cookies SameSite se puede utilizar para solucionar este problema. En última instancia, aunque el problema no es tan sencillo, porque algunas solicitudes entre sitios son legítimas, como hacer clic en un enlace.

Si StackExchange tenía SameSite establecido en strict y un usuario ingresó al sitio haciendo clic en un enlace de una búsqueda de Google, la cookie no se enviaría porque era una solicitud entre sitios y la página no lo haría. t muestra al usuario como conectado, incluso si hubiera iniciado sesión antes. Esto es UX no intuitivo y malo. Esto se puede resolver estableciendo SameSite en lax , pero CSRF aún puede ser posible si la aplicación web no es compatible con RFC 7231 sección 4.2.1 , y desafortunadamente he visto muchas aplicaciones web con solicitudes de GET no idempot.

Bloquear todas las solicitudes entre sitios simplemente no es posible con la forma en que funcionan las cosas actualmente. Previene demasiados usos legítimos, como CDN, incrustación de imágenes, anuncios, etc. Esta página actualmente realiza solicitudes a estos dominios:

adservice.google.com
ajax.googleapis.com
cdn.sstatic.net
pixel.quantserve.com
qa.sockets.stackexchange.com
sb.scorecardresearch.com
securepubads.g.doubleclick.net
secure.quantserve.com
security.stackexchange.com
www.google-analytics.com
www.googletagservices.com
www.gravatar.com
    
respondido por el AndrolGenhald 17.05.2018 - 19:43
fuente
1

CSRF, junto con la mayoría de los ataques, es posible porque una aplicación no valida correctamente las entradas. Las entradas siempre deben validarse independientemente de la fuente.

Si validas tus entradas, no necesitas depender de los usuarios o incluso de Google, Mozilla, ... para garantizar la seguridad.

Por otro lado, incluso si Google y Mozilla crearan una versión segura de sus navegadores que impida absolutamente cualquier tipo de CSRF, los usuarios de su aplicación aún serían vulnerables si no actualizan sus navegadores.

Si crees que todo el mundo actualiza sus navegadores, estás equivocado. Mucha gente todavía usa navegadores de 5 a 10 años, y lo mismo ocurre con otras aplicaciones importantes. Con la llegada de IoT, este problema se ha agravado aún más.

Línea inferior: si desea que sus usuarios estén seguros, es más conveniente agregar algunas contramedidas a su aplicación o pedir a Google y Mozilla que cierren inmediatamente la causa raíz de los CSRF y ¿Todos los usuarios se actualizan a esta nueva versión del navegador?

Es más, cerrar la causa raíz de CSRF no es tan fácil. Como @IMSoP señaló correctamente, esto básicamente rompería las industrias actuales de análisis y publicidad. También vea: enlace .

Nuevamente, si desea que sus usuarios estén seguros, ¿es más conveniente agregar algunas líneas de código a su aplicación O interrumpir una industria multimillonaria?

    
respondido por el A. Darwin 17.05.2018 - 19:45
fuente

Lea otras preguntas en las etiquetas