# XS-Search/XS-Leaks {{#include ../../banners/hacktricks-training.md}} ## 基本情報 XS-Searchは、**サイドチャネル脆弱性**を利用して**クロスオリジン情報を抽出する**ための手法です。 この攻撃に関与する主要なコンポーネントは以下の通りです: - **脆弱なウェブ**: 情報を抽出することを目的としたターゲットウェブサイト。 - **攻撃者のウェブ**: 攻撃者が作成した悪意のあるウェブサイトで、被害者が訪問し、エクスプロイトをホストしています。 - **インクルージョンメソッド**: 脆弱なウェブを攻撃者のウェブに組み込むために使用される技術(例:window.open、iframe、fetch、hrefを持つHTMLタグなど)。 - **リーク技術**: インクルージョンメソッドを通じて収集された情報に基づいて、脆弱なウェブの状態の違いを識別するために使用される技術。 - **状態**: 攻撃者が区別しようとする脆弱なウェブの2つの潜在的な条件。 - **検出可能な違い**: 攻撃者が脆弱なウェブの状態を推測するために依存する観察可能な変化。 ### 検出可能な違い 脆弱なウェブの状態を区別するために分析できるいくつかの側面: - **ステータスコード**: サーバーエラー、クライアントエラー、または認証エラーなど、**さまざまなHTTPレスポンスステータスコード**をクロスオリジンで区別する。 - **API使用**: 特定のJavaScript Web APIを使用しているかどうかを明らかにするために、ページ間での**Web APIの使用**を特定する。 - **リダイレクト**: HTTPリダイレクトだけでなく、JavaScriptやHTMLによってトリガーされる異なるページへのナビゲーションを検出する。 - **ページコンテンツ**: **HTTPレスポンスボディ**やページのサブリソースにおける**埋め込まれたフレームの数**や画像のサイズの違いを観察する。 - **HTTPヘッダー**: **特定のHTTPレスポンスヘッダー**の存在またはその値を記録する。X-Frame-Options、Content-Disposition、Cross-Origin-Resource-Policyなどのヘッダーが含まれる。 - **タイミング**: 2つの状態間の一貫した時間の違いに気付く。 ### インクルージョンメソッド - **HTML要素**: HTMLは、スタイルシート、画像、スクリプトなど、**クロスオリジンリソースのインクルージョン**のためのさまざまな要素を提供し、ブラウザに非HTMLリソースを要求させる。これに関する潜在的なHTML要素の一覧は[https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks)で見つけることができます。 - **フレーム**: **iframe**、**object**、および**embed**などの要素は、攻撃者のページにHTMLリソースを直接埋め込むことができます。ページが**フレーミング保護を欠いている**場合、JavaScriptはcontentWindowプロパティを介してフレーム化されたリソースのウィンドウオブジェクトにアクセスできます。 - **ポップアップ**: **`window.open`**メソッドは、新しいタブまたはウィンドウでリソースを開き、JavaScriptがSOPに従ってメソッドやプロパティと対話するための**ウィンドウハンドル**を提供します。ポップアップは、シングルサインオンでよく使用され、ターゲットリソースのフレーミングおよびクッキー制限を回避します。ただし、最新のブラウザはポップアップの作成を特定のユーザーアクションに制限しています。 - **JavaScriptリクエスト**: JavaScriptは、**XMLHttpRequests**や**Fetch API**を使用してターゲットリソースへの直接リクエストを許可します。これらのメソッドは、HTTPリダイレクトに従うかどうかを選択するなど、リクエストに対する正確な制御を提供します。 ### リーク技術 - **イベントハンドラー**: XS-Leaksにおける古典的なリーク技術で、**onload**や**onerror**のようなイベントハンドラーがリソースの読み込み成功または失敗に関する洞察を提供します。 - **エラーメッセージ**: JavaScriptの例外や特別なエラーページは、エラーメッセージから直接またはその存在と不在を区別することによってリーク情報を提供できます。 - **グローバル制限**: メモリ容量や他の強制されたブラウザ制限など、ブラウザの物理的制限は、しきい値に達したときに信号を送ることができ、リーク技術として機能します。 - **グローバル状態**: ブラウザの**グローバル状態**(例:履歴インターフェース)との検出可能な相互作用を悪用できます。たとえば、ブラウザの履歴の**エントリ数**は、クロスオリジンページに関する手がかりを提供できます。 - **パフォーマンスAPI**: このAPIは、**現在のページのパフォーマンス詳細**を提供し、ドキュメントや読み込まれたリソースのネットワークタイミングを含み、要求されたリソースに関する推測を可能にします。 - **読み取り可能な属性**: 一部のHTML属性は**クロスオリジンで読み取り可能**であり、リーク技術として使用できます。たとえば、`window.frame.length`プロパティは、JavaScriptがクロスオリジンのウェブページに含まれるフレームの数をカウントすることを可能にします。 ## XSinatorツールと論文 XSinatorは、**いくつかの既知のXS-Leaksに対してブラウザをチェックする**自動ツールです。詳細はその論文に説明されています:[**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf) ツールには[**https://xsinator.com/**](https://xsinator.com/)で**アクセスできます**。 > [!WARNING] > **除外されたXS-Leaks**: 他のリークに干渉するため、**サービスワーカー**に依存するXS-Leaksを除外する必要がありました。さらに、特定のウェブアプリケーションの誤設定やバグに依存するXS-Leaksも**除外することにしました**。たとえば、CrossOrigin Resource Sharing (CORS)の誤設定、postMessageリーク、またはCross-Site Scriptingです。加えて、時間ベースのXS-Leaksも除外しました。なぜなら、これらはしばしば遅く、ノイズが多く、不正確であるからです。 ## **タイミングベースの技術** 以下の技術のいくつかは、ウェブページの可能な状態の違いを検出するプロセスの一部としてタイミングを使用します。ウェブブラウザで時間を測定する方法はいくつかあります。 **時計**: [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) APIは、開発者が高解像度のタイミング測定を取得することを可能にします。\ 攻撃者が暗黙の時計を作成するために悪用できるAPIは多数あります:[Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API)、[Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel)、[requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame)、[setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout)、CSSアニメーションなど。\ 詳細については、[https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/)を参照してください。 ## イベントハンドラ技術 ### Onload/Onerror - **インクルージョンメソッド**: フレーム、HTML要素 - **検出可能な違い**: ステータスコード - **詳細情報**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu)、[https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) - **概要**: リソースを読み込もうとすると、onerror/onloadイベントがトリガーされ、リソースが成功裏に/失敗して読み込まれたかどうかを判断することが可能です。 - **コード例**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)]() {{#ref}} cookie-bomb-+-onerror-xs-leak.md {{#endref}} コード例は**JSからスクリプトオブジェクトを読み込もうとしますが**、**他のタグ**(オブジェクト、スタイルシート、画像、オーディオなど)も使用できます。さらに、**タグを直接**挿入し、タグ内で`onload`および`onerror`イベントを宣言することも可能です(JSから挿入するのではなく)。 この攻撃にはスクリプトなしのバージョンもあります: ```html ``` この場合、`example.com/404` が見つからない場合、`attacker.com/?error` が読み込まれます。 ### Onload Timing - **Inclusion Methods**: HTML Elements - **Detectable Difference**: Timing (一般的にページコンテンツ、ステータスコードによる) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) - **Summary:** [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** を使用して、リクエストを実行するのにかかる時間を測定できます。ただし、他の時計も使用できます。例えば、[**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) は、50msを超えるタスクを特定できます。 - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) 別の例は次の通りです: {{#ref}} performance.now-example.md {{#endref}} #### Onload Timing + Forced Heavy Task この技術は前のものと似ていますが、**attacker** は **関連する時間** をかける **アクションを強制** し、**応答が肯定的または否定的** の場合にその時間を測定します。 {{#ref}} performance.now-+-force-heavy-task.md {{#endref}} ### unload/beforeunload Timing - **Inclusion Methods**: Frames - **Detectable Difference**: Timing (一般的にページコンテンツ、ステータスコードによる) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) - **Summary:** [SharedArrayBuffer clock](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) を使用して、リクエストを実行するのにかかる時間を測定できます。他の時計も使用できます。 - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) リソースを取得するのにかかる時間は、[`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) および [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) イベントを利用して測定できます。**`beforeunload`** イベントは、ブラウザが新しいページに移動しようとしているときに発生し、**`unload`** イベントは、実際にナビゲーションが行われているときに発生します。これら2つのイベント間の時間差を計算することで、**ブラウザがリソースを取得するのにかかった時間** を特定できます。 ### Sandboxed Frame Timing + onload - **Inclusion Methods**: Frames - **Detectable Difference**: Timing (一般的にページコンテンツ、ステータスコードによる) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) - **Summary:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API を使用して、リクエストを実行するのにかかる時間を測定できます。他の時計も使用できます。 - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) [Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/) がない場合、ページとそのサブリソースがネットワーク上で読み込まれるのにかかる時間を攻撃者が測定できることが観察されています。この測定は、iframe の `onload` ハンドラーがリソースの読み込みと JavaScript の実行が完了した後にのみトリガーされるため、通常可能です。スクリプト実行によって導入される変動を回避するために、攻撃者は ` ``` ### #ID + error + onload - **Inclusion Methods**: Frames - **Detectable Difference**: Page Content - **More info**: - **Summary**: 正しいコンテンツにアクセスしたときにページがエラーを出し、任意のコンテンツにアクセスしたときに正しく読み込まれるようにできる場合、時間を測定することなくすべての情報を抽出するためのループを作成できます。 - **Code Example**: ページに**秘密**のコンテンツを**Iframe**内に**挿入**できると仮定します。 被害者に**Iframe**を使用して"_**flag**_"を含むファイルを**検索**させることができます(例えば、CSRFを悪用)。Iframe内では、_**onload event**_が**常に少なくとも一度は実行される**ことがわかっています。次に、**URL**の**iframe**を変更できますが、URL内の**ハッシュ**の**内容**のみを変更します。 例えば: 1. **URL1**: www.attacker.com/xssearch#try1 2. **URL2**: www.attacker.com/xssearch#try2 最初のURLが**正常に読み込まれた**場合、URLの**ハッシュ**部分を**変更**すると、**onload**イベントは**再度トリガーされません**。しかし、ページが**読み込み時に何らかのエラー**を持っていた場合、**onload**イベントは**再度トリガーされます**。 これにより、**正しく**読み込まれたページと、アクセス時に**エラー**が発生したページを**区別**できます。 ### Javascript Execution - **Inclusion Methods**: Frames - **Detectable Difference**: Page Content - **More info**: - **Summary:** ページが**機密**コンテンツを**返す**、またはユーザーによって**制御**可能な**コンテンツ**を返す場合。ユーザーは**無効な場合に有効なJSコードを設定**し、各試行を**`