web-dev-qa-db-ja.com

ページ上の広告は私のパスワードを読み取ることができますか?

免責事項:私は最小限のweb-dev/security知識を持っているので、「素人」と話しているように答えてください。

web-advertisementsは独自のJavaScriptを実行できる必要がある なので、「実際のユーザー」によって表示されていることを確認できると聞きました。 StackOverflowのこのインシデント が示すように、彼らには基本的に自由な統治が与えられています。

また、JavaScript ウェブページ上のキーストロークをキャプチャするために使用できます も知っています。

つまり、ページに広告があり、ヘッダーにユーザー/パスのテキストボックスがある goodreads のような場合、資格情報を記録するためにキーストロークを広告が読み取らないようにするための何かがありますか?広告からキーストロークを読み取ることは不可能ですか?

ログインページに広告が表示された場合、認証情報を入力するのは安全ではないと思いますか?

250
scohe001

広告がパスワードを読み取るのを妨げるものはありません。

広告(またはアナリティクスやJavaScriptライブラリのような他のスクリプト)はメインのJavaScriptスコープにアクセスでき、財務情報、パスワード、CSRFトークンなど、多くの機密事項を読み取ることができます。

サンドボックス化されたiframeに読み込まれている場合を除きます。

sandboxed iframe に広告を読み込むと、アクセス権のあるJavaScriptスコープにセキュリティ制限が追加されるため、厄介なことを行うことができなくなります。

残念ながら、サードパーティのスクリプトのほとんどはサンドボックス化されていません。これは、一部が正しく機能するためにメインスコープへのアクセスを必要とするためです。ほとんどサンドボックス化されません。


開発者として、私は何ができますか?

サードパーティのスクリプトは個人データのセキュリティを危険にさらす可能性があるため、すべての機密ページ(ログインフォームやチェックアウトページなど)を独自のOrigin(サブドメインで結構です)にロードする必要があります。

別のOriginを使用することで、利益を得ることができます Same-Origin Policy :メインOriginで実行されているスクリプトは、保護されたOriginの何にもアクセスできません。

注: コンテンツセキュリティポリシー および サブリソースの整合性 は、サードパーティを簡単に確認できても、ほとんどの広告ネットワークでは確認できない場合に使用できますあなたがそれらを使用した場合はもう動作します。

222
Benoit Esnard

それはウェブサイトが広告をロードする方法に依存します。

Goodreadsの場合、HTMLには広告プロバイダーからのJavaScriptが含まれています。具体的には、https://www.goodreads.com/が返すHTMLドキュメントの81〜145行目は次のようになります。

<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>

結果として、広告主のJavaScriptコードはWebサイト自体と同じ実行コンテキストで実行され、Webサイトとのすべてのやり取りの監視を含め、Webサイトが実行できるすべてのことを実行できます。

代わりに、異なるOriginからiframeを埋め込んで広告をロードした場合、広告主のコードは独自の実行コンテキストで実行され、ブラウザーは同じOriginポリシーの違反として周囲のWebサイトへのアクセスをブロックします。

一般に、Webサイトが広告主のコードを分離したかどうかを確認する唯一の方法は、Webサイトのコードを検査することです。

29
meriton