Scroll to Text Fragment

Scroll to Text Fragment

October 1, 2020
Abuse onblur, focus, iframes
Category Experiments
Defenses Document Policies

Scroll to Text Fragment (STTF) は、ユーザーがウェブページのテキストの任意の部分へのリンクを作成できるWebプラットフォームの新機能です。フラグメント#:~:text=は、ブラウザによって強調表示されてビューポートに取り込まれるテキストスニペットを運びます。この機能は、攻撃者がこの動作の発生を検出できることで、新しいXS-Leakをもたらします。この問題は、Scroll to CSS SelectorのXS-Leakに非常によく似ています。

期待される課題・議論される課題 #

この機能の仕様に関する初期の議論では、単純な実装でいくつかのXS-Leakをもたらせることが示されました1。この仕様では、様々な攻撃シナリオ2が考慮されており、Googleの研究結果も同様です3。この機能を実装する際、ブラウザが注意すべきXS-Leakの可能性の1つは、以下の通りです。

  • 攻撃者は、ページをiframeとして埋め込むことで、親ドキュメントのonblurイベントを聞くことによって、ページがテキストにスクロールされたかどうかを検出することができます。この方法は、ID Attribute XS-Leakと類似しています。このシナリオは、Chromeの実装4では、トップレベルのナビゲーションで発生するフラグメントナビゲーションのみを許可しているため、緩和されています。

現在の課題 #

warning

これらのXS-Leaksは、ターゲットページに何らかのマークアップを注入する必要があります。

STTFの開発過程で、フラグメントナビゲーションを検出するための新しい攻撃やトリックが発見されました。そのうちのいくつかは今でも有効です。

  • 攻撃者が制御するiframeを埋め込んだWebページでは、テキストへのスクロールが発生したかどうかを攻撃者が判断することができるかもしれません。これは、IntersectionObserverAPIを使用して行うことができます5 2 3
  • ページがレイジーローディングで画像を含む場合、攻撃者は画像が[ブラウザにキャッシュ]cached in the browserされているかどうかをチェックすることで、画像を含むフラグメントナビゲーションが発生したかどうかを検出することができます。これは、レイジーローディングの画像は、ビューポートに表示されたときにのみ取得(およびキャッシュ)されるため、機能します。

important

Scroll to Text Fragmentは、Chromeでのみ利用可能です。仕様書ドラフトは現在検討中です。

info

Scroll to Text Fragment XS-Leaksでは、ページ上に1つの単語が存在するかどうかを観察し、ユーザーがページに対して何らかの操作(例:マウスクリック)を行った場合にのみ、攻撃者は一度に1ビットの情報を抽出することが可能です。

なぜ問題なのか? #

攻撃者はSTTFを悪用して、Webページに表示されるユーザーの個人情報を漏えいさせることができます。

事例シナリオ #

あるユーザが国民健康保険制度のWebサイトにログインしており、そこでユーザの過去の病気や健康問題についての情報にアクセスすることが可能でした。攻撃者はユーザーをそのページの一つに誘い込み、STTFを使用してユーザーの健康状態の詳細を推測できる可能性があります。例えば、ある病名で検索した際に、ページスクロールを検知すると、その病名が被害者の病気であることを知ることができます。

対策 #

Document PoliciesSameSite Cookies (Lax)COOPFraming ProtectionsIsolation Policies
✔️✔️✔️RIP 🔗 NIP

参考文献 #


  1. Privacy concerns with proposal through inducing network requests, link ↩︎

  2. Text Fragments - Security and Privacy, link ↩︎ ↩︎

  3. Scroll-to-text Fragment Navigation - Security Issues, link ↩︎ ↩︎

  4. Boldly link where no one has linked before: Text Fragments, link ↩︎

  5. Possible side-channel information leak using IntersectionObserver, link ↩︎