Uso de iframes para el código no confiable de sandbox

18

Estoy tratando de crear una plataforma extensible, donde mi sitio proporcionará un modelo y algunas vistas (tanto del lado del cliente, en el navegador) como las de terceros también pueden agregar sus propias vistas. El objetivo aquí es que solo mi modelo realizará solicitudes HTTP a mi servidor, y las vistas de terceros solo harán llamadas API a mi plataforma, nada más (también pueden "llamar a casa" si lo desean, pero no deben tocarlas). cualquier cosa que no esté explícitamente expuesta a ellos a través de la API).

La solución propuesta es crear un iframe invisible para cada extensión de terceros, utilizando solo postMessage para comunicarse con ellos ( Editar : para ser una "vista" adecuada, debe ser visible, por supuesto, pero como alternativa, simplemente puede tener el rol de "controlador", delegando el renderizado de componentes visuales a la página principal - podría usarse si se agregara algún beneficio de seguridad, pero idealmente no). ¿Sería esto correctamente "sandbox" el código? Estoy asumiendo que:

  • No podrán acceder al DOM de la página principal ni realizar llamadas arbitrarias de JavaScript ni realizar una solicitud de Ajax en mi dominio, debido a la política del mismo origen;
  • Es posible que realicen solicitudes GET en mi servidor (incluida la carga de scripts desde él), pero siempre que use tokens CSRF donde sea importante, debería estar bien. Esta situación no es diferente de tener dos pestañas abiertas en el mismo navegador, una de ellas autenticada con su sitio respectivo;
  • No podrán hacer clickjack al usuario, desde si sus iframes son invisibles; También asumo que no pueden hacerlos visibles o cambiar su tamaño, ya que esto implicaría acceder al DOM de la página principal, ¿es correcto?
  • Ellos pueden spam Window.alert (o peor: Window.prompt ), console.log o acceder a otras cosas "globales". Este es el peor problema que identifiqué hasta ahora, y aún no puedo pensar en formas de evitarlo.
    • Aclaración: el problema aquí es la posibilidad de intentar suplantar el sitio principal, mostrando un mensaje pidiendo la contraseña, por ejemplo.
    • También, corríjame si me equivoco. Asumo que JavaScript en iframes tiene igual acceso a esos recursos, y no hay manera de que la página principal lo niegue.
  • pueden incrustar flash u otros complementos que pueden tener vulnerabilidades de seguridad. El hecho de que esté en un iframe, sin embargo, no lo empeora en ningún aspecto, ¿o me equivoco?

¿Son correctas estas suposiciones? ¿Hay algo más que deba tener en cuenta? Será necesario un cierto nivel de confianza por parte de los usuarios (la idea es que cada usuario debería poder elegir extensiones a su propio ritmo, independientemente de que mi sitio las respalde o no, mientras que en última instancia, tenga las consecuencias de sus elecciones), pero Me gustaría hacer todo lo posible para mitigar esos riesgos.

Actualización: Me gustaría aclarar un poco la pregunta, en función de las preguntas formuladas por los comentaristas. Hay muchas razones para incluir scripts de terceros en una página: publicidad, análisis, interacción con redes sociales, etc. Sin embargo, esto es un problema de seguridad, de hecho, es una de las razones por las que las personas usan AdBlock o NoScript (para que pueda elegir de forma selectiva qué dominios están autorizados para ejecutar código en su navegador). Por lo general, el sitio confía en los terceros cuyos scripts incluye, pero no siempre (las aplicaciones de Facebook, por ejemplo, pueden ser creadas por cualquier persona, pero se ejecutan dentro de una página de Facebook), y he visto que iframes se han utilizado para "aislar" a terceros. contenidos de la fiesta.

Aunque una opción para la comunicación entre sitios en el navegador es tener dos pestañas abiertas (o ventanas) que usan postMessage para intercambiar mensajes, una sola página proporciona una experiencia más fluida. Mi principal preocupación en esta pregunta es la implicación total de usar iframes (visible o invisible) y su viabilidad en el uso de contenidos no fiables en la zona de pruebas de arena, y el IMHO también es aplicable para una audiencia más amplia (consulte el párrafo anterior).

En mi caso particular, estoy tratando de evitar que los contenidos incrustados se hagan pasar por el sitio principal (vea la aclaración en el cuarto punto anterior) y de proteger a los usuarios en general de otras molestias en la medida de lo posible. Si bien cada usuario tendrá la capacidad de elegir sus propias extensiones, siendo responsable en última instancia de las consecuencias, me gustaría mitigar cualquier problema conocido que esté a mi alcance (y tratar de educar a los usuarios para aquellos que no lo están).

    
pregunta mgibsonbr 19.05.2012 - 02:57
fuente

2 respuestas

10

Usted dijo que va a cargar el contenido de terceros en un iframe, pero ¿se alojará el contenido de terceros desde el mismo dominio que su contenido principal, o se servirá desde un dominio separado?

Si el contenido de terceros está alojado en el mismo dominio que su página principal, entonces no, su enfoque es totalmente inseguro . El contenido de un iframe tiene acceso completo de secuencias de comandos a la página principal, si se sirve desde el mismo origen (aproximadamente, el mismo dominio). Lea sobre la política del mismo origen.

Un enfoque más razonable es alojar el contenido de la extensión de terceros en un dominio diferente al de tu página principal. Si lo hace, entonces sí, su enfoque proporciona una seguridad razonable . El contenido de la extensión se encontrará en un espacio aislado y no podrá meterse con la página principal (en su mayor parte). Hay algunos riesgos restantes, que se indican a continuación:

  • El contenido de terceros en el iframe puede navegar por la página principal (por ejemplo, configurando window.location o top.location ). Por lo tanto, el contenido de terceros reemplaza la página completa con el contenido de la elección del tercero. Esto podría permitir ataques de suplantación de identidad o suplantación de identidad. Un usuario alerta puede notar tales ataques, porque la URL en la barra de direcciones del navegador cambiará, pero algunos usuarios no lo notarán.

  • La extensión de terceros todavía puede cargar contenido desagradable en su propio iframe (por ejemplo, pornografía, anuncios, etc.).

  • La extensión de terceros aún puede intentar montar ataques de descarga en sus usuarios. Si sus usuarios tienen un navegador vulnerable, es posible que se infecten con el ataque (por supuesto, esto puede ser cierto si visitan un sitio malicioso; no hay nada acerca de iframes que aumente el riesgo, simplemente no lo hace desaparecer). , tampoco).

  • El contenido de terceros puede reproducir películas o sonido, posiblemente usuarios molestos.

  • La extensión de terceros puede ser capaz de montar ataques de click-jacking en la página principal. (Usted menciona que el iframe será invisible, pero no estoy seguro de cuáles son los métodos específicos necesarios para garantizar que esta es una defensa sólida contra el click-jacking. Hay muchas peculiaridades en el navegador).

  • Es importante que su sitio use defensas CSRF fuertes. De lo contrario, el contenido de terceros estará en una posición perfecta para montar ataques CSRF.

Muchos de estos riesgos son relativamente menores y pueden ser aceptables en la mayoría de los casos, pero quería describirlos para usted y para otros.

Un enfoque alternativo es utilizar un sistema para Sandboxing de Javascript (también se puede considerar como una forma para construir un "iframe virtual"). Consulte, por ejemplo, Caja , SES , ADsafe , FBJS y el sitio web de Microsoft.

También puede consultar iframes de espacio aislado , pero no creo que estén compatible con todos los navegadores, por lo que aún no puede confiar en este mecanismo de seguridad (lamentablemente).

Consulte también ¿Qué riesgos debo tener en cuenta antes de permitir que se publiquen anuncios en mi sitio web? , Problemas de seguridad al usar iframes , ¿Cómo escanear Javascript en busca de códigos maliciosos? .

Además, para obtener más información sobre las peculiaridades del navegador relacionadas con la política del mismo origen y ese tipo de tema, recomiendo encarecidamente el Manual de seguridad del navegador .

    
respondido por el D.W. 21.05.2012 - 01:28
fuente
2

Si visita esta demostración , verá que el código se detecta a sí mismo en un marco (se puede modificar para detectar qué página está activada) que cambia la url. Una url que puede suplantar el sitio padre. (En la nota de referencia, noté que Google y Yahoo aparecieron en blanco y creo que es porque sus encabezados envían "X-Frame-Options: SAMEORIGIN")

No sé mucho sobre el control de ventanas, por lo que es posible que otra ventana cierre su sitio e inicie otra ventana para suplantarla. Pero desde un punto de vista de DOM y javascript, debería ser seguro que su código se ejecute sin causar daño a los usuarios. Sin embargo, engañar a los usuarios es otra historia.

    
respondido por el user5575 20.05.2012 - 10:30
fuente

Lea otras preguntas en las etiquetas