๐Ÿ”ฅ [๊ธด๊ธ‰ ๋ณด์•ˆ ๊ณต์ง€] ReactยทNext.js์—์„œ CVSS 10.0 ์ทจ์•ฝ์  ๋ฐœ๊ฒฌ โ€” ์ธ์ฆ ์—†์ด ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰ ๊ฐ€๋Šฅ (React2Shell)

By PLURA

๐Ÿšจ ๊ฐœ์š” โ€” React2Shell, CVSS 10.0์˜ โ€œLog4j๊ธ‰โ€ ์ดˆ์‹ฌ๊ฐ๋„ ์ทจ์•ฝ์ 

2025๋…„ 12์›”, ๊ธ€๋กœ๋ฒŒ ๋ณด์•ˆ๊ธฐ์—… Wiz๊ฐ€ React Server Components(RSC) ์™€
์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Next.js(App Router ๊ธฐ๋ฐ˜) ์—์„œ
CVSS 10.0(์ตœ๊ณ  ์‹ฌ๊ฐ๋„) ์˜ ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(Remote Code Execution, RCE) ์ทจ์•ฝ์ ์„ ๊ณต๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

์ „ ์„ธ๊ณ„ ๋ณด์•ˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋Š” ์ด ์ทจ์•ฝ์ ์„ React2Shell์ด๋ผ ๋ถ€๋ฅด๊ณ  ์žˆ์œผ๋ฉฐ,
๊ทธ ์‹ฌ๊ฐ๋„๋Š” Log4Shell(Log4j)๊ณผ ๋™์ผํ•œ โ€˜์™„์ „ํ•œ ์„œ๋ฒ„ ์žฅ์•… ๊ฐ€๋Šฅโ€™ ์ˆ˜์ค€์œผ๋กœ ํ‰๊ฐ€๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰,

React2Shell(CVSS 10.0)์€ ๋ช…๋ฐฑํžˆ Log4j๊ธ‰ ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค.
์ธ์ฆ ์—†์ด ์„œ๋ฒ„ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ณต๊ฒฉ ๋‚œ์ด๋„ ๋˜ํ•œ ๋งค์šฐ ๋‚ฎ์Šต๋‹ˆ๋‹ค.

์ „ ์„ธ๊ณ„์ ์œผ๋กœ ReactยทNext.js ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค๊ฐ€ ํญ๋„“๊ฒŒ ๋ฐฐํฌ๋˜์–ด ์žˆ์–ด
๊ตญ๋‚ด์™ธ CERT์™€ ์ฃผ์š” ๋ณด์•ˆ ๋ฒค๋”๋Š” ์ฆ‰๊ฐ์ ์ธ ํŒจ์น˜ ์ ์šฉ์„ ๊ถŒ๊ณ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


โš ๏ธ ์–ด๋–ค ์œ„ํ—˜์ด ์žˆ๋‚˜์š”?

  • ์„œ๋ฒ„์—์„œ ์ธ์ฆ ์—†์ด ์ž„์˜ ์ฝ”๋“œ ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ์กฐ์ž‘๋œ ์š”์ฒญ๋งŒ์œผ๋กœ ์ „์ฒด ์„œ๋ฒ„ ์žฅ์•… ๊ฐ€๋Šฅ
  • ๊ธฐ๋ณธ ์„ค์ •(Default Config)๋งŒ์œผ๋กœ๋„ ๊ณต๊ฒฉ์ด ์„ฑ๋ฆฝ
  • ์ด๋ฏธ ์‹ค์ œ ๊ณต๊ฒฉ ์‹œ๋„์™€ ์Šค์บ” ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€๊ฐ€ ๊ธ€๋กœ๋ฒŒํ•˜๊ฒŒ ๊ด€์ธก๋จ

Next.js(App Router) ๋˜๋Š” React Server Components๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์›น์„œ๋น„์Šค๋ผ๋ฉด
์ง€์ฒด ์—†์ด ์˜ํ–ฅ์„ฑ ํ‰๊ฐ€ ๋ฐ ํŒจ์น˜ ์ ์šฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”ฅ 2. Log4j์™€ ๋น„๊ต: ๋ฌด์—‡์ด ๊ฐ™์€๊ฐ€?

ํ•ญ๋ชฉ Log4j (Log4Shell) React2Shell (์ด๋ฒˆ RCE) ๊ณตํ†ต์ 
์‹ฌ๊ฐ๋„ 10.0 10.0 ๋™์ผ
๊ณต๊ฒฉ ๋‚œ์ด๋„ ๋งค์šฐ ๋‚ฎ์Œ ๋งค์šฐ ๋‚ฎ์Œ ๋™์ผ
์ธ์ฆ ํ•„์š” ์—ฌ๋ถ€ ๋ถˆํ•„์š” ๋ถˆํ•„์š” ๋™์ผ
๊ฒฐ๊ณผ ์™„์ „ํ•œ ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(RCE) ์™„์ „ํ•œ ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(RCE) ๋™์ผ
์˜ํ–ฅ ๋ฒ”์œ„ ์ˆ˜๋งŽ์€ ๊ธฐ์—… ๋ฐฑ์—”๋“œ/์›น์„œ๋น„์Šค Next.jsยทReact ์„œ๋ฒ„ ํ™˜๊ฒฝ ๋„“์€ ์ƒํƒœ๊ณ„ ์ทจ์•ฝ
Zero-day ์—ฌ๋ถ€ ์˜ˆ ์˜ˆ (๊ณต๊ฐœ ์งํ›„ ๊ณต๊ฒฉ ๊ธ‰์ฆ) ๋™์ผ

์ •๋ฆฌํ•˜๋ฉด:

๊ณต๊ฒฉ ๋‚œ์ด๋„ยท์˜ํ–ฅยท์œ„ํ—˜์„ฑ ์ธก๋ฉด์—์„œ React2Shell์€ Log4j์™€ ๋™๊ธ‰์ด๋ฉฐ,
์ฆ‰๊ฐ์ ์ธ ๋Œ€์‘์ด ํ•„์š”ํ•œ ์ดˆ๊ณ ์œ„ํ—˜ ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค.


๐Ÿงฉ ๊ธฐ์ˆ  ์š”์•ฝ

1) ์ทจ์•ฝ์  ์ •๋ณด

  • CVE-2025-55182 โ€” React Server Components(RSC) ํ”„๋กœํ† ์ฝœ ์ทจ์•ฝ์ 
  • CVE-2025-66478 โ€” Next.js๊ฐ€ RSC ๊ฒฐํ•จ์„ ์ƒ์†ํ•ด ๋ฐœ์ƒํ•œ ํ•˜์œ„ ์ทจ์•ฝ์ 
  • ํ†ต์นญ: React2Shell

2) ๊ณต๊ฒฉ ๋ฐฉ์‹

RSC ํ”„๋กœํ† ์ฝœ์ด ํŽ˜์ด๋กœ๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์—ญ์ง๋ ฌํ™”ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ตฌ์กฐ์  ์„ค๊ณ„ ๊ฒฐํ•จ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ์•…์šฉํ•˜๋ฉด ๊ณต๊ฒฉ์ž๋Š” ๋‹จ์ˆœ HTTP ์š”์ฒญ๋งŒ์œผ๋กœ ์„œ๋ฒ„ ์ธก์—์„œ ์ž„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธยท์„ธ์…˜ ๋“ฑ ์ธ์ฆ์€ ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๐ŸŽฏ ์˜ํ–ฅ๋ฐ›๋Š” ํ™˜๊ฒฝ

๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ํ•ด๋‹น๋˜๋ฉด ์ทจ์•ฝํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

  • Next.js App Router ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ์šด์˜
  • React Server Components(RSC) ์‚ฌ์šฉ
  • react-server-dom-* ํŒจํ‚ค์ง€ ์‚ฌ์šฉ
  • Next.js 15.x / 16.x / ์ผ๋ถ€ 14.x canary ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ

React ๊ณต์‹ ํŒจ์น˜ ๋ฒ„์ „: 19.0.1 / 19.1.2 / 19.2.1 ์ด์ƒ
Next.js ํŒจ์น˜ ๋ฒ„์ „: 15.0.5 / 15.1.9 / 16.0.7 ๋“ฑ


๐Ÿ›ก ๊ณ ๊ฐ์‚ฌ์— ํ•„์š”ํ•œ ์กฐ์น˜

1) ์ฆ‰์‹œ ์˜ํ–ฅ์„ฑ ์ ๊ฒ€

  • ์„œ๋น„์Šค๊ฐ€ React Server Components ๋˜๋Š” Next.js(App Router)๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ํ™•์ธ
  • project dependencies์—์„œ ํ•ด๋‹น ํŒจํ‚ค์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
  • RSC ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์–ด ์žˆ๋Š”์ง€ ์ ๊ฒ€

2) ๊ธด๊ธ‰ ํŒจ์น˜ ์ ์šฉ

  • React: 19.0.1, 19.1.2, 19.2.1 ์ด์ƒ์œผ๋กœ ์—…๋ฐ์ดํŠธ
  • Next.js: ๊ณต์‹ ์ œ๊ณต๋œ ๋ณด์•ˆ ํŒจ์น˜ ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ

3) ๋ณด์•ˆ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐ•ํ™”

  • WAFยทXDRยทSIEM์—์„œ RSC ์ทจ์•ฝ์  ๊ด€๋ จ ์ด์ƒ ์š”์ฒญ ํŒจํ„ด ํƒ์ง€ ํ™œ์„ฑํ™”
  • ์ตœ๊ทผ ์„œ๋ฒ„ ๋กœ๊ทธ์—์„œ RSC ํ˜ธ์ถœยท์Šค์บ” ํŒจํ„ด ์ง‘์ค‘ ๋ถ„์„
  • React2Shell ๊ด€๋ จ IOC ๊ธฐ๋ฐ˜ ํƒ์ง€ ๋ฃฐ ์ ์šฉ

๐Ÿ›ก WAF(์›น๋ฐฉํ™”๋ฒฝ)์—์„œ ์ฆ‰์‹œ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ์ฐจ๋‹จ ์ •์ฑ…

React2Shell ์ทจ์•ฝ์ ์€ โ€œํŠน์ˆ˜ํ•˜๊ฒŒ ์กฐ์ž‘๋œ RSC ์š”์ฒญโ€์ด ํ•ต์‹ฌ ๊ณต๊ฒฉ ๋ฒกํ„ฐ์ด๋ฏ€๋กœ,
WAF์—์„œ๋Š” ์•„๋ž˜ ์ •์ฑ…์„ ์ฆ‰์‹œ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

โœ” 1) ๋น„์ •์ƒ์ ์ธ RSC ํŽ˜์ด๋กœ๋“œ ์ฐจ๋‹จ

  • /_rsc ๋˜๋Š” ?rsc= ํ˜•ํƒœ์˜ ๋น„์ •์ƒ ๊ธธ์ดยท๊นจ์ง„ Base64ยท์••์ถ•๋œ payload
  • JSON์ด ์•„๋‹Œ ๊ตฌ์กฐ์˜ binary-like payload
  • RSC ํ”„๋กœํ† ์ฝœ ์‚ฌ์–‘์— ์—†๋Š” type, id, directive ํ•„๋“œ ๋ณ€์กฐ

โœ” 2) ์„œ๋ฒ„ ๋ Œ๋”๋ง ์—”๋“œํฌ์ธํŠธ(SSR/RSC) ์ ‘๊ทผ ์ œ์–ด ๊ฐ•ํ™”

  • ์˜ˆ์ƒ์น˜ ๋ชปํ•œ HTTP ๋ฉ”์„œ๋“œ ์š”์ฒญ ์ฐจ๋‹จ (PUT/DELETE ๋“ฑ)
  • ๋‚ด๋ถ€ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” SSR ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ œํ•œ

โœ” 3) ์Šค์บ”/๋ด‡ ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ ์ •์ฑ… ๊ฐ•ํ™”

  • ์งง์€ ์‹œ๊ฐ„ ๋‚ด ๋ฐ˜๋ณต์ ์ธ _rsc ์š”์ฒญ
  • ๋น„์ •์ƒ User-Agent (curl, python-requests ๋“ฑ)
  • ํ•ด์™ธ์—์„œ ์˜ค๋Š” ๋Œ€๋Ÿ‰ ์š”์ฒญ ์ฐจ๋‹จ(GeoIP ๊ธฐ๋ฐ˜)

์š”์•ฝ:
WAF์—์„œ๋Š” โ€œRSC ๋น„์ •์ƒ ํŽ˜์ด๋กœ๋“œ ์ฐจ๋‹จ + SSR ์—”๋“œํฌ์ธํŠธ ๋ณดํ˜ธ + ๊ณต๊ฒฉ ํŒจํ„ด ๊ธฐ๋ฐ˜ Rate-limit ์ ์šฉโ€์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.


๐Ÿ“Œ ๊ฒฐ๋ก 

React2Shell์€ ๋‹จ์ˆœ ๊ฐœ๋ฐœ์ž ์‹ค์ˆ˜๊ฐ€ ์•„๋‹Œ,
ํ”„๋ ˆ์ž„์›Œํฌยทํ”„๋กœํ† ์ฝœ ๋ ˆ๋ฒจ์˜ ๊ตฌ์กฐ์  ์ทจ์•ฝ์ ์ด๋ฉฐ
๊ณต๊ฒฉ ๋‚œ์ด๋„์™€ ํ”ผํ•ด ๊ทœ๋ชจ ๊ด€์ ์—์„œ Log4j์— ํ•„์ ํ•˜๋Š” ์ดˆ์‹ฌ๊ฐ๋„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

React/Next.js ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค๋ฅผ ์šด์˜ ์ค‘์ด๋ผ๋ฉด
์ง€๊ธˆ ์ฆ‰์‹œ ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜๊ณ  ๋ณด์•ˆ ์ ๊ฒ€์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•˜์‹  ๊ฒฝ์šฐ,
๊ท€์‚ฌ ํ™˜๊ฒฝ์„ ์œ„ํ•œ ์ทจ์•ฝ์„ฑ ์ง„๋‹จ, RSC ๋…ธ์ถœ ์—ฌ๋ถ€ ์กฐ์‚ฌ,
ํŒจ์น˜ ๊ฐ€์ด๋“œ, WAF/XDR ํƒ์ง€ ๋ฃฐ ์—ฐ๋™์„ ์ง€์›ํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ธฐ์‚ฌ