
My research on CVE-2025-55182
이 저장소는 CVE-2025-55182 (React2Shell 취약점)에 대한 연구입니다. 저장소는 stand와 exploit 두 가지 주요 부분으로 구성됩니다.
이 보안 결함에 대한 정보:
이 취약점은 기본적으로 사용자 입력 검증 부재입니다. 하지만 그렇게 간단하지는 않습니다 =)
React 클라이언트 부분과 React 서버 부분은 React Flight Protocol을 사용하여 데이터를 교환합니다. 빠르게 익숙해지기 위한 좋은 강연이 있습니다.
React Flight Protocol 메시지 청크 예시:
{
"0": (None, '["$1"]'),
"1": (None, '{"object":"fruit","name":"$2:fruitName"}'),
"2": (None, '{"fruitName":"cherry"}'),
}
RFP 청크는 $ 연산자를 사용하여 서로 참조할 수 있습니다. 나중에 청크가 서버에서 역직렬화되면 이 링크가 해결됩니다. 여기서 중요한 점은 객체 프로토타입에 접근할 수 있다는 것입니다.
프로토타입을 조작하여 V8이 우리의 .then()을 기다리도록 강제할 수 있습니다. 결과 페이로드는 다음과 같을 수 있습니다:
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}',
"_response": {
"_prefix": f"return foo; ",
"_formData": {
"get": "$1:constructor:constructor",
},
},
}
이 가젯 체인이 실제로 어떻게 작동하는지 자세히 설명하지는 않겠습니다. 더 알고 싶다면 Moritz Sanft의 훌륭한 분석을 여기서 읽어보세요.
이 결함을 더 깊이 파고들고 싶다면 패치 전후의 github 버전 비교도 확인할 수 있습니다.
간단한 react/next.js 앱을 만들었습니다( stand/package.json 참조):
"dependencies": {
"next": "16.0.6",
"react": "19.2.0",
"react-dom": "19.2.0"
},
create-next-app으로 만든 텍스트 콘텐츠가 있는 간단한 페이지입니다:
시작하려면 stand 디렉토리에서 다음을 실행하세요:
docker compose up --build -d
그런 다음 브라우저에서 http://localhost:3000으로 이동하세요.
익스플로잇은 간단합니다. 특별히 구성된 RFP 청크를 페이로드와 함께 POST 요청으로 서버에 보내면 됩니다. exploit/src/main.py를 참조하세요. 또한 서버가 취약한지 여부를 확인하는 간단한 검사도 포함되어 있습니다. whoami 명령을 실행하려고 시도하며, 타임아웃이 초과되면 서버는 패치된 버전을 사용할 가능성이 높습니다.
RFP 페이로드는 exploit/resource/chunk.json에서 확인할 수 있습니다.
익스플로잇을 실행하기 전에 netcat 리스너를 설정하고 리버스 셸을 얻기 위해 exploit/resource/config.toml을 호스트와 포트로 업데이트하는 것을 잊지 마세요.
즐거운 pwning 되세요!
취약점을 발견한 Lachlan Davidson, 좋은 가젯을 찾은 maple, PoC를 공유하고 훌륭한 분석을 작성한 Moritz Sanft에게 큰 존경을 표합니다.
I3r1h0n 제작.