[Web Hacking] Content Security Policy

1unaramยท2023๋…„ 1์›” 24์ผ
0

[Study] Web Hacking

๋ชฉ๋ก ๋ณด๊ธฐ
3/3

๐Ÿ’ก Dreamhack - Web Hacking Advanced (Client Side) ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.


# Content Security Policy

Background

์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์›น ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š” ์ปจํ…์ธ ๊ฐ€ ์˜๋„๋œ ์ปจํ…์ธ ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†๊ธฐ์—, ํŽ˜์ด์ง€์˜ ์ปจํ…์ธ ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž์›๋“ค์ด ๋ชจ๋‘ ์›น ์„œ๋ฒ„์—์„œ ์˜๋„ํ•œ ์ž์›์ด ๋งž๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Content Security Policy(CSP)๊ฐ€ ํƒ„์ƒํ–ˆ๋‹ค.


Content Security Policy

Content Security Policy(CSP, ์ปจํ…์ธ  ๋ณด์•ˆ ์ •์ฑ…)๋Š” XSS๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฅ˜์˜ ๊ณต๊ฒฉ์ด ๋ฐœ์ƒํ•˜์˜€์„ ๋•Œ ํ”ผํ•ด๋ฅผ ์ค„์ด๊ณ  ์›น ๊ด€๋ฆฌ์ž๊ฐ€ ๊ณต๊ฒฉ ์‹œ๋„๋ฅผ ๋ณด๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ๋ณด์•ˆ ๊ณ„์ธต์ด๋‹ค.

CSP ํ—ค๋”๋Š” 1๊ฐœ ์ด์ƒ์˜ ์ •์ฑ… ์ง€์‹œ๋ฌธ์ด ์„ธ๋ฏธ์ฝœ๋ก ์œผ๋กœ ๋ถ„๋ฆฌ๋œ ํ˜•ํƒœ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ •์ฑ… ์ง€์‹œ๋ฌธ์€ ์ง€์‹œ๋ฌธ(e.g. default-src, srcipt-src ๋“ฑ)๊ณผ 1๊ฐœ ์ด์ƒ์˜ ์ถœ์ฒ˜(e.g. 'self', https:, *.dreamhack.io ๋“ฑ)๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๋ถ„๋ฆฌ๋œ ํ˜•ํƒœ๋กœ ์ง€์ •ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

CSP ๊ตฌ๋ฌธ์€ ๋‹ค์Œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. Content-Security-Policy HTTP ํ—ค๋”์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ๊ตฌ๋ฌธ์—์„œ policy-directive ๋ถ€๋ถ„์— CSP๋ฅผ ์ •์˜ํ•˜๋Š” ์ •์ฑ… ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

    Content-Security-Policy: <policy-directive>; <policy-directive>

    ํŽ˜์ด์ง€ ๋‚ด๋ถ€์˜ ์ž์›๋“ค์ด ๊ฐ™์€ ์˜ค๋ฆฌ์ง„ ํ˜น์€ https://example.com ์—์„œ๋งŒ ๋กœ๋“œ๋˜์–ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ˆ์‹œ

    Content-Security-Policy: default-src 'self' https://example.com
  1. CSP ํ—ค๋”๋Š” meta ํƒœ๊ทธ์˜ ์—˜๋ฆฌ๋จผํŠธ๋กœ๋„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

    <meta http-equiv="Content-Security-Policy" content="default-src 'self' https://example.com">

Content Security Policy ๊ธฐ๋ณธ ์ •์ฑ…

Inline Code

CSP๋Š” ์ธ๋ผ์ธ ์ฝ”๋“œ(Inline code)๋ฅผ ์œ ํ•ดํ•˜๋‹ค๊ณ  ๊ฐ„์ฃผํ•œ๋‹ค. ์ธ๋ผ์ธ ์ฝ”๋“œ๋Š” ํƒœ๊ทธ์˜ src ์†์„ฑ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ํƒœ๊ทธ ๋‚ด์— ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

<script>alert(1);</script> ์™€ ๊ฐ™์ด ํƒœ๊ทธ ๋‚ด์— ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์‚ฝ์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ผ์ธ ์ฝ”๋“œ์ด๋‹ค. ์ด๋Ÿฌํ•œ ํ˜•ํƒœ๋ฅผ ์ง€์–‘ํ•˜๊ณ , <script src="alert.js"></script>์™€ ๊ฐ™์ด src ์†์„ฑ์— ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•œ๋‹ค.

CSP๋Š” <script> ํƒœ๊ทธ ๋‚ด์— ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ, on* ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์†์„ฑ, javascript: URL ์Šคํ‚ด, CSS ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ๋ชจ๋‘ ์ธ๋ผ์ธ ์ฝ”๋“œ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

Eval

CSP๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌธ์ž์—ด ํ…์ŠคํŠธ๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์„ ์œ ํ•ดํ•˜๋‹ค๊ณ  ๊ฐ„์ฃผํ•œ๋‹ค.

  • eval
  • new Function()
  • setTimeout([string], ...)
  • setInterval([string], ...)

์œ„์™€ ๊ฐ™์ด ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ํ•จ์ˆ˜์˜ ์‹คํ–‰์€ ๋ชจ๋‘ ์ฐจ๋‹จ๋œ๋‹ค. ๋‹ค๋งŒ ํ•ด๋‹น ํ•จ์ˆ˜์— ๋ฌธ์ž์—ด ์ž…๋ ฅ์ด ์•„๋‹Œ ์ด๋ผ์ธ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ „๋‹ฌ ๋  ๋•Œ์—๋Š” ์ฐจ๋‹จ๋˜์ง€ ์•Š๋Š”๋‹ค.


Policy Directive

<Policy-directive๋Š” <directive> <value> ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • <directive> : ์ง€์‹œ๋ฌธ. ์ปจํ…์ธ  ๋‚ด์—์„œ ๋กœ๋“œํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์„ธ๋ถ„ํ™”ํ•ด ์–ด๋–ค ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ถœ์ฒ˜๋ฅผ ์ œ์–ดํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.
  • <value> : <directive>์—์„œ ์ •์˜ํ•œ ๋ฆฌ์†Œ์Šค์˜ ์ถœ์ฒ˜๋ฅผ ์ •์˜ํ•œ๋‹ค. <value>์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ถœ์ฒ˜๊ฐ€ ์ •์˜๋  ์ˆ˜ ์žˆ๊ณ  ๊ณต๋ฐฑ์„ ํ†ตํ•ด ๊ตฌ๋ถ„๋œ๋‹ค.
์ง€์‹œ๋ฌธ์„ค๋ช…
defulat-src-src๋กœ ๋๋‚˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ์ œ์–ด. ๋งŒ์•ฝ CSP ๊ตฌ๋ฌธ ๋‚ด์—์„œ ์ง€์ •ํ•˜์ง€ ์•Š์€ ์ง€์‹œ๋ฌธ์ด ์กด์žฌํ•œ๋‹ค๋ฉด default-src์˜ ์ •์˜๋ฅผ ๋”ฐ๋ผ๊ฐ„๋‹ค.
img-src์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์ถœ์ฒ˜๋ฅผ ์ œ์–ดํ•œ๋‹ค.
script-src์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ ๊ด€๋ จ ๊ถŒํ•œ๊ณผ ์ถœ์ฒ˜๋ฅผ ์ œ์–ดํ•œ๋‹ค.
style-src์Šคํƒ€์ผ์‹œํŠธ ๊ด€๋ จ ๊ถŒํ•œ๊ณผ ์ถœ์ฒ˜๋ฅผ ์ œ์–ดํ•œ๋‹ค.
child-srcํŽ˜์ด์ง€ ๋‚ด์— ์‚ฝ์ž…๋œ ํ”„๋ ˆ์ธ ์ปจํ…์ธ ์— ๋Œ€ํ•œ ์ถœ์ฒ˜๋ฅผ ์ œ์–ดํ•œ๋‹ค.
base-uriํŽ˜์ด์ง€์˜ ํƒœ๊ทธ์— ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋Š” URL์„ ์ œ์–ดํ•œ๋‹ค.

์ถœ์ฒ˜์„ค๋ช…
*://example.com์ถœ์ฒ˜์˜ scheme์€ ์™€์ผ๋“œ์นด๋“œ(*)๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„ํ• ์ˆ˜ ์žˆ๋‹ค.
https://*.example.com์ถœ์ฒ˜์˜ ํ˜ธ์ŠคํŠธ ์„œ๋ธŒ๋„๋ฉ”์ธ์€ ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.(๋‹จ, ์™€์ผ๋“œ ์นด๋“œ๋Š” ํ˜ธ์ŠคํŠธ์˜ ์ค‘๊ฐ„์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค.) ์„œ๋ธŒ๋„๋ฉ”์ธ์„ ์™€์ผ๋“œ์นด๋“œ๋กœ ํ‘œํ˜„ํ•  ์‹œ, ์„œ๋ธŒ๋„๋ฉ”์ธ์ด ๋ถ™์–ด์žˆ์ง€ ์•Š๋Š” ๋„๋ฉ”์ธ์€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค. i.e) https://*.example.com์œผ๋กœ ์ถœ์ฒ˜๋ฅผ ํ‘œ๊ธฐํ•  ๊ฒฝ์šฐ, https:.//example.com์€ ํฌํ•จ ์•ˆ๋จ
https://example.com:*์ถœ์ฒ˜์˜ ํฌํŠธ๋Š” ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
none๋ชจ๋“  ์ถœ์ฒ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
selfํŽ˜์ด์ง€์˜ ํ˜„์žฌ ์ถœ์ฒ˜(Origin) ๋‚ด์—์„œ ๋กœ๋“œํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋งŒ ํ—ˆ์šฉํ•œ๋‹ค.
unsafe-inline์˜ˆ์™ธ์ ์œผ๋กœ ์ธ๋ผ์ธ ์ฝ”๋“œ์˜ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•œ๋‹ค.
unsafe-eval์˜ˆ์™ธ์ ์œผ๋กœย eval๊ณผ ๊ฐ™์€ ํ…์ŠคํŠธ-์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€ํ™˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•œ๋‹ค.
nonce-<base64-value>nonceย ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ ์˜ˆ์™ธ์ ์œผ๋กœ ์ธ๋ผ์ธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.ย <base64-value>ย ๋Š” ๋ฐ˜๋“œ์‹œ ์š”์ฒญ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋‚œ์ˆ˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. ํ•ด๋‹น ์ถœ์ฒ˜๋ฅผ ์„ค์ •ํ•˜๋ฉดย unsafe-inlineย ์€ ๋ฌด์‹œ๋œ๋‹ค.
<hash-algorithm>-<base64-value>scriptย ํ˜น์€ย styleย ํƒœ๊ทธ ๋‚ด ์ฝ”๋“œ์˜ ํ•ด์‹œ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. ํ•ด๋‹น ์ถœ์ฒ˜๋ฅผ ์„ค์ •ํ•˜๋ฉดย unsafe-inlineย ์€ ๋ฌด์‹œ๋œ๋‹ค.

CSP Examples

Content-Security-Policy: default-src 'self'

: ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์˜ ์ถœ์ฒ˜๋ฅผ ํ˜„์žฌ ํŽ˜์ด์ง€์™€ ๊ฐ™์€ ์ถœ์ฒ˜๋กœ ์ œํ•œํ•œ๋‹ค.


Content-Security-Policy: default-src 'self' https://example.com

: ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์˜ ์ถœ์ฒ˜๋ฅผ ํ˜„์žฌ ํŽ˜์ด์ง€์™€ ๊ฐ™์€ ์ถœ์ฒ˜์™€ https://example.com์œผ๋กœ ์ œํ•œํ•œ๋‹ค.


Content-Security-Policy: default-src 'self'; img-src *; script-src static.example.com

: ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์˜ ์ถœ์ฒ˜๋ฅผ ํ˜„์žฌ ํŽ˜์ด์ง€์™€ ๊ฐ™์€ ์ถœ์ฒ˜๋กœ ์ œํ•œ, ์ด๋ฏธ์ง€์˜ ์ถœ์ฒ˜๋Š” ๋ชจ๋“  ํ˜ธ์ŠคํŠธ๋ฅผ ํ—ˆ์šฉ, ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ์˜ ์ถœ์ฒ˜๋Š” static.example.com์œผ๋กœ ์ œํ•œํ•œ๋‹ค.


Content-Security-Policy: child-src 'self' frame.example.com

: ํŽ˜์ด์ง€ ๋‚ด์— ์‚ฝ์ž…๋œ ํ”„๋ ˆ์ž„ ์ปจํ…์ธ  URL์€ frame.example.com ๋‚ด์˜ ์ปจํ…์ธ ๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.


Content-Security-Policy: base-uri 'none'

: base ํƒœ๊ทธ์˜ URL์€ ์–ด๋А ๊ฒƒ๋„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.


Content-Security-Policy: script-src 'unsafe-eval

: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ๋‚ด์— eval๊ณผ ๊ฐ™์€ ํ…์ŠคํŠธ-์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€ํ™˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•œ๋‹ค.


Content-Security-Policy: script-src 'unsafe-inline'

: ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ ๋‚ด ์ธ๋ผ์ธ ์ฝ”๋“œ์˜ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•œ๋‹ค.


Content-Security-Policy: script-src 'nonce-YTQyYWZkODYtYWYyNy00ZGQzLTg2YjMtNzJhY2ZmOWY5OGNj'

: ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ์˜ nonce ์†์„ฑ์— YTQyYWZkODYtYWYyNy00ZGQzLTg2YjMtNzJhY2ZmOWY5OGNj ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์Šคํฌ๋ฆฝํŠธ ๋กœ๋“œ์— ์‹คํŒจํ•œ๋‹ค.


Content-Security-Policy: script-src 'sha256-5jFwrAK0UV47oFbVg/iCCBbxD8X1w+QvoOUepu4C2YA='

: ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ ๋‚ด์˜ ์ฝ”๋“œ ํ˜น์€ src ์†์„ฑ์œผ๋กœ ์ง€์ •๋œ ํŒŒ์ผ์˜ sha256 ํ•ด์‹œ๋ฅผ base64๋กœ ์ธ์ฝ”๋”ฉํ•œ ๊ฒฐ๊ณผ๊ฐ€ 5jFwrAK0UV47oFbVg/iCCBbxD8X1w+QvoOUepu4C2YA= ์™€ ๋‹ค๋ฅด๋‹ค๋ฉด ์Šคํฌ๋ฆฝํŠธ ๋กœ๋“œ์— ์‹คํŒจํ•œ๋‹ค.



# CSP Bypass

์‹ ๋ขฐํ•˜๋Š” ๋„๋ฉ”์ธ์— ์—…๋กœ๋“œ

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

<meta http-equiv="Content-Security-Policy" content="script-src 'self'">

<h1>๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ: <script src="/download_file.php?id=177742"></script></h1>

JSONP API

CSP์—์„œ ํ—ˆ์šฉํ•œ ์ถœ์ฒ˜๊ฐ€ JSONP API๋ฅผ ์ง€์›ํ•œ๋‹ค๋ฉด, callback ํŒŒ๋ผ๋ฏธํ„ฐ์— ์›ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์›น ํŽ˜์ด์ง€์—์„œ *.google.com์—์„œ ์˜จ ์ถœ์ฒ˜๋งŒ ํ—ˆ์šฉํ•  ๊ฒฝ์šฐ, ๊ตฌ๊ธ€์—์„œ JSONP API๋ฅผ ์ง€์›ํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์ฐพ์•„ callback์— ์›ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

https://accounts.google.com/o/oauth2/revoke?callback=alert(1);

nonce ์˜ˆ์ธก ๊ฐ€๋Šฅ

CSP์˜ nonce๋ฅผ ์ด์šฉํ•˜๋ฉด ๋”ฐ๋กœ ๋„๋ฉ”์ธ์ด๋‚˜ ํ•ด์‹œ ๋“ฑ์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” nonce ๊ฐ’์ด ํƒœ๊ทธ ์†์„ฑ์— ์กด์žฌํ•  ๊ฒƒ์„ ์š”๊ตฌํ•จ์œผ๋กœ์จ XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” nonce๊ฐ€ ๊ณต๊ฒฉ์ž๊ฐ€ ์ทจ๋“ํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ทจ์•ฝํ•˜์—ฌ ๊ฐ’์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ณต๊ฒฉ์ž๋Š” ์ด๋ฅผ ์œ ์ถ”ํ•ด ์ž์‹ ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์›น ์‚ฌ์ดํŠธ์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ex) ํ˜„์žฌ ์‹œ๊ฐ(srand() / rand()) ๋“ฑ ๊ณต๊ฒฉ์ž๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด.


base-uri ๋ฏธ์ง€์ •

HTML ํ•˜์ดํผ๋งํฌ์—์„œ ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ ์—†์ด ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ํ˜„์žฌ ๋ฌธ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์„œ๋ฅผ ํ•ด์„ํ•œ๋‹ค. HTML <base> ํƒœ๊ทธ๋Š” ๊ฒฝ๋กœ๊ฐ€ ํ•ด์„๋˜๋Š” ๊ธฐ์ค€์ ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉฐ, <a>, <form> ๋“ฑ์˜ target ์†์„ฑ์˜ ๊ธฐ๋ณธ ๊ฐ’์„ ์ง€์ •ํ•˜๋„๋ก ํ•œ๋‹ค.

์ด๋–„, base-uri CSP ๊ตฌ๋ฌธ์„ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ base ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž„์˜ ์ž์›์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜•ํƒœ์˜ ๊ณต๊ฒฉ์„ Nonce Retargeting์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

base-uriย ์ง€์‹œ๋ฌธ์„ ์ž„์˜๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ์ด์ƒย defaultย ์ดˆ๊ธฐ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์›น ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œย base-uriย ์ง€์‹œ๋ฌธ์„ ์ •์˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

profile
Migration to https://1unaram.github.io/

0๊ฐœ์˜ ๋Œ“๊ธ€