๐ฅ [๊ธด๊ธ ๋ณด์ ๊ณต์ง] ReactยทNext.js์์ CVSS 10.0 ์ทจ์ฝ์ ๋ฐ๊ฒฌ โ ์ธ์ฆ ์์ด ์๊ฒฉ ์ฝ๋ ์คํ ๊ฐ๋ฅ (React2Shell)
๐จ ๊ฐ์ โ 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 ํ์ง ๋ฃฐ ์ฐ๋์ ์ง์ํด ๋๋ฆฝ๋๋ค.