React Server Actions 요청을 처리하는 코드에서 서비스 거부(DoS) 취약점 CVE-2026-23870이 발견됐다. 조작된 요청이 서버의 단일 스레드를 장시간 점유해 다른 요청도 지연시키거나 시간 초과를 일으킬 수 있으며, React는 수정 버전을 배포했다.
취약점 작동 방식
서버 액션이 호출되면 React는 요청 데이터를 폼 데이터로 재구성한다. 이 과정에서 $K 포인터 하나를 처리할 때마다 요청의 전체 필드 목록을 훑는다. 요청에 포인터와 필드가 각각 10,000개 있으면 약 1억 번의 문자열 검사가 발생할 수 있다. 포인터와 필드 수에 별도 제한이 없어 공격자가 두 값을 조절할 수 있다는 점이 문제다.
배열 중첩 깊이와 액션 호출 인수 개수에 제한이 있지만, 포인터 목록을 한 단계 더 깊이 넣으면 인수 제한을 우회할 수 있다고 제보자는 설명했다. 서버 액션 데이터 재구성은 보안 검사보다 먼저 실행된다. 따라서 이 단계에서는 로그인, CSRF 토큰, 출처 검사로 요청을 막을 수 없다. 액션 ID는 페이지 HTML과 브라우저가 내려받는 JavaScript 파일에 포함된다고 한다. 공개 페이지의 액션은 계정 없이도 호출할 수 있고, 로그인이 필요한 경우에도 일반 계정으로 요청을 보낼 수 있다고 제보자는 밝혔다.
제보자는 노트북의 일반 프로덕션 빌드에서 요청 하나가 서버를 약 4초간 멈추게 했으며, 연속 요청 5개는 약 20초의 중단을 일으켰다고 보고했다. 프로덕션과 유사한 환경에서는 요청당 약 10초가 걸렸고, 세 차례 연속 요청 뒤 로드 밸런서가 서버를 서비스 대상에서 제외해 관련 없는 사용자에게 503 오류가 발생했다고 주장했다. 이는 제보자가 보고한 시험 결과다.
영향 범위와 수정 버전
React는 이 취약점이 특정 프레임워크에 한정되지 않고 여러 구성에서 공유하는 코드에 있다고 설명했다. react-server-dom-webpack, react-server-dom-turbopack, react-server-dom-parcel 패키지의 React 19.0, 19.1, 19.2 계열에서 각각 19.0.6, 19.1.7, 19.2.6보다 낮은 버전이 영향을 받는다. 동일한 코드를 실행하지만 권고문에 언급되지 않은 react-server-dom-esm 빌드도 있다고 제보자는 덧붙였다.
제보자의 설명에 따르면, 접근 가능한 서버 액션이 하나라도 있는 패치 전 React 19.0~19.2 기반 앱이 대상이 될 수 있다. 여기에는 Next.js 14 이상 앱과 다른 React Server Components 구성도 포함될 수 있다. 폼 필드 하나를 기록하는 단순한 액션도 충분하다고 한다.
수정 사항은 포인터마다 필드 전체를 다시 훑는 대신 요청 전체에서 필드 목록을 한 번만 순회하도록 바꾼 것이다. React는 처리 위치를 기록하고 사용한 필드를 삭제하는 래퍼를 추가했다. 이 패치는 React 보안 권고 GHSA-rv78-f8rc-xrxh에 포함됐으며, Meta는 CVE-2026-23870으로 수정 사항을 반영했다.
제보자는 2026년 4월 21일 Meta에 보고했고, 5월 6일 수정 사항이 반영됐으며, 10월 8일 공개 글을 게시했다고 밝혔다. 공개 글 작성 시점에 버그 바운티 플랫폼의 제보 상태는 'New'였고, 권고문에 이름이 실리지 않았으며 자동 확인 외의 답변을 받지 못했다고 전했다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요