what vulnerability mitigar javascript security browser widget clickjacking

javascript - vulnerability - Cómo proteger widgets de solicitudes falsificadas



mitigar clickjacking (6)

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

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

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

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

Remodé Clickjacking, utilice X-Frame-Options o código de frame-breaking en Javascript. Pero no creo que ninguno sea infalible. Ver:

Digamos que tiene un widget de JavaScript que necesita despedir 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, por lo que debe escribir un iframe en la página. En función de las reglas de herencia de origen, el sitio primario no podrá leer el token CSRF. Sin embargo, ¿qué pasa con el clickjacking (o likejacking )? Debido a CSRF, debe estar dentro de un iframe y las opciones de cuadro x no pueden ayudar, y lo mismo ocurre con los frame-busters .

El atacante aplicará una máscara SVG al iframe después de que el widget se haya cargado. Esta máscara hará que el iframe sea invisible. En este punto, el atacante puede cambiar el tamaño del iframe para que sea del tamaño de la página o hacer que este iframe ahora invisible siga el cursor. De cualquier manera, siempre que el usuario haga clic en cualquier lugar de la página, el iframe recibe el evento click y se termina el juego.

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


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

Sí, esto es algo poco elegante, pero la arquitectura actual de seguridad web no le brinda mejores opciones.


Creo que entiendo lo que estás haciendo. Desea permitir que cualquier sitio iframe su widget, por lo tanto, un atacante tiene 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, que protegerá de este tipo de ataque siempre que el marco principal no pueda leer el token.

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

En realidad, si el widget es muy importante que implementar la autenticación de 2 fases. Use http://twilio.com para llamar al usuario y pedirle 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 cuestión de protección XSS.

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

Así que mi enfoque de protección contra el clickjacking está un poco por la borda. Parece que se puede proteger utilizando una ventana emergente con una acción de confirmación.


No hay forma de evitar la falsificación de solicitudes durante un ataque de clickjacking. No existe una defensa CSRF que pueda resistir un ataque de clickjacking, porque no hay forma de distinguir un clic real de un clic falso en el lado del cliente.

OWASP menciona en su hoja de cálculo de prevención de CRSF que una de las condiciones previas para que la defensa del token CSRF funcione es que no hay un ataque XSS en curso.

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

Así que, 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 del lado del atacante.

Entonces, con respecto a las preguntas que mencionas 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 redimensionada del navegador con una página de 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 falsificación de solicitud en este escenario.

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


No hay una buena solución programable para clickjacking . Algunas compañías demandan a los spammers como una defensa al clickjacking. Otros optan por mostrar ventanas emergentes una vez que el usuario hizo clic dentro de iframe, aunque se degrada la experiencia del usuario, especialmente en el caso de un solo clic-botón. Esto es exactamente lo que Twitter hace por el botón "Retweet". Facebook actualmente implementa este enfoque para el botón "Me gusta", solicitando confirmación siempre que las solicitudes provengan de dominios incluidos en la lista negra. He oído que Googlebot realiza heurísticas de clickjacking al indexar páginas con su botón "+1" (verificando estilos calculados, elementos superpuestos, etc.) ...


--UPDATE-- Cuando dices "widget", si te refieres a algo fuera de tu aplicación con el que las personas no autenticadas interactúan, entonces ignora esta respuesta. Volví a leer tu pregunta y nunca dices lo que quieres decir con "widget". Tenemos todo tipo de "widgets" que se encuentran en nuestra aplicación. Pensé que de eso era de lo que hablabas, de todo dentro de una aplicación con la que solo interactuaban los usuarios autenticados. Si ese es el caso, entonces esta respuesta es lo que recomienda OWASP.

--Oración original-- "No desea que esta solicitud sea vulnerable a CSRF, por lo que debe escribir un iframe en la página". No, no hagas un iframe, de esa manera puedes hacer la recomendación normal de OWASP para proteger contra el encuadre Cross Site.

Para protegerse contra hash CSRF algún valor (s), inclúyalo en su formulario (o aJAx datos POST), luego verifique el valor hash en el back-end. Si coincide con su sitio. Cuantos más datos específicos pueda poner en el hash, mejor.

Ejemplo: cuando un usuario inicia sesión, puede crear una cadena aleatoria larga y vincularla a su sesión. Esta cadena nunca debe estar visible en su sitio o cuando vea la fuente. Entonces digamos que el usuario saca algún registro específico que quiere editar. A continuación, puede tomar esa cadena larga aleatoria que ha creado para los usuarios, anexarla a ella y, a continuación, asignarle hash. El resultado de ese hash que puede incluir en su formulario como oculto. Luego, en su back-end antes de hacer cualquier cosa, compruebe la presencia de eso oculto, si no existe, aborte. Si existe, tome esa cadena de sesión aleatoria de los usuarios y la clave principal de texto claro que enviaron, hash, si coincide 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 tenga alguna pieza única de código incluida en todas las páginas, como un pie de página). Haz el valor hash y colócalo en un div oculto en algún lugar de tu 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 todos los POSTS ajax automáticamente en caso de que esté haciendo una publicación ajax y no una publicación normal. Protegemos 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 esa ruta que desea tomar, podría mostrar algo del código de jQuery para hacerlo. En cuanto a lo que has hashing, cómo quieres verificarlo en el back-end, etc ... todo depende de si estás usando ColdFusion, PHP, PL / SQL (psp), etc. ... puedo señalarte en el la dirección correcta si es una de esas.