2025 ํ•˜๋ฐ˜๊ธฐ Hot๐Ÿ”ฅ๋ณด์•ˆ ์‚ฌ๊ฑด ์‚ฌ๊ณ 

2025๋…„ ํ•˜๋ฐ˜๊ธฐ ์ฃผ์š” ๋ณด์•ˆ ์ด์Šˆ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค: Phrack APT Down ๋ณด๊ณ ์„œ, NPM ๊ณต๊ธ‰๋ง ๊ณต๊ฒฉ, ๋กฏ๋ฐ์นด๋“œ ๊ฐœ์ธ ์‹ ์šฉ ์ •๋ณด ์œ ์ถœ, Redis ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰, SK ์‰ด๋”์Šค ๋‚ด๋ถ€ ์ž๋ฃŒ ์œ ์ถœ, Cloudflare ์„œ๋น„์Šค ์žฅ์• , ์ฟ ํŒก ๋Œ€๊ทœ๋ชจ ๊ณ ๊ฐ ๊ฐœ์ธ์ •๋ณด ์œ ์ถœ, React2Shell ์‚ฌ๊ฑด. ์ตœ์‹  ๋ณด์•ˆ ํŠธ๋ Œ๋“œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
Frontier Squad's avatar
Dec 31, 2025
2025 ํ•˜๋ฐ˜๊ธฐ Hot๐Ÿ”ฅ๋ณด์•ˆ ์‚ฌ๊ฑด ์‚ฌ๊ณ 

๋“ค์–ด๊ฐ€๋ฉฐ

๋‹ค์‚ฌ๋‹ค๋‚œํ–ˆ๋˜ 2025๋…„์ด ์ €๋ฌผ์–ด ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌํ•ด๋Š” ์œ ๋… ๋งŽ์€ ๋ณด์•ˆ ์‚ฌ๊ฑด๊ณผ ์‚ฌ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ์ง€์†์ ์œผ๋กœ ๋ณด์•ˆ์ด ์ด์Šˆ๊ฐ€ ๋œ ํ•œ ํ•ด์˜€์Šต๋‹ˆ๋‹ค. ์ƒ๋ฐ˜๊ธฐ์— ์ด์–ด ํ•˜๋ฐ˜๊ธฐ์—๋„ ๋Œ€ํ˜• ๋ณด์•ˆ ์‚ฌ๊ณ ๊ฐ€ ๋‹ค์ˆ˜ ๋ฐœ์ƒํ•˜์˜€๊ณ , ์–ธ๋ก ์„ ํ†ตํ•ด ๊ด€๋ จ ์†Œ์‹์ด ์—ฐ์ผ ๋ณด๋„๋˜๋ฉฐ ๋ณด์•ˆ ์—…๊ณ„ ์ข…์‚ฌ์ž๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ๋ณด์•ˆ ์นจํ•ด ์‚ฌ๊ณ ๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ธ์‹ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฅ์—์„œ๋„ ๋‹ค์ˆ˜์˜ ๊ณ ๊ฐ์‚ฌ์™€ ์†Œํ†ตํ•˜๋ฉฐ ๋ณด์•ˆ์— ๋Œ€ํ•œ ๊ฒฝ๊ฐ์‹ฌ๊ณผ ์ฃผ๋ชฉ๋„๊ฐ€ ๋†’์•„์ง„ ๊ฒƒ์„ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ํ‹ฐ์˜ค๋ฆฌ Frontier Squad ํŒ€์˜ ์—ฐ๊ตฌ์›๋“ค์ด ์„ ์ •ํ•œ ๋ณด์•ˆ ์‚ฌ๊ฑด/์‚ฌ๊ณ ๋ฅผ ํ†ตํ•ด 2025๋…„์˜ ํ•˜๋ฐ˜๊ธฐ๋ฅผ ๋Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ƒ๋ฐ˜๊ธฐ์˜ ์ฃผ์š” ๋ณด์•ˆ ์‚ฌ๊ฑด/์‚ฌ๊ณ ์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ 2025 ์ƒ๋ฐ˜๊ธฐ ๋ณด์•ˆ ์‚ฌ๊ฑด ์‚ฌ๊ณ ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


1. Phrack Report: โ€œAPT Down โ€“ The North Korea Filesโ€

2025๋…„ 8์›” 8์ผ, ๊ตญ์ œ ํ•ด์ปค ๋งค๊ฑฐ์ง„ Phrack 72ํ˜ธ์— APT Down โ€“ The North Korea Files๋ผ๋Š” ์ œ๋ชฉ์˜ ๊ธฐ์ˆ  ๋ณด๊ณ ์„œ๊ฐ€ ๊ณต๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. โ€˜Saberโ€™, โ€˜cyb0rgโ€™๋ผ๋Š” ํ™œ๋™๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ํ•ด์ปค๊ฐ€ ๊ฒŒ์žฌํ•œ ํ•ด๋‹น ๋ณด๊ณ ์„œ๋Š” ๋Œ€ํ•œ๋ฏผ๊ตญ์˜ ๊ณต๊ณตยท๋ฏผ๊ฐ„ ์˜์—ญ์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ ๊ณต๊ฒฉ ํ™œ๋™์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์–ด, ๊ณต๊ฐœ ์งํ›„ ๊ตญ๋‚ด ๋ณด์•ˆ ์—…๊ณ„์— ํฐ ํŒŒ์žฅ์„ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค.

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

ํ•ด๋‹น ์ •ํ™ฉ์€ ์ •๋ถ€์˜ ๋ฐœํ‘œ์— ๋”ฐ๋ผ ์‚ฌ์‹ค๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตญ๊ฐ€์ •๋ณด์›์€ 2025๋…„ 10์›” 17์ผ ๊ณต๊ฐœ ๋ฐœํ‘œ๋ฅผ ํ†ตํ•ด, ์™ธ๋ถ€ ํ•ด์ปค๊ฐ€ 6๊ฐœ์˜ ์ธ์ฆ์„œ์™€ 6๊ฐœ์˜ ๊ตญ๋‚ด์™ธ IP๋ฅผ ์ด์šฉํ•ด ๋ฒ”์ •๋ถ€ ์—…๋ฌด์‹œ์Šคํ…œ์ธ ์˜จ๋‚˜๋ผ์‹œ์Šคํ…œ์— ์ ‘์†ํ–ˆ๋‹ค๊ณ  ๋ฐํ˜”์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ•ด์ปค๋“ค์ด 2022๋…„ 9์›”๋ถ€ํ„ฐ 2025๋…„ 7์›”๊นŒ์ง€ ์ •๋ถ€ ์›๊ฒฉ์ ‘์†์‹œ์Šคํ…œ(G-VPN)์„ ํ†ต๊ณผํ•˜์—ฌ ์˜จ๋‚˜๋ผ์‹œ์Šคํ…œ์—์„œ ์ž๋ฃŒ๋ฅผ ์—ด๋žŒํ•œ ์‚ฌ์‹ค์„ ํ™•์ธํ•˜์˜€๋‹ค๊ณ  ๋ง๋ถ™์˜€์Šต๋‹ˆ๋‹ค.

์˜จ๋‚˜๋ผ์‹œ์Šคํ…œ ๋“ฑ ์ •๋ถ€ ํ–‰์ •๋ง(๋‚ด๋ถ€๋ง) ์นจํˆฌ ๊ฐœ์š”๋„(์ด๋ฏธ์ง€ ์ถœ์ฒ˜: ๊ตญ๊ฐ€์ •๋ณด์›)

๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ํ”ผํ•ด ๋ฒ”์œ„๋Š” ํ–‰์ •์•ˆ์ „๋ถ€์˜ ๋ธŒ๋ฆฌํ•‘๊ณผ ๋ณด๋„๋ฅผ ํ†ตํ•ด ์•Œ๋ ค์กŒ์Šต๋‹ˆ๋‹ค. ํ–‰์ •์•ˆ์ „๋ถ€์— ๋”ฐ๋ฅด๋ฉด 650๋ช…๋ถ„์˜ ๊ณต๋ฌด์› ์ธ์ฆ์„œ ํŒŒ์ผ ์œ ์ถœ์ด ํ™•์ธ๋˜์—ˆ๊ณ , ์ด ์ค‘ 12๊ฑด์€ GPKI ํ‚ค์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ•จ๊ป˜ ํฌํ•จ๋œ ์‚ฌ๋ก€์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๋Œ€๋ถ€๋ถ„์€ ์ด๋ฏธ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋œ ์ธ์ฆ์„œ์˜€๊ณ , ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์€ 3๋ช…์˜ ์ธ์ฆ์„œ์— ๋Œ€ํ•ด์„œ๋„ 2025๋…„ 8์›” 13์ผ ํ๊ธฐ ์กฐ์น˜๊ฐ€ ์ด๋ฃจ์–ด์กŒ๋‹ค๊ณ  ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๊ธฐ์ˆ ์  ๊ด€์ ์—์„œ ๋ณธ ์ด๋ฒˆ ์‚ฌ๊ฑด์˜ ํ•ต์‹ฌ ์š”์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ณต๋ฌด์› ์ธ์ฆ์„œ(GPKI) ์œ ์ถœ ๋ฐ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ

  • G-VPN์„ ๊ฒฝ์œ ํ•œ ์›๊ฒฉ์ ‘์† ํ™˜๊ฒฝ์—์„œ์˜ ์ธ์ฆ ๋‹จ๊ณ„ ๋‹จ์ˆœํ™”

  • ์˜จ๋‚˜๋ผ์‹œ์Šคํ…œ ์ธ์ฆ ๋กœ์ง ๋ฐ ์ ‘๊ทผ ์ œ์–ด ๊ตฌ์กฐ์˜ ๋…ธ์ถœ

  • ์žฅ๊ธฐ๊ฐ„(์•ฝ 3๋…„)์— ๊ฑธ์นœ ๋น„์ธ๊ฐ€ ์ž๋ฃŒ ์—ด๋žŒ ํƒ์ง€ ์‹คํŒจ

์‚ฌ๊ฑด ์ธ์ง€ ์ดํ›„ ๋Œ€์‘ ๊ณผ์ •์—์„œ ๋น„๊ต์  ์‹ ์†ํ•œ ๊ธฐ์ˆ ์  ์กฐ์น˜๊ฐ€ ๋ณ‘ํ–‰๋˜์—ˆ๋‹ค๋Š” ์ ์€ ๊ธ์ •์ ์ธ ์ธก๋ฉด์ž…๋‹ˆ๋‹ค. ํ–‰์ •์•ˆ์ „๋ถ€๋Š” 2025๋…„ 7์›” 28์ผ ์˜จ๋‚˜๋ผ์‹œ์Šคํ…œ ๋กœ๊ทธ์ธ ์ •๋ณด ์žฌ์‚ฌ์šฉ ์ฐจ๋‹จ ์กฐ์น˜๋ฅผ ์ค‘์•™๋ถ€์ฒ˜ ๋ฐ ์ง€๋ฐฉ์ž์น˜๋‹จ์ฒด์— ์ ์šฉํ•˜์˜€๊ณ , 8์›” 4์ผ๋ถ€ํ„ฐ๋Š” G-VPN ์ ‘์† ์‹œ GPKI ์ธ์ฆ์— ๋”ํ•ด ์ „ํ™” ๊ธฐ๋ฐ˜ 2์ฐจ ์ธ์ฆ(ARS)์„ ์˜๋ฌดํ™”ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ตญ๊ฐ€์ •๋ณด์›์€ ์•…์šฉ๋œ IP ์ •๋ณด๋ฅผ ์ „ ๊ตญ๊ฐ€ยท๊ณต๊ณต๊ธฐ๊ด€์— ์ „ํŒŒํ•˜์—ฌ ์ฐจ๋‹จ ์กฐ์น˜๋ฅผ ์ ์šฉํ•˜์˜€์œผ๋ฉฐ, ์ผ๋ถ€ ๋ถ€์ฒ˜์˜ ์ „์šฉ ์‹œ์Šคํ…œ ๊ณต๊ฒฉ ์—ฌ๋ถ€๋„ ์ถ”๊ฐ€๋กœ ํ™•์ธํ•˜์—ฌ ์กฐ์‚ฌ ์ค‘์ด๋ผ๊ณ  ๋ฐํ˜”์Šต๋‹ˆ๋‹ค.

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

์ด๋ฒˆ ์‚ฌ๊ฑด์€ ๊ณต๋ฌด์› ํ–‰์ •์—…๋ฌด ์ „๋ฐ˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ์—…๋ฌด์‹œ์Šคํ…œ์œผ๋กœ ์•Œ๋ ค์ง„ ์˜จ๋‚˜๋ผ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์žฅ๊ธฐ๊ฐ„(2022๋…„ 9์›”~2025๋…„ 7์›”)์˜ ๋ฌด๋‹จ ์ ‘๊ทผ ๋ฐ ์ž๋ฃŒ ์—ด๋žŒ์ด ๊ณต์‹์ ์œผ๋กœ ํ™•์ธ๋œ ์‚ฌ๋ก€๋กœ, ๊ณต๋ฌด์›์˜ ์ผ์ƒ์ ์ธ ํ–‰์ • ์—…๋ฌด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ด ๊ณต๊ฒฉ ํ‘œ๋ฉด์ด ๋  ์ˆ˜ ์žˆ์Œ์„ ๋ช…ํ™•ํžˆ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด๋ฒˆ ์‚ฌ๊ฑด์€ ์ธ์ฆ์„œ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๊ตฌ์กฐ์™€ ์›๊ฒฉ๊ทผ๋ฌด ์ธํ”„๋ผ๊ฐ€ ์ผ์ƒํ™”๋œ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์„ ๋ณด์—ฌ์ฃผ๋Š” ์‚ฌ๋ก€๋กœ์„œ, ํ•ต์‹ฌ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ ‘๊ทผ ํ†ต์ œ์™€ ์ธ์ฆ ์„ค๊ณ„๋ฅผ ๋ณด๋‹ค ๋†’์€ ์ˆ˜์ค€์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค.

References


2. NPM Supply Chain Attack

Javascript์™€ Node.js ์ƒํƒœ๊ณ„์˜ ์ค‘์‹ฌ์ธ npm(Node Package Manager) ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” 2025๋…„ ๊ธฐ์ค€ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ํŒจํ‚ค์ง€๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ฃผ๊ฐ„ ๋‹ค์šด๋กœ๋“œ ์ˆ˜๊ฐ€ ์ˆ˜์‹ญ์–ต ๊ฑด์— ๋‹ฌํ•˜๋Š” ์„ธ๊ณ„ ์ตœ๋Œ€์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ €์žฅ์†Œ๋กœ ์ž๋ฆฌ ์žก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ฑ์€ ์—ญ์„ค์ ์œผ๋กœ ๊ณต๊ฒฉ์ž์—๊ฒŒ ํฐ ๊ทœ๋ชจ์˜ ๊ณต๊ฒฉ ํ‘œ๋ฉด์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 2025๋…„ 9์›”์€ npm์—์„œ ์‹ฌ๊ฐ๋„ ๋†’์€ ๊ณต๊ธ‰๋ง ๋ณด์•ˆ ์‚ฌ๊ณ ๋“ค์ด ๋ฐœ์ƒํ•œ ์‹œ๊ธฐ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ๊ธฐ ๋ฐœ์ƒํ•œ ์ผ๋ จ์˜ ์‚ฌ๊ฑด๋“ค์€ ์˜คํ”ˆ ์†Œ์Šค ์ƒํƒœ๊ณ„์˜ ์•”๋ฌต์  ์‹ ๋ขฐ(Implicit Trust) ๋ชจ๋ธ์˜ ์ทจ์•ฝ์„ฑ์„ ์—ฌ์‹คํžˆ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

npm ํŒจํ‚ค์ง€ ์—ฐ์‡„ ์นจํ•ด

2025๋…„ 9์›” 8์ผ, ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์–‘ํ•œ npm ํŒจํ‚ค์ง€์— ์•…์„ฑ ์ฝ”๋“œ๊ฐ€ ์ฃผ์ž…๋˜๋Š” ์‚ฌ๊ฑด์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์‚ฌ๊ฑด์€ ๊ธฐ์ˆ ์  ์ทจ์•ฝ์ ์ด๋‚˜ ์ •๊ตํ•œ APT ๊ณต๊ฒฉ์ด ์•„๋‹Œ, ํŒจํ‚ค์ง€ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋ฅผ ๋…ธ๋ฆฐ ํ”ผ์‹ฑ ๊ณต๊ฒฉ์— ์˜ํ•ด ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

qix๋ผ๋Š” ID๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์ธํ…Œ์ด๋„ˆ๋Š” npm ์ง€์›ํŒ€(support@npmjs.help)์„ ์‚ฌ์นญํ•œ ์ด๋ฉ”์ผ์„ ์ˆ˜์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ด๋ฉ”์ผ์€ ๋ฉ”์ธํ…Œ์ด๋„ˆ์˜ 2๋‹จ๊ณ„ ์ธ์ฆ(2FA) ์ž๊ฒฉ ์ฆ๋ช…์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ช…๋ชฉ์œผ๋กœ ๊ฐ€์งœ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ ‘์†์„ ์œ ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์ด์™€ ๊ฐ™์€ ์ „ํ˜•์ ์ธ ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ(AiTM, Adversary-in-the-Middle) ๊ธฐ๋ฒ•์„ ํ†ตํ•ด, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฉ”์ธํ…Œ์ด๋„ˆ๊ฐ€ ์ž…๋ ฅํ•œ ID, ๋น„๋ฐ€๋ฒˆํ˜ธ, OTP(One-Time Password) ์ฝ”๋“œ๋ฅผ ๊ฐ€๋กœ์ฑ„์–ด ์‹ค์ œ npm ์„ธ์…˜์„ ํƒˆ์ทจํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณต๊ฒฉ์ž๋Š” ํƒˆ์ทจํ•œ ์„ธ์…˜์„ ํ†ตํ•ด 18๊ฐœ์˜ ํ•ต์‹ฌ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ํš๋“ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ npm ์ƒํƒœ๊ณ„์˜ ๊ธฐ์ดˆ์ ์ธ ์—ญํ• ์„ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉ๋  ๋ฟ ์•„๋‹ˆ๋ผ ์ˆ˜๋งŒ ๊ฐœ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์˜์กด์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด ๋ง‰๋Œ€ํ•œ ์—ฐ์‡„์  ํŒŒ๊ธ‰ ํšจ๊ณผ๋ฅผ ๋‚ณ์•˜์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€๋ช…

๋ฒ„์ „(์•…์„ฑ)

์ฃผ๊ฐ„ ๋‹ค์šด๋กœ๋“œ ์ˆ˜

์ฃผ์š” ๊ธฐ๋Šฅ ๋ฐ ์—ญํ• 

chalk

5.6.1

์ˆ˜์–ต ๊ฑด

ํ„ฐ๋ฏธ๋„ ๋ฌธ์ž์—ด ์Šคํƒ€์ผ๋ง (์‚ฌ์‹ค์ƒ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)

debug

4.4.2

์ˆ˜์–ต ๊ฑด

๋””๋ฒ„๊น… ์œ ํ‹ธ๋ฆฌํ‹ฐ (๋Œ€๋‹ค์ˆ˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์˜์กด์„ฑ)

ansi-styles

6.2.2

์ˆ˜์ฒœ๋งŒ ๊ฑด

ANSI ์ƒ‰์ƒ ์ฝ”๋“œ ๊ด€๋ฆฌ

strip-ansi

7.1.1

์ˆ˜์ฒœ๋งŒ ๊ฑด

ANSI ์ด์Šค์ผ€์ดํ”„ ์ฝ”๋“œ ์ œ๊ฑฐ

supports-color

10.2.1

์ˆ˜์ฒœ๋งŒ ๊ฑด

ํ„ฐ๋ฏธ๋„ ์ƒ‰์ƒ ์ง€์› ๊ฐ์ง€

ํ•ด๋‹น ํŒจํ‚ค์ง€๋“ค์˜ ์ฃผ๊ฐ„ ๋‹ค์šด๋กœ๋“œ ์ˆ˜ ํ•ฉ๊ณ„๋Š” ์•ฝ 26์–ต๊ฑด์— ๋‹ฌํ–ˆ์œผ๋ฉฐ, ์ด๋Š” npm ์ƒํƒœ๊ณ„ ์ „์ฒด ํŠธ๋ž˜ํ”ฝ์˜ ์ƒ๋‹น ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ณต๊ฒฉ์ž๋Š” ์ด์™€ ๊ฐ™์ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ๊ฐ์—ผ์‹œํ‚ด์œผ๋กœ์จ, ๋ณ„๋„์˜ ํ•ดํ‚น ๊ณผ์ • ์—†์ด๋„ ์†์‰ฝ๊ฒŒ ์ „ ์„ธ๊ณ„ ์ˆ˜๋ฐฑ๋งŒ ๋Œ€์˜ ๊ฐœ๋ฐœ์ž PC, CI/CD ์„œ๋ฒ„, ์ด์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์— ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์•…์„ฑ ์ฝ”๋“œ ๋ถ„์„

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

ํ•ด๋‹น ์•…์„ฑ ์ฝ”๋“œ๋Š” ๋‚œ๋…ํ™”๋œ Javascript ํ˜•ํƒœ๋กœ ๋ฐฐํฌ๋˜์—ˆ์œผ๋ฉฐ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฒˆ๋“ค์— ํฌํ•จ๋œ ์ƒํƒœ๋กœ ์ „๋‹ฌ๋˜์–ด ์ตœ์ข… ์ด์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋  ๋•Œ ํ™œ์„ฑํ™”๋˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

chalk ๋‚ด ๋ฐœ๊ฒฌ๋œ ์•…์„ฑ ์ฝ”๋“œ ์ผ๋ถ€
  1. ๋„คํŠธ์›Œํฌ API ํ›„ํ‚น: ๋ธŒ๋ผ์šฐ์ €์˜ API ์ค‘ ํ•˜๋‚˜์ธ window.fetch์™€ XMLHttpRequest.prototype.send๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ, ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ๋น„๋™๊ธฐ ์›น ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๊ณ  ๊ฐ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

  2. ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ ์Šค์บ”: ์ด์šฉ์ž๊ฐ€ ์•”ํ˜ธํ™”ํ ์ง€๊ฐ‘(์˜ˆ: Metamask, Coinbase Wallet)์„ ์ด์šฉํ•ด ํŠธ๋žœ์žญ์…˜์„ ์‹œ๋„ํ•  ๋•Œ, ์•…์„ฑ ์ฝ”๋“œ๋Š” ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์˜ ๋ณธ๋ฌธ(Payload)๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ์ด๋”๋ฆฌ์›€์ด๋‚˜ ๋น„ํŠธ์ฝ”์ธ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๋ธ”๋ก์ฒด์ธ์˜ ์ฃผ์†Œ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  3. ์ •๊ทœํ‘œํ˜„์‹๊ณผ ํŒจํ„ด ๋งค์นญ: ๋‹ค์–‘ํ•œ ์•”ํ˜ธํ™”ํ ์ฃผ์†Œ ํƒ์ƒ‰์„ ์œ„ํ•ด ์ •๊ตํ•œ ์ •๊ทœํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋‹จ์ˆœํ•œ ์ฃผ์†Œ ํƒ์ƒ‰ ์™ธ์—๋„ rpc, api, wallet ๋“ฑ์˜ ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋œ ์š”์ฒญ์„ ํƒ€๊ฒŸํŒ…ํ•˜์—ฌ ํƒ์ง€ ํ™•๋ฅ ์„ ๋‚ฎ์ท„์Šต๋‹ˆ๋‹ค.

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

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

Shai-Hulud ์›œ๊ณผ ์ž๋™ํ™”๋œ ์ „ํŒŒ

2025๋…„ 9์›” 15์ผ์—๋Š” ๊ฐœ๋ฐœ์ž ํ™˜๊ฒฝ์„ ๊ณต๊ฒฉํ•˜๋Š” Shai-Hulud ์›œ์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์›œ์€ ์‹œ์Šคํ…œ ์ž๋™ํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์—ญ์œผ๋กœ ์ด์šฉํ•˜์—ฌ ์Šค์Šค๋กœ ์ „ํŒŒ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ•˜์—ฌ, npm ์ƒํƒœ๊ณ„์—์„œ ์ž๊ฐ€ ๋ณต์ œ์— ์„ฑ๊ณตํ•œ ์ตœ์ดˆ์˜ ๊ณต๊ธ‰๋ง ํ˜• ์›œ ๊ณต๊ฒฉ ์‚ฌ๋ก€๋กœ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.

Dune์— ๋“ฑ์žฅํ•˜๋Š” Shai Hulud(์ด๋ฏธ์ง€ ์ถœ์ฒ˜: John Schoenherr, Heretics of Dune)

Shai-Hulud์˜ ํ•ต์‹ฌ ๋ชฉํ‘œ๋Š” ๊ฐœ๋ฐœ์ž์˜ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐ์—ผ์‹œํ‚จ ํ›„, ํ•ด๋‹น ๊ฐœ๋ฐœ์ž๊ฐ€ ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ๋‹ค๋ฅธ npm ํŒจํ‚ค์ง€๋กœ ๊ฐ์—ผ์„ ํ™•์‚ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ณต๊ฒฉ์ž๋Š” ๊ฐœ๋ณ„ ํŒจํ‚ค์ง€๋ฅผ ํ•˜๋‚˜์”ฉ ์นจํ•ดํ•˜์ง€ ์•Š๊ณ , ๋‹จ์ผ ๊ฐœ๋ฐœ์ž ๊ณ„์ •์„ ๊ธฐ์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ํ™•์‚ฐ์„ ์œ ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›œ์˜ ๋™์ž‘ ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ดˆ๊ธฐ ์นจํˆฌ: ์›œ์€ ๊ฐ์—ผ๋œ ํŒจํ‚ค์ง€์˜ postinstall ํ˜น์€ preinstall ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ npm install ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ๋ณ„๋„์˜ ํ™•์ธ ์ ˆ์ฐจ ์—†์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  2. ์ž๊ฒฉ ์ฆ๋ช… ์Šค์บ๋‹: ์‹คํ–‰๋œ ์›œ์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(env) ๋ฐ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ ์„ค์ • ํŒŒ์ผ(์˜ˆ: .npmrc, .aws/credentials, .git-credentials)์„ ์Šค์บ”ํ•˜์—ฌ, ํฌ๋ฆฌ๋ด์…œ(์˜ˆ: NPM_TOKEN, GITHUB_TOKEN, ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์˜ API ํ‚ค)์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.

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

Shai-Hulud๋Š” ํŠนํžˆ Github Actions์™€ ๊ฐ™์€ CI/CD ํ™˜๊ฒฝ์„ ์ฃผ์š” ๊ณต๊ฒฉ ๋Œ€์ƒ์œผ๋กœ ์‚ผ์•˜์Šต๋‹ˆ๋‹ค. CI/CD ํ™˜๊ฒฝ์€ ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ์œ„ํ•ด ๋†’์€ ๊ถŒํ•œ์˜ APIํ‚ค์™€ ์‹œํฌ๋ฆฟ์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์›œ์€ ์ด๋ฅผ ํƒˆ์ทจํ•˜์—ฌ ๊ณต๊ฒฉ์ž ์ œ์–ด ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๊ณ , ๊ฐ์—ผ๋œ ์ €์žฅ์†Œ์— ์•…์„ฑ ์›Œํฌํ”Œ๋กœ์šฐ ํŒŒ์ผ(์˜ˆ: .github/workflows/shai-hulud-workflow.yml)์„ ์ƒ์„ฑํ•˜์—ฌ ์ง€์†์„ฑ์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋กœ์ปฌ์—์„œ ์•…์„ฑ ํŒจํ‚ค์ง€๋ฅผ ์‚ญ์ œํ•˜๋”๋ผ๋„, ์›๊ฒฉ ์ €์žฅ์†Œ์˜ ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ๋‹ค์‹œ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์‹œํฌ๋ฆฟ์„ ์œ ์ถœํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ํ˜•์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

2025๋…„ 11์›”์— ๋ฐœ๊ฒฌ๋œ ๋ณ€์ข…์ธ Shai-Hulud 2.0์€ ๋”์šฑ ๊ณต๊ฒฉ์ ์ธ ์„ฑํ–ฅ์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์›œ์€ C2์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ํŠน์ • ์กฐ๊ฑด์—์„œ ์‹คํ–‰์ด ์ฐจ๋‹จ๋  ๊ฒฝ์šฐ, ๊ฐ์—ผ๋œ ์‹œ์Šคํ…œ์˜ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๋‚˜ ์ฃผ์š” ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์‚ญ์ œ(rm -rf ~/*)ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํ•œ ์ •๋ณด ํƒˆ์ทจ๋ฅผ ๋„˜์–ด, ๊ฐœ๋ฐœ์ž์˜ ์ž‘์—…๋ฌผ์„ ํŒŒ๊ดดํ•˜๊ฑฐ๋‚˜ ๋นŒ๋“œ ์„œ๋ฒ„๋ฅผ ๋งˆ๋น„์‹œํ‚ค๋Š” ๊ฐ€์šฉ์„ฑ ์นจํ•ด(DoS) ๊ณต๊ฒฉ์œผ๋กœ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ Shai-Hulud๋Š” ๊ณต๊ธ‰๋ง ๊ณต๊ฒฉ์ด ๋ฐ์ดํ„ฐ ํƒˆ์ทจ๋ฅผ ๋„˜์–ด ๋žœ์„ฌ์›จ์–ด์™€ ์œ ์‚ฌํ•œ ํŒŒ๊ดด์  ๊ณต๊ฒฉ์œผ๋กœ ์ง„ํ™”ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๋Š” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

๋” ์ด์ƒ ์˜คํ”ˆ ์†Œ์Šค ์ƒํƒœ๊ณ„์—์„œ ์•”๋ฌต์  ์‹ ๋ขฐ(Implicit Trust)๋ฅผ ์œ ์ง€ํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. qix ๊ณ„์ • ํƒˆ์ทจ ์‚ฌ๊ฑด์€ 2FA ์™€ ๊ฐ™์€ ๊ธฐ์ˆ ์ ์ธ ๋ณดํ˜ธ ์กฐ์น˜๊ฐ€ ์ธ๊ฐ„์˜ ์‹ฌ๋ฆฌ๋ฅผ ํŒŒ๊ณ ๋“œ๋Š” ์‚ฌํšŒ๊ณตํ•™์  ๊ณต๊ฒฉ(AiTM) ์•ž์—์„œ ๋ฌด๋ ฅํ™”๋  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ์—ˆ๊ณ , Shai-Hulud ์›œ์€ ๊ฐœ๋ฐœ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๊ตฌ์ถ•๋œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด ์น˜๋ช…์ ์ธ ๊ณต๊ฒฉ ๊ฒฝ๋กœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ์„ ๋“œ๋Ÿฌ๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์ด์ œ ํ‘œ๋ฉด์ ์ธ ์„œ๋ฒ„์˜ ๋ฐฉํ™”๋ฒฝ์„ ๋šซ์œผ๋ ค ๋…ธ๋ ฅํ•˜๊ธฐ๋ณด๋‹ค, ์ˆ˜์‹ญ์–ต ๊ฑด์˜ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ์‹ ๋ขฐ๋œ ํŒจํ‚ค์ง€ ๋’ค์— ์ˆจ์–ด ๊ฐœ๋ฐœ์ž์˜ ๋กœ์ปฌ ํ™˜๊ฒฝ, ์ด์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €, ๊ธฐ์—…์˜ ๋นŒ๋“œ ์„œ๋ฒ„๋ฅผ ๊ฒจ๋ƒฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

npm์€ ๊ทธ ์˜ํ–ฅ๋ ฅ์„ ์‰ฝ๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†๋Š” ํ˜„๋Œ€ ์›น ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ ์ธํ”„๋ผ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ณด๋‹ค ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ธ์‹ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๊ณต๊ธ‰๋ง ๊ณต๊ฒฉ์€ ๋ฐ˜๋ณต๋  ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. ํŽธ๋ฆฌํ•จ ๋’ค์— ์ˆจ๊ฒจ์ง„ ์—ฐ๊ฒฐ์„ฑ์˜ ์œ„ํ—˜์„ ๋Š์ž„์—†์ด ๊ฒ€์ฆํ•˜๋Š” ์ž์„ธ๋งŒ์ด ์˜คํ”ˆ ์†Œ์Šค ์ƒํƒœ๊ณ„์—์„œ ๊ณต๊ธ‰๋ง ๊ณต๊ฒฉ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์งˆ์ ์ธ ๋ฐฉ์–ด์ฑ…์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

References


3. Personal Credit Data Leakage at Lotte Card

2025๋…„ 9์›” 18์ผ, ๋กฏ๋ฐ์นด๋“œ๋Š” ํ•ดํ‚น์— ์˜ํ•œ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์œ ์ถœ ์‚ฌ๊ณ ๋ฅผ ๊ณต์‹ ๋ฐœํ‘œํ•˜๋ฉฐ ๋‹ค์ˆ˜์˜ ํ•ดํ‚น ์ด์Šˆ๋กœ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์‚ฌํšŒ ์ „๋ฐ˜์— ์ถฉ๊ฒฉ์„ ๋”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ์ถœ๋œ ๋ฐ์ดํ„ฐ์—๋Š” ๊ณ ๊ฐ์˜ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ์ธ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์—ฌ ์˜จ๋ผ์ธ ๊ฒฐ์ œ ์ •๋ณด, CI(์˜จ๋ผ์ธ์ƒ ๊ณ ์œ ์‹๋ณ„๋ฒˆํ˜ธ), ๋น„๋ฐ€๋ฒˆํ˜ธ, ์นด๋“œ ๋ฒˆํ˜ธ, CVC ๋“ฑ ์œ ์ถœ ์‹œ 2์ฐจ ํ”ผํ•ด๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ๋‹ค๋Ÿ‰ ํฌํ•จ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ๊ณ ์˜ ํƒ€์ž„๋ผ์ธ์„ ์‚ดํŽด๋ณด๋ฉด, ๋กฏ๋ฐ์นด๋“œ๋Š” 2025๋…„ 8์›” 26์ผ ์ผ๋ถ€ ์„œ๋ฒ„๊ฐ€ ์•…์„ฑ ์ฝ”๋“œ์— ๊ฐ์—ผ๋œ ์‚ฌ์‹ค์„ ํ™•์ธํ•˜๊ณ  ์ž์ฒด์ ์œผ๋กœ ์ „์‚ฌ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ •๋ฐ€ ์กฐ์‚ฌ๋ฅผ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์กฐ์‚ฌ ๊ฒฐ๊ณผ, 3๊ฐœ์˜ ์„œ๋ฒ„์—์„œ 2์ข…์˜ ์•…์„ฑ ์ฝ”๋“œ์™€ 5์ข…์˜ ์›น์…ธ์ด ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ 8์›” 31์ผ, ์˜จ๋ผ์ธ ๊ฒฐ์ œ ์„œ๋ฒ„์—์„œ ์™ธ๋ถ€ ๊ณต๊ฒฉ์ž์˜ ๋ฐ์ดํ„ฐ ์œ ์ถœ ์‹œ๋„๋ฅผ ํ™•์ธํ•˜์˜€๊ณ , ๋‹ค์Œ ๋‚ ์ธ 9์›” 1์ผ์— ์•ฝ 1.7GB ๊ทœ๋ชจ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ถœ๋˜์—ˆ๋‹ค๋Š” ๋‚ด์šฉ์œผ๋กœ ๊ธˆ์œต๋‹น๊ตญ์— ํ•ดํ‚น ํ”ผํ•ด ์‚ฌ์‹ค์„ ์‹ ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธˆ์œต๋‹น๊ตญ์€ ์ •ํ™•ํ•œ ํ•ดํ‚น ์›์ธ ๋ฐ ํ”ผํ•ด ๊ทœ๋ชจ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์กฐ์‚ฌ์— ์ฐฉ์ˆ˜ํ•˜์˜€๊ณ , ์ด ๊ณผ์ •์—์„œ ์‹ค์ œ ์œ ์ถœ๋œ ๋ฐ์ดํ„ฐ์˜ ๊ทœ๋ชจ๊ฐ€ ์•ฝ 200GB์— ๋‹ฌํ•˜๊ณ , ๊ณต๊ฒฉ์ž๊ฐ€ CVE-2017-10271 ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜์—ฌ ์„œ๋ฒ„์— ์นจํˆฌํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

CVE-2017-10271

๋กฏ๋ฐ์นด๋“œ ํ•ดํ‚น ์‚ฌ๊ณ ์— ์•…์šฉ๋œ CVE-2017-10271์€ Oracle WebLogic Server์—์„œ ์›๊ฒฉ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ํ•ด๋‹น ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜์—ฌ ํŠน์ˆ˜ํ•˜๊ฒŒ ์กฐ์ž‘๋œ XML ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ„๋„์˜ ์ธ์ฆ์ด๋‚˜ ๊ถŒํ•œ ์—†์ด ์„œ๋ฒ„๋ฅผ ์™„์ „ํžˆ ์žฅ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ทจ์•ฝ์ ์˜ ๊ทผ๋ณธ ์›์ธ์€ Java์˜ XMLDecoder ํด๋ž˜์Šค์— ์žˆ์Šต๋‹ˆ๋‹ค. XMLDecoder๋Š” ๋‹จ์ˆœํžˆ XML ๊ตฌ์กฐ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, XML ์Šคํฌ๋ฆฝํŠธ(XML ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋œ ๊ฐ์ฒด์™€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)๋ฅผ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด๋‹น ํด๋ž˜์Šค๋กœ ํŒŒ์‹ฑํ•  ๊ฒฝ์šฐ, ์—ญ์ง๋ ฌํ™” ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•˜์—ฌ ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 10.3.6.0.0, 12.1.3.0.0, 12.2.1.1.0, 12.2.1.2.0 ๋ฒ„์ „์˜ Oracle WebLogic Server๋Š” ํŠน์ • ์—”๋“œํฌ์ธํŠธ(์˜ˆ: /wls-wsat/CoordinatorPortType)์—์„œ ์ „๋‹ฌ๋ฐ›์€ XML ๋ฐ์ดํ„ฐ๋ฅผ XMLDecoder๋กœ ๊ทธ๋Œ€๋กœ ํŒŒ์‹ฑํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์–ด, ์กฐ์ž‘๋œ XML ์š”์ฒญ์„ ์ „์†กํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์žฅ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ (CVE-2017-10271 )์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

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

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

๊ฒฐ๋ก ์ ์œผ๋กœ ํ•ด๋‹น ์‚ฌํƒœ์˜ ์›์ธ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ณด์•ˆ ํŒจ์น˜ ๋ˆ„๋ฝ

  2. ์ธ์Šคํ„ด์Šค์˜ ์•„์›ƒ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ ํ†ต์ œ ๋ฏธํก

  3. ์นจ์ž… ํƒ์ง€ ๋ฐ ์ž์‚ฐ ์‹๋ณ„ ๋ฏธํก

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

References


4. RediShell

2025๋…„ 10์›” 6์ผ, ์ „ ์„ธ๊ณ„ ์ธํ”„๋ผ ํ™˜๊ฒฝ์—์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” Redis(Remote Dictionary Server)์˜ ์น˜๋ช…์ ์ธ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด Wiz์— ์˜ํ•ด ๊ณต๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. RediShell๋กœ ๋ช…๋ช…๋œ CVE-2025-49844๋Š” Redis์— ๋‚ด์žฅ๋œ Lua ์Šคํฌ๋ฆฝํŠธ ์—”์ง„์—์„œ ๋ฐœ์ƒํ•˜๋Š” Use-After-Free(UAF) ๊ธฐ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์†์ƒ ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์ทจ์•ฝ์ ์€ CVSS v3.1 ๊ธฐ์ค€ 10.0์ (Critical)์„ ๊ธฐ๋กํ•˜์˜€์œผ๋ฉฐ, ์•…์šฉ ์‹œ ์ธ์ฆ๋œ ๊ณต๊ฒฉ์ž๊ฐ€ Lua ์ƒŒ๋“œ๋ฐ•์Šค๋ฅผ ํƒˆ์ถœํ•˜์—ฌ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์—์„œ ์ž„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰(RCE)ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์กŒ์Šต๋‹ˆ๋‹ค.

CVE-2025-49844๋Š” Wiz Research ํŒ€์— ์˜ํ•ด ๋ฐœ๊ฒฌ๋˜์—ˆ์œผ๋ฉฐ, 2025๋…„ 5์›” 16์ผ Pwn2Own ๋ฒ ๋ฅผ๋ฆฐ์—์„œ ๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ทจ์•ฝ์ ์€ Redis๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Lua 5.1 ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ๊ตฌํ˜„ ๊ฒฐํ•จ์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์œผ๋กœ, Lua ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ํ•ด์ œ ์‹œ์ (์ƒ๋ช…์ฃผ๊ธฐ)์ด ์ž˜๋ชป ๊ด€๋ฆฌ๋˜์–ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ทจ์•ฝ์ ์˜ ํ•ต์‹ฌ์€ UAF์ž…๋‹ˆ๋‹ค. UAF๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ด๋ฏธ ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์—ฌ์ „ํžˆ ์œ ํšจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ(Dangling Pointer)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์œผ๋กœ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์†์ƒ ๋ฐ ์ œ์–ด ํ๋ฆ„ ํƒˆ์ทจ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RediShell์˜ ๊ฒฝ์šฐ, Lua ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ค‘ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(Garbage Collection, GC)์˜ ๋™์ž‘ ์‹œ์ ์„ ๊ณต๊ฒฉ์ž๊ฐ€ ์กฐ์ž‘ํ•˜์—ฌ ์‚ฌ์šฉ ์ค‘์ธ ๊ฐ์ฒด๋ฅผ ๊ฐ•์ œ๋กœ ํ•ด์ œํ•˜๋ฉด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ณต๊ฒฉ์€ ์ง„ํ–‰ ๋‹จ๊ณ„๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์Šคํฌ๋ฆฝํŠธ ์ฃผ์ž…: ์ธ์ฆ๋œ ๊ณต๊ฒฉ์ž๊ฐ€ EVAL ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์•…์„ฑ Lua ์Šคํฌ๋ฆฝํŠธ๋ฅผ Redis์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

  2. ํž™ ๊ทธ๋ฃจ๋ฐ(Heap Grooming): Lua ์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ˆ˜์˜ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ•ด์ œํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ณผ์ •์€ UAF ๋ฐœ์ƒ ์‹œ ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ณต๊ฒฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ฎ์–ด์“ฐ๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

  3. GC ์กฐ์ž‘ ๋ฐ UAF ์œ ๋ฐœ: ๊ณต๊ฒฉ์ž๋Š” luaY_parser์˜ ๋ฒ„๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด Lua์˜ ํŒŒ์„œ๊ฐ€ ํŠน์ • ๋ฌธ์ž์—ด์ด๋‚˜ ๊ฐ์ฒด(์˜ˆ: TString) ์ฒ˜๋ฆฌ ์ค‘, ๊ฐ•์ œ๋กœ GC๊ฐ€ ๋™์ž‘(collectgarbage())ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ Redis์˜ Lua ๊ตฌํ˜„์ฒด์— ์กด์žฌํ•˜๋Š” ๊ฒฐํ•จ์œผ๋กœ ์ธํ•ด, ํŒŒ์„œ๊ฐ€ ์—ฌ์ „ํžˆ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋กœ ์˜ค์ธ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

  4. ๋ฉ”๋ชจ๋ฆฌ ์˜ค์—ผ(Memory Corruption): ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„(TString ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„)์— ๊ณต๊ฒฉ์ž์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žฌํ• ๋‹น๋˜๋ฉด, ํŒŒ์„œ๋Š” ํ•ด์ œ๋œ ์ด์ „ ๊ฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ณต๊ฒฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ, ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์†์ƒ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜ค์—ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  5. ์ƒŒ๋“œ๋ฐ•์Šค ํƒˆ์ถœ(Sandbox Escape): ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์†์ƒ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ณต๊ฒฉ์ž๋Š” Lua ์ƒŒ๋“œ๋ฐ•์Šค ์ œ์•ฝ์„ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ฐจ๋‹จ๋œ ํ•จ์ˆ˜(์˜ˆ: os.execute, io.popen)์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜์—ฌ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ƒŒ๋“œ๋ฐ•์Šค๋ฅผ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. ํ˜ธ์ŠคํŠธ ์žฅ์•…: ์ƒŒ๋“œ๋ฐ•์Šค๋ฅผ ํƒˆ์ถœํ•œ ๊ณต๊ฒฉ์ž๋Š” Redis ํ”„๋กœ์„ธ์Šค ๊ถŒํ•œ์œผ๋กœ ํ˜ธ์ŠคํŠธ ์šด์˜์ฒด์ œ์—์„œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ทจ์•ฝ์ ์€ d5728cb5795c966c5b5b1e0f0ac576a7e69af539 ์ปค๋ฐ‹์„ ํ†ตํ•ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํŒจ์น˜๋Š” Lua ํŒŒ์„œ(lparser.c) ๋‚ด luaY_parser ํ•จ์ˆ˜์—์„œ ๋ฌธ์ž์—ด ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ GC๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์‹ , ๋ช…์‹œ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

/* lparser.c ๋‚ด๋ถ€ ํŒจ์น˜ ์ „ */
luaX_setinput(L, &lexstate, z, luaS_new(L, name));

/* lparser.c ๋‚ด๋ถ€ ํŒจ์น˜ ํ›„ */
TString *tname = luaS_new(L, name);
setsvalue2s(L, L->top, tname);
incr_top(L);
luaX_setinput(L, &lexstate, z, tname);

๊ธฐ์กด ์ฝ”๋“œ์—์„œ๋Š” luaS_new(L, name) ํ˜ธ์ถœ๋กœ ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด ๊ฐ์ฒด๊ฐ€ ์Šคํƒ์— ๊ณ ์ •(anchor)๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ luaX_setinput ํ•จ์ˆ˜์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ luaX_setinput ๋‚ด๋ถ€ ๋˜๋Š” ํ•˜์œ„ ํ˜ธ์ถœ์—์„œ GC๊ฐ€ ๋™์ž‘ํ•œ๋‹ค๋ฉด, luaS_new๋กœ ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด์€ ๋„๋‹ฌ ๋ถˆ๊ฐ€๋Šฅ(Unreachable)ํ•œ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผ๋˜์–ด ํ•ด์ œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ •๋œ ์ฝ”๋“œ์—์„œ๋Š” luaS_new ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด์„ luaX_setinput ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ „์— ๋ช…์‹œ์ ์œผ๋กœ Lua ์Šคํƒ(L->top)์— ํ‘ธ์‹œ(push)ํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด GC๊ฐ€ ๋™์ž‘ํ•˜๋”๋ผ๋„ ํ•ด๋‹น ๊ฐ์ฒด๋Š” ์Šคํƒ์— ์˜ํ•ด ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ์ƒํƒœ๋กœ ์œ ์ง€๋˜์–ด ํ•ด์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

shodan์„ ํ†ตํ•ด ํ™•์ธํ•œ Redis ๊ณต๊ฐœ ์„œ๋ฒ„ ์ˆ˜

RediShell ์ทจ์•ฝ์ ์˜ ํŒŒ๊ธ‰๋ ฅ์€ Redis์˜ ์‚ฌ์šฉ๋Ÿ‰์— ๋น„๋ก€ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋„ ์•ฝ 60,000์—ฌ ๊ฐœ์˜ Redis ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณ„๋„ ์ธ์ฆ ์—†์ด ์ธํ„ฐ๋„ท์— ๋…ธ์ถœ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ณต๊ฒฉ์ž๋Š” ์ถ”๊ฐ€์ ์ธ ์ž๊ฒฉ ์ฆ๋ช… ํƒˆ์ทจ ๊ณผ์ • ์—†์ด ์ธ์Šคํ„ด์Šค์— ์ ‘์†ํ•˜์—ฌ EVAL ๋ช…๋ น๋งŒ์œผ๋กœ ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ทจ์•ฝ์ ์˜ ๊ทผ๋ณธ ์›์ธ์ด ๋˜๋Š” ์ฝ”๋“œ๋Š” Redis ์†Œ์Šค ์ฝ”๋“œ ๋‚ด์— ์•ฝ 13๋…„๊ฐ„ ์กด์žฌํ•ด ์™”์œผ๋ฉฐ, ์ด๋Š” ์ง€๋‚œ 10๋…„๊ฐ„ ๋ฐฐํฌ๋œ ๊ฑฐ์˜ ๋ชจ๋“  Redis ์ธ์Šคํ„ด์Šค๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ๋™์ผํ•œ ์œ„ํ˜‘์— ๋…ธ์ถœ๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” CVE๊ฐ€ ๋ฐœ๊ธ‰๋œ 2025๋…„ 10์›” 3์ผ ๊ณต๊ฐœ๋œ ๋ณด์•ˆ ํŒจ์น˜์ž…๋‹ˆ๋‹ค.

์ œํ’ˆ๊ตฐ

์ทจ์•ฝํ•œ ๋ฒ„์ „ ๋ฒ”์œ„

ํŒจ์น˜๋œ ๋ฒ„์ „ (Fixed Version)

Redis OSS / Community

6.2.20 ๋ฏธ๋งŒ

6.2.20

 

7.0.0 ~ 7.2.10

7.2.11

 

7.4.0 ~ 7.4.5

7.4.6

 

8.0.0 ~ 8.0.3

8.0.4

 

8.2.0 ~ 8.2.1

8.2.2

Redis Software (Enterprise)

6.4.2-131 ๋ฏธ๋งŒ

6.4.2-131

 

7.2.4-138 ๋ฏธ๋งŒ

7.2.4-138

 

7.4.6-272 ๋ฏธ๋งŒ

7.4.6-272

Redis Stack

7.2.0-v19 ๋ฏธ๋งŒ

7.2.0-v19

 

7.4.0-v7 ๋ฏธ๋งŒ

7.4.0-v7

Valkey (Fork Project)

7.2.11 ๋ฏธ๋งŒ

7.2.11

 

8.0.0 ~ 8.0.5

8.0.6

RediShell(CVE-2025-49844)์€ ์˜คํ”ˆ ์†Œ์Šค ์ƒํƒœ๊ณ„์™€ ์ธํ”„๋ผ ๋ณด์•ˆ์— ์ค‘์š”ํ•œ ์‹œ์‚ฌ์ ์„ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋จผ์ €, Lua ์ƒŒ๋“œ๋ฐ•์Šค์™€ ๊ฐ™์€ ๊ฒฉ๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์กด์žฌํ•˜๋”๋ผ๋„, ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์ž์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ฒฐํ•จ์ด ์žˆ๋‹ค๋ฉด ์ƒŒ๋“œ๋ฐ•์Šค๊ฐ€ ๋ฌด๋ ฅํ™”๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ํ•œ๊ณ„๋ฅผ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ•ด๋‹น ์ทจ์•ฝ์  ์ฝ”๋“œ๊ฐ€ 13๋…„ ๋™์•ˆ์ด๋‚˜ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๊ณ  ์กด์žฌํ–ˆ๋‹ค๋Š” ์ ์€, ์˜ค๋ž˜๋œ ์ฝ”๋“œ๊ฐ€ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ผ๋Š” ์ผ๋ฐ˜์ ์ธ ํ†ต๋…์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์‚ฌ๋ก€๋Š” ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์„ฑ์ˆ™ํ•œ ํ”„๋กœ์ ํŠธ์ผ์ง€๋ผ๋„, ์ฝ”๋“œ ๊ฒ€์ˆ˜(Audit)์™€ ํผ์ง•(Fuzzing) ํ…Œ์ŠคํŠธ๊ฐ€ ์ง€์†์ ์œผ๋กœ ์ด๋ฃจ์–ด์งˆ ํ•„์š”๊ฐ€ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

References


5. Internal Data Breach at SK Shieldus

2025๋…„ 10์›” 17์ผ, ํ•ด์ปค ์กฐ์ง Black Shrantac์ด ๋‹คํฌ์›น์„ ํ†ตํ•ด ๊ตญ๋‚ด ๋Œ€ํ‘œ ํ†ตํ•ฉ ๋ณด์•ˆ ๊ธฐ์—…์ธ SK์‰ด๋”์Šค์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ํƒˆ์ทจํ–ˆ๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. Black Shrantac์€ ๋‹คํฌ์›น ๊ฒŒ์‹œ๊ธ€์„ ํ†ตํ•ด ์•ฝ 24GB ๊ทœ๋ชจ์˜ ๋‚ด๋ถ€ ๋ฌธ์„œ์™€ ๊ธฐ์ˆ  ์ž๋ฃŒ๋ฅผ ํ™•๋ณดํ•˜์˜€๋‹ค๊ณ  ๋ฐํžˆ๋ฉฐ, ํƒˆ์ทจํ•œ ํŒŒ์ผ์˜ ์ผ๋ถ€๋ฅผ ๊ณต๊ฐœํ•˜์—ฌ ์ถ”๊ฐ€ ๊ณต๊ฐœ ๊ฐ€๋Šฅ์„ฑ์„ ์–ธ๊ธ‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฒŒ์‹œ๊ธ€์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๋‹จ์ˆœํžˆ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์— ๊ทธ์น˜์ง€ ์•Š๊ณ , ์ •๋ณด ์œ ์ถœ ์œ„ํ—˜์„ ๋ฌด๊ธฐ๋กœ ๊ธฐ์—…์„ ์••๋ฐ•ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ํ˜‘๋ฐ•(extortion) ๋ฐฉ์‹์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹คํฌ์›น ๊ฒŒ์‹œ๊ธ€

๊ณต๊ฐœ๋œ ์ž๋ฃŒ์—๋Š” ๊ณ ๊ฐ์‚ฌ ๊ด€๋ จ ์ œ์•ˆ์„œ, ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ ๋ฌธ์„œ, ์‹œ์Šคํ…œ ์„ค๊ณ„ ์ž๋ฃŒ, ๋‚ด๋ถ€ ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ ๋“ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์—ˆ๊ณ , ์ผ๋ถ€ ๋ฌธ์„œ์—๋Š” ์‹ค์ œ ์ž„์ง์›์˜ ์ด๋ฆ„๊ณผ ์‹œ์Šคํ…œ ๊ตฌ์กฐ๊ฐ€ ํ‰๋ฌธ์œผ๋กœ ๋…ธ์ถœ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

SK์‰ด๋”์Šค ๊ณต์ง€์‚ฌํ•ญ

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

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

๊ณผํ•™๊ธฐ์ˆ ์ •๋ณดํ†ต์‹ ๋ถ€ ์กฐ์‚ฌ ๊ฒฐ๊ณผ, ์‹ค์ œ๋กœ ์œ ์ถœ๋œ ๋ฐ์ดํ„ฐ๋Š” ํ•ด์ปค๊ฐ€ ์ฃผ์žฅํ•œ 24GB๋ณด๋‹ค ์ ์€ 15.1GB๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ์ถœ๋œ ๋ฐ์ดํ„ฐ์—๋Š” ๋‹จ์ˆœ ๋กœ๊ทธ๋‚˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ, ๋„คํŠธ์›Œํฌ ๊ตฌ์กฐ, ๋ฐฉํ™”๋ฒฝ ์ •์ฑ…, ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ, ๋‚ด๋ถ€ API ์„ค๋ช… ์ž๋ฃŒ ๋“ฑ์ด ํฌํ•จ๋˜์—ˆ๊ณ , ์ด๋Š” ๋‹จ๋…์œผ๋กœ ๊ฐ€์น˜๋ฅผ ์ง€๋‹ ๋ฟ ์•„๋‹ˆ๋ผ, ํ–ฅํ›„ ์ถ”๊ฐ€ ๊ณต๊ฒฉ์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ๊ธฐ๋ฐ˜ ์ž๋ฃŒ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

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

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

Ransomware VS Extortion

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

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

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

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

References


6. Cloudflare Outage

2025๋…„ 11์›”๊ณผ 12์›”, ์ „ ์„ธ๊ณ„ ์ธํ„ฐ๋„ท์— ๊ด‘๋ฒ”์œ„ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นœ ๋‘ ์ฐจ๋ก€์˜ ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์žฅ์• ๋Š” ํ•œ๊ตญ ์‹œ๊ฐ„์œผ๋กœ 11์›” 18์ผ 20์‹œ 20๋ถ„๋ถ€ํ„ฐ 11์›” 19์ผ 02์‹œ 06๋ถ„๊นŒ์ง€, ๋‘ ๋ฒˆ์งธ ์žฅ์• ๋Š” 12์›” 5์ผ 17์‹œ 47๋ถ„๋ถ€ํ„ฐ 18์‹œ 12๋ถ„๊นŒ์ง€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

chatGPT ์„œ๋น„์Šค ์žฅ์•  ๋ฐœ์ƒ(์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://www.bbc.com/news/articles/c629pny4gl7o)

๋‘ ์‚ฌ๊ฑด์˜ ์›์ธ์€ ๋ชจ๋‘ ์ „ ์„ธ๊ณ„ CDN(์ฝ˜ํ…์ธ  ์ „์†ก ๋„คํŠธ์›Œํฌ) ๋ฐ ๋ณด์•ˆ ์ธํ”„๋ผ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” Cloudflare์˜ ์‹œ์Šคํ…œ ๋ฌธ์ œ๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Cloudflare์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

Cloudflare ๋„คํŠธ์›Œํฌ(์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://blog.cloudflare.com/18-november-2025-outage/)

Cloudflare๋Š” ์ „ ์„ธ๊ณ„ ์ˆ˜๋งŽ์€ ์›น์‚ฌ์ดํŠธ์˜ ํŠธ๋ž˜ํ”ฝ์ด ํ†ต๊ณผํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ๊ด€๋ฌธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ ์ ‘์†์„ ์‹œ๋„ํ•˜๋ฉด, ํ•ด๋‹น ์š”์ฒญ์€ ๋จผ์ € Cloudflare์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ Cloudflare๋Š” HTTP/TLS ๊ณ„์ธต์—์„œ ์—ฐ๊ฒฐ์„ ์ˆ˜์‹ ํ•˜๊ณ , ํ•ต์‹ฌ ํ”„๋ก์‹œ ์‹œ์Šคํ…œ์ธ 'Frontline(FL)'์„ ํ†ตํ•ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด ํ”„๋ก์‹œ ์‹œ์Šคํ…œ ๋‚ด๋ถ€์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ๊ธฐ๋Šฅ์ด ๋ชจ๋“ˆ ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • WAF(์›น ๋ฐฉํ™”๋ฒฝ): ์•…์„ฑ ๊ณต๊ฒฉ ์ฐจ๋‹จ

  • DDoS ๋ฐฉ์–ด ์‹œ์Šคํ…œ: ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ๊ณต๊ฒฉ ๋ฐฉ์–ด

  • Bot Management: ๋จธ์‹ ๋Ÿฌ๋‹ ๊ธฐ๋ฐ˜ ๋ด‡ ํŠธ๋ž˜ํ”ฝ ์‹๋ณ„ ๋ฐ ๊ด€๋ฆฌ

์ด๋“ค ๋ชจ๋“ˆ์€ ๊ฐ ์›น์‚ฌ์ดํŠธ์— ์„ค์ •๋œ ๊ทœ์น™์— ๋”ฐ๋ผ ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•œ ํ›„, ์ตœ์ข…์ ์œผ๋กœ ์›๋ณธ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์บ์‹œ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ด์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

11์›” 18์ผ ์ฒซ ๋ฒˆ์งธ ์žฅ์• 

11์›” 18์ผ์— ๋ฐœ์ƒํ•œ ์ฒซ ๋ฒˆ์งธ ์žฅ์• ๋Š” Bot Management ์‹œ์Šคํ…œ์˜ ์„ค์ • ํŒŒ์ผ ๋ฌธ์ œ์—์„œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ Cloudflare ์—”์ง€๋‹ˆ์–ด๋“ค์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์˜ ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ๊ถŒํ•œ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์˜€๊ณ , ์ด ๊ณผ์ •์—์„œ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Bot Management๋Š” ๋จธ์‹ ๋Ÿฌ๋‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ด‡์„ ํƒ์ง€ํ•˜๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด 'ํ”ผ์ฒ˜ ํŒŒ์ผ(Feature file)'์ด๋ผ๋Š” ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ์€ 5๋ถ„๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์–ด ์ „์ฒด ๋„คํŠธ์›Œํฌ์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ถŒํ•œ ๋ณ€๊ฒฝ ์ž‘์—…์˜ ์˜ํ–ฅ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๊ฐ€ ์ค‘๋ณต๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ ๋™์ผํ•œ ์„ค์ • ํ•ญ๋ชฉ์ด ํŒŒ์ผ ๋‚ด์— ์ค‘๋ณต ์ƒ์„ฑ๋˜์–ด ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ 2๋ฐฐ ์ด์ƒ ์ปค์กŒ์Šต๋‹ˆ๋‹ค.

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

Cloudflare ํŒ€์€ ๋ฌธ์ œ ์›์ธ์„ ํŒŒ์•…ํ•œ ํ›„ ํ•œ๊ตญ ์‹œ๊ฐ„ ๊ธฐ์ค€ 11์›” 18์ผ 23์‹œ 30๋ถ„๊ฒฝ๋ถ€ํ„ฐ ๋ณต๊ตฌ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์กฐ์น˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ํ”ผ์ฒ˜ ํŒŒ์ผ์˜ ์ž๋™ ์ƒ์„ฑ ๋ฐ ๋ฐฐํฌ ์ค‘๋‹จ

  2. ์ด์ „์— ์ •์ƒ ๋™์ž‘ํ•˜๋˜ ๊ตฌ๋ฒ„์ „ ํŒŒ์ผ์„ ๋„คํŠธ์›Œํฌ ์ „์ฒด์— ์ˆ˜๋™ ์žฌ๋ฐฐํฌ

  3. ์˜ํ–ฅ์„ ๋ฐ›์€ ํ”„๋ก์‹œ ์‹œ์Šคํ…œ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์žฌ์‹œ์ž‘ํ•˜์—ฌ ์ •์ƒ ํŒŒ์ผ ๋กœ๋“œ

์œ„ ์กฐ์น˜ ๊ฒฐ๊ณผ, ํ•œ๊ตญ ์‹œ๊ฐ„์œผ๋กœ 11์›” 19์ผ ์ƒˆ๋ฒฝ 2์‹œ 6๋ถ„๊ฒฝ ๋ชจ๋“  ์‹œ์Šคํ…œ์ด ์ •์ƒํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

12์›” 5์ผ ๋‘ ๋ฒˆ์งธ ์žฅ์• 

12์›” 5์ผ์— ๋ฐœ์ƒํ•œ ๋‘ ๋ฒˆ์งธ ์žฅ์• ๋Š” React ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ณด์•ˆ ์ทจ์•ฝ์ (CVE-2025-55182) ๊ธด๊ธ‰ ๋Œ€์‘ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. Cloudflare๋Š” React Server Components์—์„œ ๋ฐœ๊ฒฌ๋œ ์ทจ์•ฝ์ ์„ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•ด, WAF๊ฐ€ ๊ฒ€์‚ฌํ•˜๋Š” ์š”์ฒญ ๋ณธ๋ฌธ(body)์˜ ์ตœ๋Œ€ ํฌ๊ธฐ ์ œํ•œ์„ ๊ธฐ์กด 128KB์—์„œ Next.js์˜ ๊ธฐ๋ณธ๊ฐ’์ธ 1MB๋กœ ์ƒํ–ฅํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์—์„œ, ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” WAF ํ…Œ์ŠคํŠธ ๋„๊ตฌ๊ฐ€ ๋Š˜์–ด๋‚œ ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋Š” ๊ณ ๊ฐ ํŠธ๋ž˜ํ”ฝ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๋‚ด๋ถ€ ๋„๊ตฌ์˜€๊ธฐ์— ์—”์ง€๋‹ˆ์–ด๋“ค์€ ์ฆ‰์‹œ ํ•ด๋‹น ๋„๊ตฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด '๋น„ํ™œ์„ฑํ™”' ์กฐ์น˜๊ฐ€ ์ˆ˜๋…„๊ฐ„ ์ฝ”๋“œ ๋‚ด๋ถ€์— ์ž ์žฌ๋˜์–ด ์žˆ๋˜ ๋ฒ„๊ทธ๋ฅผ ์ด‰๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

if rule_result.action == "execute" then
  rule_result.execute.results = ruleset_results[tonumber(rule_result.execute.results_index)]
end

์œ„ ์ฝ”๋“œ๋Š” ๊ทœ์น™ ์ง‘ํ•ฉ(Ruleset)์˜ ํ‰๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๊ทœ์น™์˜ ๋™์ž‘์ด '์‹คํ–‰(execute)'์ธ ๊ฒฝ์šฐ, ๊ด€๋ จ ๊ฒฐ๊ณผ ๊ฐ์ฒด(rule_result.execute)๊ฐ€ ํ•ญ์ƒ ์กด์žฌํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฐ€์ • ํ•˜์— ์ž‘์„ฑ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ WAF ํ…Œ์ŠคํŠธ ๋„๊ตฌ ๊ทœ์น™์ด ๋น„ํ™œ์„ฑํ™”๋˜๋ฉฐ ๋ถ„๊ธฐ๋กœ ์ธํ•ด ํ•ด๋‹น ๊ทœ์น™์ด ์‹คํ–‰๋˜์ง€ ์•Š์•„, rule_result.execute ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ์ƒํƒœ์—์„œ ์ฝ”๋“œ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด(nil) ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜์˜€๊ณ , ์ด๋กœ ์ธํ•ด nil ๊ฐ’ ์ฐธ์กฐ ์˜ค๋ฅ˜(Attempt to index a nil value)๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์˜ํ–ฅ์„ ๋ฐ›์€ ์„œ๋ฒ„๋“ค์€ ์ฆ‰์‹œ HTTP 500 ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์˜€์œผ๋ฉฐ, ๋‹คํ–‰ํžˆ Cloudflare ์ธก์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹ ์†ํ•˜๊ฒŒ ๋กค๋ฐฑ(์›์ƒ๋ณต๊ตฌ)ํ•˜์—ฌ, ์žฅ์•  ๋ฐœ์ƒ ์•ฝ 25๋ถ„ ๋งŒ์—(ํ•œ๊ตญ ์‹œ๊ฐ„ 18์‹œ 12๋ถ„) ์„œ๋น„์Šค๋Š” ์ •์ƒํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๋‘ ์ฐจ๋ก€์˜ ์žฅ์• ๋Š” ํ˜„๋Œ€ ์›น ์ƒํƒœ๊ณ„๊ฐ€ Cloudflare๋ผ๋Š” ํ•˜๋‚˜์˜ ํ”Œ๋žซํผ์— ์–ผ๋งˆ๋‚˜ ๊นŠ์ด ์˜์กดํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ™•์ธ์‹œ์ผœ ์ฃผ๋Š” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๋ฆฌ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ์•ˆ์ •์ ์ธ ์„œ๋น„์Šค๋ผ๋„, '๋‹จ์ผ ์‹คํŒจ ์ง€์ (SPOF)'์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค์˜ ์•ˆ์ „์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ๋งŒ์•ฝ์˜ ์ƒํ™ฉ์— ๋Œ€๋น„ํ•œ ์ธํ”„๋ผ ๋‹ค์ค‘ํ™” ๋ฐ ์˜์กด์„ฑ ๋ถ„์‚ฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

References


7. Personal Information Breach at Coupang

2025๋…„ 11์›” 19์ผ, ๊ตญ๋‚ด ๋Œ€ํ‘œ ์ด์ปค๋จธ์Šค ํ”Œ๋žซํผ์ธ ์ฟ ํŒก์€ ๊ฐœ์ธ์ •๋ณด ์œ ์ถœ ์˜์‹ฌ ์ •ํ™ฉ์„ ํ™•์ธํ•˜๊ณ  ์ด๋ฅผ ๊ฒฝ์ฐฐ์— ์‹ ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์‚ฌ๊ฑด ์ดˆ๊ธฐ ์ฟ ํŒก์€ ๋น„์ •์ƒ์ ์ธ ์ ‘๊ทผ ์‹œ๋„๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ฆ‰๊ฐ์ ์ธ ๊ฒฝ๋กœ ์ฐจ๋‹จ ๋ฐ ๋‚ด๋ถ€ ๋ณด์•ˆ ์ ๊ฒ€์— ์ฐฉ์ˆ˜ํ•˜์˜€์œผ๋ฉฐ, ์ •ํ™•ํ•œ ํ”ผํ•ด ๊ทœ๋ชจ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฒด ์กฐ์‚ฌ์™€ ํ•จ๊ป˜ ์ˆ˜์‚ฌ ๊ธฐ๊ด€์— ์˜๋ขฐ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ฐ€ ๋ถ„์„ ํ›„ 11์›” 29์ผ, ์ฟ ํŒก์€ ๊ฐœ์ธ์ •๋ณด ์œ ์ถœ์˜ ํ”ผํ•ด ๋ฒ”์œ„๊ฐ€ ์•ฝ 3,370๋งŒ ๋ช…์— ์ด๋ฅด๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ๋‹ค๊ณ  ๊ณต์‹ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ตญ๋‚ด ์ตœ๋Œ€ ๊ทœ๋ชจ์˜ ๊ฐœ์ธ์ •๋ณด ์œ ์ถœ ์‚ฌ๊ฑด์ž…๋‹ˆ๋‹ค.

์ฟ ํŒก ๊ฐœ์ธ์ •๋ณด ๋…ธ์ถœ ํ†ต์ง€ ๋ฌธ์ž ๋ฉ”์‹œ์ง€

ํ˜„์žฌ๊นŒ์ง€ ์•Œ๋ ค์ง„ ์ •๋ณด์— ๋”ฐ๋ฅด๋ฉด, ์ด๋ฒˆ ์‚ฌ๊ณ ๋Š” ์™ธ๋ถ€ ์นจ์ž…๋ณด๋‹ค๋Š” ๋‚ด๋ถ€ ์‹œ์Šคํ…œ์˜ ์„ค๊ณ„์  ํŠน์„ฑ๊ณผ ๊ถŒํ•œ ๊ด€๋ฆฌ์˜ ์ด์Šˆ๊ฐ€ ๋ณตํ•ฉ์ ์œผ๋กœ ์ž‘์šฉํ•œ ๊ฒฐ๊ณผ๋กœ ์ถ”์ •๋ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์€ 2025๋…„ 6์›” 24์ผ๋ถ€ํ„ฐ 11์›” ๋ง๊นŒ์ง€ ์•ฝ 5๊ฐœ์›”๊ฐ„ ์ง€์†๋˜์—ˆ์œผ๋ฉฐ, ๊ณต๊ฒฉ์ž๋Š” ํ•ด์™ธ ์„œ๋ฒ„๋ฅผ ๊ฒฝ์œ ํ•˜์—ฌ ์žฅ๊ธฐ๊ฐ„์— ๊ฑธ์ณ ์€๋ฐ€ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ ๊ฒƒ์œผ๋กœ ํŒŒ์•…๋ฉ๋‹ˆ๋‹ค. ์ค‘๊ตญ ๊ตญ์ ์œผ๋กœ ์ถ”์ •๋˜๋Š” ์ „์ง ์ง์›์ด ํ‡ด์‚ฌ ์ดํ›„์—๋„ ํšŒ์ˆ˜๋˜์ง€ ์•Š์€ API ์ ‘๊ทผ ํ‚ค(Access Key)์™€ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์™ธ๋ถ€์—์„œ ๋ฌด๋‹จ ์ ‘์†ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด๋ฒˆ ์‚ฌ๊ณ ๋Š” ๋‹จ์ˆœํ•œ ๊ด€๋ฆฌ ๋ถ€์‹ค์„ ๋„˜์–ด, ์‹œ์Šคํ…œ ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ์˜ ๋ณด์•ˆ ๊ณ ๋ ค(Security by Design) ๋ถ€์žฌ๊ฐ€ ๊ธฐ์—…๊ณผ ์ด์šฉ์ž ์ „์ฒด์— ์–ด๋–ค ์˜ํ–ฅ์„ ๊ฐ€์ ธ์˜ค๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ์‚ฌ๋ก€๋กœ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ฟ ํŒก๊ณผ ๊ฐ™์ด ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ์™€ ๋ณต์žกํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋ฅผ ์šด์˜ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š”, ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋‚ด๋ถ€ ๋กœ์ง์ด ์˜๋„์น˜ ์•Š๊ฒŒ ์™ธ๋ถ€ ์œ„ํ—˜์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ณง ์„œ๋น„์Šค์˜ ์ž ์žฌ์  ์ทจ์•ฝ์ ์œผ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

References


8. React2Shell

2025๋…„ 12์›” 3์ผ, React2Shell๋กœ ์•Œ๋ ค์ง„ CVE-2025-55182 ์ทจ์•ฝ์ ์ด ๊ณต๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ทจ์•ฝ์ ์€ React Server Components(RSC) Flight Protocol์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์—ญ์ง๋ ฌํ™”๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋ฉฐ, ํ”„๋กœํ† ํƒ€์ž… ์˜ค์—ผ(Prototype Pollution) ๊ณต๊ฒฉ์— ์˜ํ•ด ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(RCE)๊นŒ์ง€ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๊ณต๊ฒฉ์ž๊ฐ€ ์กฐ์ž‘๋œ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๋ณ„๋„์˜ ์„ค์ • ์—†์ด ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด ์œ„ํ—˜๋„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค. React์— ์˜์กดํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ธ Next.js ์—ญ์‹œ ๋™์ผํ•œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด ๊ฐ™์€ ์ทจ์•ฝ์ ์˜ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

Theori์—์„œ ๋งŒ๋“  ReactGuard๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์šด์˜ ์ค‘์ธ ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์ทจ์•ฝ์ ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

React Server Components

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

์ด๋Ÿฌํ•œ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด RSC ๊ฐœ๋…์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. RSC๋Š” ์„œ๋ฒ„์—์„œ๋งŒ ์‹คํ–‰ํ•˜๋Š” React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , Flight Protocol์„ ํ†ตํ•ด ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋…ธ์ถœ ์—†์ด ์„œ๋ฒ„์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋งŒ์„ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. RSC ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„ ๋กœ์ง์„ ํ˜ธ์ถœํ•˜๋Š” ์ฃผ์š” ์ˆ˜๋‹จ์€ Server Action์ด๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP ์š”์ฒญ์„ ์ „์†กํ•˜์—ฌ Server Action์„ ํ˜ธ์ถœํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์š”์ฒญ ๋ณธ๋ฌธ์„ Flight Protocol ๊ทœ์น™์— ๋”ฐ๋ผ ๋‹ค์‹œ ํŒŒ์‹ฑํ•œ ํ›„ ์„œ๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” Server Action์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ด์šฉ์ž๊ฐ€ Next.js๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

// app/pages.tsx
"use client";
import { pingpong } from "./actions";
export default function Page() {
  return (
    <form action={pingpong}>
      <input type="text" name="ping" placeholder="๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”" />
      <button type="submit">์ „์†ก</button>
    </form>
  );
}
// app/actions.ts
"use server";
export async function pingpong(formData: FormData) {
  console.log("Server received:", formData);
  const ping = formData.get("ping");
  return {
    success: true,
    ping,
  };
}

์ด์— ๋Œ€ํ•œ ์š”์ฒญ ๋ฐ ์‘๋‹ต์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[Request]
POST / HTTP/1.1
Host: localhost
Content-Length: 377
next-action: 4067cee7ffcfc30860beeb78f35dd3cec02d4084ac
x-nextjs-request-id: 92c675a9
next-router-state-tree: %5B%22%22%2C%7B%22children%22%3A%5B%22__PAGE__%22%2C%7B%7D%2Cnull%2Cnull%5D%7D%2Cnull%2Cnull%2Ctrue%5D
Accept: text/x-component
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarydKf562tVKmAb3SAf
x-nextjs-html-request-id: Fdgu0NxeBjN_wsjojB9Nk
Accept-Encoding: gzip, deflate, br
------WebKitFormBoundarydKf562tVKmAb3SAf
Content-Disposition: form-data; name="1_$ACTION_ID_4067cee7ffcfc30860beeb78f35dd3cec02d4084ac"
------WebKitFormBoundarydKf562tVKmAb3SAf
Content-Disposition: form-data; name="1_ping"
123
------WebKitFormBoundarydKf562tVKmAb3SAf
Content-Disposition: form-data; name="0"
["$K1"]
------WebKitFormBoundarydKf562tVKmAb3SAf--
[Response]
:N1766324207396.7583
0:{"a":"$@1","f":"","b":"development"}
1:D{"time":0.37404199999946286}
1:{"success":true,"ping":"123"}

์„œ๋ฒ„๋Š” ์ด์šฉ์ž๊ฐ€ ์ „๋‹ฌํ•œ ์š”์ฒญ์„ ํŒŒ์‹ฑํ•˜์—ฌ Server Action์„ ์‹คํ–‰ํ•˜๊ณ , ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ Flight Protocol ํ˜•์‹์œผ๋กœ ์ง๋ ฌํ™”ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” Flight Protocol ํŒŒ์‹ฑ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” parseModelString() ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

// <https://github.com/facebook/react/blob/88ee1f595572b1dcf8f45897cb115b4bbd1aefb8/packages/react-server/src/ReactFlightReplyServer.js#L1311-L1335>
function parseModelString(
  response: Response,
  obj: Object,
  key: string,
  value: string,
  reference: void | string,
): any {
  if (value[0] === '$') {
    switch (value[1]) {
      case '$': {
        // This was an escaped string value.
        return value.slice(1);
      }
      case '@': {
        // Promise
        const id = parseInt(value.slice(2), 16);
        const chunk = getChunk(response, id);
        return chunk;
      }
      case 'h': {
        // Server Reference
        const ref = value.slice(2);
        return getOutlinedModel(response, ref, obj, key, loadServerReference);
      }
      case 'T': {
      ...

์•„๋ž˜ ์˜ˆ์‹œ๋Š” multipart/form-data ์š”์ฒญ์œผ๋กœ ๋‘ ๊ฐœ์˜ chunk๋ฅผ ์ „๋‹ฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ chunk์˜ bar ํ•„๋“œ๋Š” $1:bar ํ˜•ํƒœ์˜ ์ฐธ์กฐ๋ฅผ ํฌํ•จํ•˜๊ณ , ์ด๋Š” Flight Protocol์— ๋”ฐ๋ผ ๋‘ ๋ฒˆ์งธ chunk์˜ bar ํ•„๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

------WebKitFormBoundaryv77gZrFCS37c0Dkg
Content-Disposition: form-data; name="0"
{"foo":"1","bar":"$1:bar"}
------WebKitFormBoundaryv77gZrFCS37c0Dkg
Content-Disposition: form-data; name="1"
{"test":1,"bar":"zz"}
------WebKitFormBoundaryv77gZrFCS37c0Dkg--

์„œ๋ฒ„์—์„œ Flight ์‘๋‹ต์„ ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด ์ฐธ์กฐ๋Š” ์‹ค์ œ ๊ฐ’์œผ๋กœ ํ•ด์„๋˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{ foo: "1", bar: "zz" }

ํ•˜์ง€๋งŒ ์ด ์ฐธ์กฐ ํ•ด์„ ๊ณผ์ •์—์„œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ์ด ์ถฉ๋ถ„ํžˆ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๊ณต๊ฒฉ์ž๊ฐ€ Object prototype์— ์ ‘๊ทผํ•˜์—ฌ prototype pollution์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์ด ์š”์ฒญ์„ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ, Flight Protocol์˜ ์ฐธ์กฐ ํ•ด์„ ๊ณผ์ •์—์„œ prototype chain์„ ๋”ฐ๋ผ constructor.constructor์— ์ ‘๊ทผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

------WebKitFormBoundaryv77gZrFCS37c0Dkg
Content-Disposition: form-data; name="0"
{"foo":"1","bar":"$1:__proto__:constructor:constructor"}
------WebKitFormBoundaryv77gZrFCS37c0Dkg
Content-Disposition: form-data; name="1"
{}
------WebKitFormBoundaryv77gZrFCS37c0Dkg--
{ foo: "1", bar: [Function: Function] }

prototype pollution์œผ๋กœ ์ž„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

chunk ํŒŒ์‹ฑ ๊ฒฐ๊ณผ๋Š” action-handler.ts ํŒŒ์ผ์˜ decodeReplyFromBusboy() ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. Content Type์ด Multipart์ผ ๊ฒฝ์šฐ[1], decodeReplyFromBusboy() ํ•จ์ˆ˜๋Š” form data๋ฅผ ํŒŒ์‹ฑ[2]ํ•ฉ๋‹ˆ๋‹ค.

// <https://github.com/vercel/next.js/blob/aab1edcb8d7a57a6f7a1637d0f87be84ea62edc8/packages/next/src/server/app-render/action-handler.ts#L867-L893>
// -- [1] 
if (isMultipartAction) {
  if (isFetchAction) {
    // A fetch action with a multipart body.
    const busboy = (
      require('next/dist/compiled/busboy') as typeof import('next/dist/compiled/busboy')
    )({
      defParamCharset: 'utf8',
      headers: req.headers,
      limits: { fieldSize: bodySizeLimitBytes },
    })
    // We need to use `pipeline(one, two)` instead of `one.pipe(two)` to propagate size limit errors correctly.
    pipeline(
      sizeLimitedBody,
      busboy,
      // Avoid unhandled errors from `pipeline()` by passing an empty completion callback.
      // We'll propagate the errors properly when consuming the stream.
      () => {}
    )
		// -- [2]
    boundActionArguments = await decodeReplyFromBusboy(
      busboy,
      serverModuleMap,
      { temporaryReferences }
    )
  }
  ...

์ด๋•Œ JavaScript์˜ await ์—ฐ์‚ฐ์ž๋Š” ๋ฐ˜ํ™˜๊ฐ’์ด Promise๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ then property๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ thenable๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, await value ๊ตฌ๋ฌธ์—์„œ value.then์ด ํ•จ์ˆ˜๋กœ ์กด์žฌํ•  ๊ฒฝ์šฐ, JavaScript ๋Ÿฐํƒ€์ž„์€ ์ด๋ฅผ Promise์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•˜์—ฌ then ํ•จ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

foo = {}
foo.then = function(resolve, reject) {
  resolve(1);
}
await foo
// output
// 1

๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ณต๊ฒฉ์ž๋Š” prototype pollution์„ ํ†ตํ•ด then ํ•จ์ˆ˜๋ฅผ ์ฃผ์ž…ํ•จ์œผ๋กœ์จ, await ๊ตฌ๋ฌธ์—์„œ ์ž„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ตœ์ข… payload๋Š” ๊ณต๊ฐœ๋œ React2Shell PoC์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ทจ์•ฝ์ ์˜ root cause๋Š” ์ด์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ ๋ถ€์žฌ์ž…๋‹ˆ๋‹ค. React๋Š” 7dc903cd29dac55efb4424853fd0442fef3a8700 ์ปค๋ฐ‹์„ ํ†ตํ•ด ReactFlightReplyServer.jsโ€Ž ํŒŒ์ผ์˜ getOutlinedModel() ํ•จ์ˆ˜์—์„œ ์ฐธ์กฐ ๋Œ€์ƒ์ด ๊ฐ์ฒด ์ž์‹ ์˜ property ์ธ์ง€ ํ™•์ธํ•˜๋„๋ก hasOwnProperty() ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํŒจ์น˜์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์€ React ๋ธ”๋กœ๊ทธ ๋ฐ Next.js ๊ณต์‹ ๋ณด์•ˆ ๊ถŒ๊ณ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

References


๋งˆ์น˜๋ฉฐ

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

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

๋ณด์•ˆ์€ ํŠน์ • ์†”๋ฃจ์…˜์ด๋‚˜ ๋‹ด๋‹น์ž์˜ ์ฑ…์ž„์œผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์„ค๊ณ„์™€ ์šด์˜ ์ „๋ฐ˜์—์„œ ์ง€์†์ ์œผ๋กœ ์ ๊ฒ€ํ•˜๊ณ  ์กฐ์‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋ณธ ์ „์ œ์ž…๋‹ˆ๋‹ค. โ€˜์ง€๊ธˆ์˜ ์‹œ์Šคํ…œ์€ ๋ฌด์—‡์„ ์‹ ๋ขฐํ•˜๊ณ  ์žˆ๋Š”๊ฐ€โ€™, โ€˜์‹ ๋ขฐ๋Š” ์–ด๋–ค ์กฐ๊ฑด์—์„œ ๊นจ์งˆ ์ˆ˜ ์žˆ๋Š”๊ฐ€โ€™, โ€˜๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฌํ•œ ์ƒํ™ฉ์— ๋Œ€๋น„ํ•ด ์–ด๋–ค ๊ตฌ์กฐ์™€ ๊ธฐ์ค€์„ ์ค€๋น„ํ•ด ๋‘์—ˆ๋Š”๊ฐ€โ€™๋ผ๋Š” ์งˆ๋ฌธ์— ๋‹ตํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด, ๋ณด์•ˆ ์‚ฌ๊ณ ๋Š” ์–ธ์ œ๋“  ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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


๐Ÿ” About Theori Frontier Squad

Theori์˜ Frontier Squad ํŒ€์€ ์‹ค์ œ ํ•ด์ปค๋“ค์˜ ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ ๊ฐ์˜ ์„œ๋น„์Šค์™€ ์ธํ”„๋ผ๋ฅผ ์ง„๋‹จํ•˜๊ณ , ํ˜„์‹ค์ ์ธ ๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ณด์•ˆ์˜ ์‚ฌ๊ฐ์ง€๋Œ€๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ์˜คํŽœ์‹œ๋ธŒ ๋ณด์•ˆ ์ „๋ฌธ ์กฐ์ง์ž…๋‹ˆ๋‹ค. ์„ค๊ณ„ ๋‹จ๊ณ„ ์œ„ํ˜‘ ๋ชจ๋ธ๋ง๋ถ€ํ„ฐ ์ฝ”๋“œ ์ˆ˜์ค€์˜ ์ทจ์•ฝ์  ๋ฆฌ๋ทฐ, ์‹ค์ „ ์นจํˆฌ ํ…Œ์ŠคํŠธ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณต๊ฒฉ์ž๋ณด๋‹ค ํ•œ๋ฐœ ์•ž์„œ ๋Œ€์‘ํ•˜๊ณ , ๋ถˆ๊ฐ€๋Šฅํ•ด ๋ณด์ด๋Š” ๋ฌธ์ œ๋ฅผ ๊ธฐ์ˆ ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ์˜คํŽœ์‹œ๋ธŒ ์‚ฌ์ด๋ฒ„๋ณด์•ˆ์˜ ๋ฆฌ๋”๋กœ์„œ, ๋” ์•ˆ์ „ํ•œ ๋””์ง€ํ„ธ ์„ธ๊ณ„๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

Share article

Theori ยฉ 2025 All rights reserved.