it-swarm-es.com

¿Pueden los anuncios en una página leer mi contraseña?

Descargo de responsabilidad: Tengo un conocimiento mínimo de desarrollo web/seguridad, así que responda como si estuviera hablando con un "laico".

He oído que los anuncios en la web deben poder ejecutar su propio JavaScript para que puedan verificar que están siendo vistos por "usuarios reales". Como se muestra este incidente en StackOverflow , básicamente se les da un reinado libre.

También sé que JavaScript se puede usar para capturar pulsaciones de teclas en una página web .

Entonces, en un caso como goodreads , donde tienen anuncios en la página y cuadros de texto de usuario/pase en el encabezado, ¿hay algo en su lugar para evitar que el anuncio lea las pulsaciones de teclas para registrar mis credenciales? ¿Leer las pulsaciones de teclado simplemente no es posible desde un anuncio?

Si veo anuncios en una página de inicio de sesión, ¿debo suponer que la página no es segura para ingresar mis credenciales?

250
scohe001

Nada impide que los anuncios lean sus contraseñas.

Los anuncios (o cualquier otro script como análisis o bibliotecas de JavaScript) tienen acceso al alcance principal de JavaScript y pueden leer muchas cosas confidenciales: información financiera, contraseñas, tokens CSRF, etc.

Bueno, a menos que se carguen en un iframe de espacio aislado.

Cargar un anuncio en un iframe de espacio aislado agregará restricciones de seguridad al alcance de JavaScript al que tiene acceso, por lo que no podrá hacer cosas desagradables.

Desafortunadamente, la mayoría de los scripts de terceros no están protegidos. Esto se debe a que algunos de ellos requieren acceso al ámbito principal para funcionar correctamente, por lo que ' casi nunca estás en la arena.


Como desarrollador, ¿qué puedo hacer?

Dado que cualquier script de terceros podría comprometer la seguridad de todos sus datos personales, todas las páginas sensibles (como formularios de inicio de sesión o páginas de pago) deben cargarse en su propio origen (un subdominio está bien).

El uso de otro origen nos permite aprovechar la Política del mismo origen : los scripts que se ejecutan en el origen principal no pueden acceder a nada en el origen protegido.

Nota: Política de seguridad de contenido y Integridad de recursos secundarios también podría usarse si el tercero puede ser revisado fácilmente, pero la mayoría de las redes publicitarias no podrían funcionar si los usaste.

222
Benoit Esnard

Eso depende de cómo el sitio web cargue los anuncios.

En el caso de Goodreads, su HTML contiene JavaScript del proveedor de anuncios. Específicamente, las líneas 81-145 del documento HTML devueltas por https://www.goodreads.com/ leer:

<script>
  //<![CDATA[
    var gptAdSlots = gptAdSlots || [];
    var googletag = googletag || {};
    googletag.cmd = googletag.cmd || [];
    (function() {
      var gads = document.createElement("script");
      gads.async = true;
      gads.type = "text/javascript";
      var useSSL = "https:" == document.location.protocol;
      gads.src = (useSSL ? "https:" : "http:") +
      "//securepubads.g.doubleclick.net/tag/js/gpt.js";
      var node = document.getElementsByTagName("script")[0];
      node.parentNode.insertBefore(gads, node);
    })();
    // page settings
  //]]>
</script>
<script>
  //<![CDATA[
    googletag.cmd.Push(function() {
      googletag.pubads().setTargeting("sid", "osid.bd63050e605ccee9f21515a2dedfdaea");
    googletag.pubads().setTargeting("grsession", "osid.bd63050e605ccee9f21515a2dedfdaea");
    googletag.pubads().setTargeting("surface", "desktop");
    googletag.pubads().setTargeting("signedin", "false");
    googletag.pubads().setTargeting("gr_author", "false");
    googletag.pubads().setTargeting("author", []);
      googletag.pubads().enableAsyncRendering();
      googletag.pubads().enableSingleRequest();
      googletag.pubads().collapseEmptyDivs(true);
      googletag.pubads().disableInitialLoad();
      googletag.enableServices();
    });
  //]]>
</script>
<script>
  //<![CDATA[
    ! function(a9, a, p, s, t, A, g) {
      if (a[a9]) return;

      function q(c, r) {
        a[a9]._Q.Push([c, r])
      }
      a[a9] = {
      init: function() {
        q("i", arguments)
      },
      fetchBids: function() {
        q("f", arguments)
      },
      setDisplayBids: function() {},
        _Q: []
      };
      A = p.createElement(s);
      A.async = !0;
      A.src = t;
      g = p.getElementsByTagName(s)[0];
      g.parentNode.insertBefore(A, g)
    }("apstag", window, document, "script", "//c.Amazon-adsystem.com/aax2/apstag.js");

    apstag.init({
      pubID: '3211', adServer: 'googletag', bidTimeout: 4e3
    });
  //]]>
</script>

Como consecuencia, el código javascript del anunciante se ejecuta en el mismo contexto de ejecución que el sitio web en sí, y puede hacer todo lo que el sitio web puede hacer, incluso observar todas sus interacciones con el sitio web.

Si hubieran cargado los anuncios al incrustar un iframe de un origen diferente, el código del anunciante se habría ejecutado en su propio contexto de ejecución y el navegador habría bloqueado el acceso al sitio web circundante como una violación de la misma política de origen.

En general, la única forma de saber si el sitio web ha aislado el código del anunciante es inspeccionando el código del sitio web.

29
meriton