Pregunta

Digamos que tiene un widget de JavaScript que necesita disparar una solicitud a su aplicación web si y solo si el usuario desea hacer clic en él. No desea que esta solicitud sea vulnerable a CSRF para que escriba un iframe en la página. Basado en el Reglas de herencia de origen El sitio principal no podrá leer el token CSRF. Sin embargo, ¿qué pasa con clickjacking (o como jacking )? Debido a CSRF, debe estar dentro de un iframe y allí para el opciones X-frame no puede ayudar, y lo mismo es cierto para tranvía de marco.

El atacante va a aplicar un Máscara SVG el iframe después del widget ha cargado. Esta máscara hará que el iframe sea invisible. En este punto, el atacante puede cambiar el tamaño de la iframe para que sea del tamaño de la página o que ahora sea invisible iframe siga el cursor. De cualquier manera, cada vez que el usuario hace clic en cualquier parte de la página, el iframe recibe el evento de clic y su juego terminado.

Así que hay una dualidad, parece que está atrapado entre CSRF y Clickjacking. ¿Cuál es la mejor solución (si la hay) para este problema?

¿Fue útil?

Solución

Al hacer clic en el widget, debe abrir una ventana emergente que contenga una nueva página (un iframe no es lo suficientemente bueno, debe ser una ventana nueva, que está completamente bajo el control de su aplicación web. Confirme la acción, sea lo que sea, en esa página.

Sí, esto es algo inelegador, pero la arquitectura de seguridad web actual no le ofrece mejores opciones.

Otros consejos

No hay forma de evitar la falsificación de solicitudes mientras está bajo un ataque de truco. No existe una defensa de CSRF que pueda soportar un ataque de truco, porque no hay forma de distinguir un clic real de un clic falso en el lado del cliente.

Owasp Menciones en su hoja de cálculo de prevención de CRSF Esa de las condiciones previas para que funcione la defensa del token CSRF es que no se está realizando ningún ataque XSS.

En mi opinión, esto también debería incluir clickjacking, ya que el token CSRF incluso oculto dentro de iframe no puede defenderse contra Clickjacking. La solicitud está siendo forjada por un usuario directo.

Entonces, al final, no estamos realmente atrapados entre CSRF y Clickjacking: las defensas de CSRF están destinadas a un tipo diferente de ataques donde hay mucho menos poder en el lado del atacante.

Entonces, hacia las preguntas que menciona sobre Clickjacking y CSRF:

  • ¿Cuál es la mejor solución (si la hay) para este problema? - La mejor defensa para hacer clic en el lado del cliente es abrir una nueva pestaña del navegador o una ventana del navegador redimensionada con una página desde su sitio y confirmar la acción allí, como menciona @zack. Esto es lo que hace el botón de Twitter, y tampoco puede haber una falsificación de solicitud en este escenario.

  • Entonces hay una dualidad, parece que está atrapado entre CSRF y Clickjacking - Las defensas de CSRF no están destinadas a casos como XSS o ataques de clickjacking, son efectivos solo contra ataques menos poderosos (correo electrónico con enlace malicioso, enlace malicioso en el foro, etc.)

No hay buen programable solución en clickjacking. Algunas compañías demandan a los spammers como defensa para hacer clic. Otros eligen mostrar ventanas emergentes una vez que el usuario hizo clic dentro de iframe, aunque degrada la experiencia del usuario, especialmente en el caso de un solo clic en el botón. Esto es exactamente lo que hace Twitter por el botón "retweet". Facebook actualmente implementa este enfoque para el botón "Me gusta", pidiendo confirmación cada vez que las solicitudes provienen de dominios con lista negra. He oído que Googlebot realiza algunas heurísticas de clickjacking mientras indexan las páginas con su botón "+1" (verificación de estilos calculados, elementos superpuestos, etc.) ...

--ACTUALIZAR--Cuando dice "widget", si se refiere a algo fuera de su aplicación con la que las personas no autorenticadas interactúan, entonces ignore esta respuesta. Vuelvo a leer tu pregunta y nunca dices lo que quieres decir con "widget". Tenemos todo tipo de "widgets" que están en nuestra aplicación. Pensé que de eso estabas hablando, todo dentro de una aplicación con la que solo los usuarios autenticados estaban interactuando. Si ese es el caso, esta respuesta es lo que recomienda OWASP.

-Respuesta Original--"No desea que esta solicitud sea vulnerable a CSRF para que escriba un iframe en la página". No, no haga un iframe, de esa manera puede hacer la recomendación normal de OWASP para proteger contra el marco del sitio cruzado.

Para proteger contra CSRF hash algunos valor (s), incluya en su formulario (o datos post AJAX), luego verifique el valor hash en el back -end. Si coincide con su sitio. Cuantos datos más específicos pueda poner en el hash, mejor.

Ejemplo: cuando un usuario inicia sesión, puede crear una larga cadena aleatoria y atarla a su sesión. Esta cadena nunca debe ser visible en su sitio o al ver la fuente. Luego, digamos que el usuario extrae un registro específico que quiere editar. Luego podría tomar esa cadena aleatoria larga de los usuarios que creó, agregar esa clave primaria y luego hash. El resultado de ese hash puede incluir en su forma como oculto. Luego, en su backend, antes de hacer cualquier cosa, verifica la presencia de ese escondido, si no existe, aborta. Si existe, tome esa cadena de sesión aleatoria de los usuarios y la clave primaria de texto claro que enviaron, hash, si coincide con que sabe que es de su sitio.

Y es fácil agregar esto en todas partes, incluso si su sitio ya está escrito (suponiendo que su sitio tiene un solo código incluido en todas las páginas, como un pie de página). Haga el valor del hash y colóquelo en un div oculto en algún lugar de su pie de página. Luego puede usar jQuery para agregar dinámicamente este valor hash oculto a todos los formularios en la página. Y puede usar jQuery.AJAXPRefilter para agregarlo a todas las publicaciones de Ajax automáticamente en caso de que esté haciendo una publicación AJAX y no una publicación de formulario normal. Hemos protegido algunos sitios muy grandes que ya estaban codificados de esta manera.

https://www.owasp.org/index.php/cross-site_request_forgery_(csrf)_prevention_cheat_sheet

Si esto suena como ese camino que desea tomar, podría mostrar parte del código jQuery para hacerlo. En cuanto a lo que está hashing, cómo desea verificarlo en el backend, etc., todo depende de si está utilizando ColdFusion, PHP, PL/SQL (PSP), etc. Puedo señalarlo en el Dirección correcta si es uno de esos.

Creo que entiendo lo que estás haciendo. Desea permitir que cualquier sitio se refiera a su widget, por lo tanto, un atacante tiene un control completo del código fuente del padre y puede crear rutinas de clickjacking para obligar a los usuarios a hacer clic en el widget.

Por lo tanto, el iFrame podría emplear un token CSRF, como debería, lo que protegerá de este tipo de ataque siempre que el marco principal no pueda leer el token.

Clickjacking, como estoy seguro de que sabes, es un tipo de ataque completamente diferente al de CSRF y necesita una defensa diferente.

Realmente, si el widget es súper importante que implementar la autenticación de 2 fases. Usar http://twilio.com Para llamar al usuario y hacer que ingrese un PIN. O envíe un correo electrónico al usuario con un enlace de verificación. O solicite al usuario que verifique la acción la próxima vez que el usuario inicie sesión en el sitio web de su widget.

Si tuviera el control del marco principal, entonces tendría más opciones. Entonces sería una materia de protección XSS.

Actualizar después de que se haya seleccionado la respuesta correcta

Por lo tanto, mi enfoque para proteger contra Clickjacking está un poco por la borda. Parece que se puede proteger con una ventana emergente con una acción de confirmación.

Debido a CSRF debes estar dentro de un iframe ...

No. No puede remediar CSRF con cookies de forma y otros trucos de nonce. No importa dónde los pongas.

Así que hay una dualidad, parece que está atrapado entre CSRF y Clickjacking. ¿Cuál es la mejor solución (si la hay) para este problema?

Para remediar CSRF, debe eliminar la amenaza arreglando el servidor que tiene la inyección o código malicioso, deteniendo el correo electrónico de phishing, etc. En ausencia de un entorno benigno, debe volver a autorenticar al usuario (o proporcionar otro desafío /Respuesta para garantizar un usuario interactivo). Ver:

TE Remdiate Clickjacking, utilice opciones X-Frame o código de ruptura de cuadros en JavaScript. Pero tampoco creo que tampoco sean infalibles. Ver:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top