React 서버 컴포넌트에서 새로 발견된 서비스 거부(DoS) 및 서버 함수 소스 코드 노출 취약점, 영향받는 버전, 완화 방법과 타임라인을 다룹니다.
2025년 12월 11일 · React 팀
보안 연구원들은 지난주 공개된 치명적인 취약점의 패치를 우회하려는 과정에서, React 서버 컴포넌트에서 두 개의 추가 취약점을 발견하고 공개했습니다.
이 신규 취약점들은 원격 코드 실행(Remote Code Execution)을 허용하지 않습니다. React2Shell에 대한 패치는 여전히 원격 코드 실행 익스플로잇을 완화하는 데 효과적입니다.
새로 공개된 취약점은 다음과 같습니다.
새로 공개된 취약점의 심각도를 고려하여, 즉시 업그레이드할 것을 권장합니다.
지난주 치명적인 보안 취약점에 대응해 이미 업데이트를 적용했다면, 다시 한 번 업데이트해야 합니다.
19.0.2, 19.1.3, 19.2.2로 업데이트한 경우, 이 버전들은 불완전한 패치이며 다시 업데이트해야 합니다.
업그레이드 단계는 이전 게시글의 안내를 참고하세요.
해당 취약점에 대한 보다 구체적인 정보는 수정 사항의 롤아웃이 완료된 이후 제공될 예정입니다.
이 취약점들은 CVE-2025-55182와 동일한 패키지 및 버전들에 존재합니다.
이는 다음 버전들(19.0.0, 19.0.1, 19.0.2, 19.1.0, 19.1.1, 19.1.2, 19.1.2, 19.2.0, 19.2.1, 19.2.2)이 포함됩니다.
패치는 19.0.3, 19.1.4, 19.2.3 버전에 백포트(backport)되었습니다. 위 패키지들 중 어떤 것이라도 사용 중이라면, 즉시 해당 패치 버전으로 업그레이드해야 합니다.
앞서 공지한 것과 동일하게, 앱의 React 코드가 서버를 사용하지 않는다면 이 취약점의 영향을 받지 않습니다. 또한 React 서버 컴포넌트를 지원하는 프레임워크, 번들러 또는 번들러 플러그인을 사용하지 않는 앱이라면 이 취약점의 영향을 받지 않습니다.
치명적인 취약점이 공개되면, 연구원들은 인접한 코드 경로를 세밀하게 분석하며 초기 완화 조치를 우회할 수 있는 변형된 익스플로잇 기법을 찾습니다.
이 패턴은 JavaScript에만 국한되지 않고 업계 전반에서 관찰됩니다. 예를 들어 Log4Shell 공개 이후, 커뮤니티가 원래 수정 사항을 검증하는 과정에서 추가 CVE(1, 2)가 보고되었습니다.
추가 공개는 피로감을 줄 수 있지만, 일반적으로는 건강한 대응 사이클이 진행되고 있다는 신호입니다.
일부 React 프레임워크와 번들러는 취약한 React 패키지에 의존(dependencies 또는 peerDependencies)하거나, 이들을 내장하고 있습니다. 영향을 받는 React 프레임워크 및 번들러는 다음과 같습니다: next, react-router, waku, @parcel/rsc, @vite/rsc-plugin, rwsdk.
업그레이드 단계는 이전 게시글의 안내를 참고하세요.
이전과 마찬가지로, 여러 호스팅 제공업체와 협력하여 임시 완화 조치를 적용했습니다.
그러나 이러한 조치에만 의존해 앱을 보호해서는 안 되며, 반드시 즉시 업데이트해야 합니다.
모노레포나 react-dom을 사용하지 않는 React Native 사용자라면, package.json에서 react 버전이 고정(pinned)되어 있을 것이며, 추가로 필요한 조치는 없습니다.
React Native를 모노레포 환경에서 사용 중이라면, 아래 패키지들이 설치되어 있는 경우 해당 패키지들만 업데이트해야 합니다.
react-server-dom-webpackreact-server-dom-parcelreact-server-dom-turbopack이는 보안 권고를 완화하기 위한 필수 조치지만, react와 react-dom을 업데이트할 필요는 없으므로 React Native에서 버전 불일치 오류를 유발하지 않습니다.
자세한 내용은 이 이슈를 참고하세요.
CVE: CVE-2025-55184, CVE-2025-67779
기본 점수(Base Score): 7.5 (높음)
보안 연구원들은 악의적인 HTTP 요청을 특정 서버 함수(Server Functions) 엔드포인트로 전송할 수 있으며, 이 요청이 React에 의해 역직렬화(deserialize)되는 과정에서 무한 루프를 유발해 서버 프로세스를 중단시키고 CPU를 과도하게 사용하는 문제가 있음을 발견했습니다. 앱이 React 서버 함수 엔드포인트를 직접 구현하지 않았더라도, React 서버 컴포넌트를 지원한다면 여전히 이 취약점의 영향을 받을 수 있습니다.
이로 인해 공격자가 사용자가 제품에 접근하지 못하도록 방해(서비스 거부)하거나, 서버 환경에 성능 영향을 줄 수 있는 공격 벡터가 생깁니다.
오늘 배포된 패치는 이 무한 루프가 발생하지 않도록 방지하여 문제를 완화합니다.
서비스 거부 취약점 CVE-2025-55184를 해결하기 위한 최초의 수정은 불완전했습니다.
이로 인해 19.0.2, 19.1.3, 19.2.2 버전이 여전히 취약한 상태로 남았습니다. 19.0.3, 19.1.4, 19.2.3 버전은 안전합니다.
우리는 추가 사례를 수정했고, 취약한 버전에 대해 CVE-2025-67779를 새로 등록했습니다.
CVE: CVE-2025-55183
기본 점수(Base Score): 5.3 (중간)
보안 연구원은 악의적인 HTTP 요청이 취약한 서버 함수에 전송될 경우, 어떤 서버 함수든 그 소스 코드가 문자열 형태로 안전하지 않게 반환될 수 있다는 사실을 발견했습니다. 이 취약점을 악용하려면, 명시적 혹은 암묵적으로 문자열화된 인자를 노출하는 서버 함수가 존재해야 합니다.
js'use server'; export async function serverFunction(name) { const conn = db.createConnection('SECRET KEY'); const user = await conn.createUser(name); // 암묵적으로 문자열화되어 DB에 노출됨 return { id: user.id, message: `Hello, ${name}!` // 명시적으로 문자열화되어 응답에 노출됨 } }
공격자는 다음과 같은 정보를 유출할 수 있습니다.
text0:{"a":"$@1","f":"","b":"Wy43RxUKdxmr5iuBzJ1pN"} 1:{"id":"tva1sfodwq","message":"Hello, async function(a){console.log(\"serverFunction\");let b=i.createConnection(\"SECRET KEY\");return{id:(await b.createUser(a)).id,message:`Hello, ${a}!`}}!"}
오늘 배포된 패치는 서버 함수의 소스 코드를 문자열화하지 못하도록 방지합니다.
소스 코드에 하드코딩된 비밀 값은 노출될 수 있지만, process.env.SECRET와 같은 런타임 시크릿은 영향을 받지 않습니다.
노출 범위는 서버 함수 내부의 코드로 제한되지만, 번들러의 인라이닝(inlining) 정도에 따라 다른 함수 코드도 포함될 수 있습니다.
반드시 실제 프로덕션 번들을 기준으로 검증해야 합니다.
소스 코드 노출 취약점을 보고한 Andrew MacPherson (AndrewMohawk), 그리고 서비스 거부 취약점을 보고한 GMO Flatt Security Inc.의 RyotaK 및 Bitforest Co., Ltd.의 Shinsaku Nomura에게 감사드립니다.