펜리젠트 헤더

CVE-2025-66478: Next.js 서버 동작의 조용한 살인자 마스킹 해제하기

소개 소개: 패러다임의 전환과 그 대가

현대 웹 개발의 진화는 원활함을 향한 경쟁이었습니다. Next.js 13+에 React 서버 컴포넌트(RSC)로 구동되는 앱 라우터가 도입되면서 클라이언트와 서버의 경계가 모호해지는 세상이 도래했습니다. 개발자는 UI 컴포넌트에서 직접 데이터베이스 쿼리를 호출할 수 있었고, 프레임워크는 무거운 작업을 처리했습니다.

하지만, CVE-2025-66478 가 잔인한 현실 점검으로 다가왔습니다. 비판적 CVSS 점수 10.0원격 코드 실행(RCE) 취약점은 단순한 코딩 오류가 아니라 최신 웹을 구동하는 직렬화 계층에 대한 근본적인 신뢰 위반을 나타냅니다.

하드코어 보안 엔지니어에게 이 취약점은 웹 보안의 표준 정신 모델을 우회하기 때문에 중요합니다. 이 취약점은 잘못된 문자열 연결로 인한 SQL 인젝션도 아니고 단순한 XSS도 아닙니다. 이 취약점은 자바스크립트 내부의 리액트 비행 프로토콜-서버와 클라이언트가 대화할 때 사용하는 이진 언어입니다.

이 심층 분석에서는 이 취약점의 아키텍처를 해체하고, 인증되지 않은 RCE를 허용하는 특정 역직렬화 메커니즘을 분석하고, 그 이유를 살펴봅니다. 펜리전트와 같은 AI 기반 모의 침투 테스트 플랫폼 는 이러한 복잡한 논리 결함을 공격자가 발견하기 전에 체계적으로 식별할 수 있는 유일한 도구입니다.

CVE-2025-66478 펜리젠트

불안정한 아키텍처: RSC 비행 이해

CVE-2025-66478을 익스플로잇하려면 먼저 Next.js가 사용하는 독점 프로토콜을 이해해야 합니다. 사용자가 서버 액션(예: 양식 제출)과 상호 작용할 때 브라우저는 표준 JSON 페이로드를 보내지 않습니다. 대신 React의 하이드레이션 프로세스에 최적화된 직렬화된 스트림을 전송합니다.

"Flight" 프로토콜로 알려진 이 형식은 원시 HTTP 본문에서 다음과 같이 보입니다:

일반 텍스트

0:["$@1",["$@2",null]] 1:I{"id":"./src/actions/user.js","청크":["client-chunk-123"],"name":"updateUser","async":true} 2:{"name":"John Doe","email":"[email protected]"}

신뢰의 함정

이 취약점은 서버 측 역직렬화기가 너무 열심히 작동하기 때문에 존재합니다. 영향을 받는 Next.js 버전(15.1.9 이전 15.x 및 16.0.7 이전 16.x)에서 프레임워크는 이 페이로드에 정의된 구성 요소 트리를 재구성하려고 시도합니다. 전에 요청하는 사용자에게 특정 모듈을 인스턴스화할 수 있는 권한이 있는지 엄격하게 검증합니다.

Next.js를 사용하면 클라이언트가 서버 측 모듈에 대한 참조를 전달할 수 있습니다. 이는 서버가 개발자가 정의한 특정 작업을 실행할 수 있도록 하려는 의도입니다. 그러나 공격자가 이러한 참조를 조작할 수 있다는 결함이 있습니다. 공격자는 의도한 ./src/actions/user.js를 사용하여 제작된 페이로드는 내부 Node.js 내장 또는 글로벌 범위에서 사용 가능한 프로토타입 오염 가젯을 참조할 수 있습니다.

서버가 이 악성 스트림을 역직렬화하면 단순히 데이터를 읽는 데 그치지 않습니다. 코드 실행 를 호출하여 객체의 상태를 복원할 수 있습니다. 상태 복원에 함수 호출(예: 게터 또는 생성자)이 포함되는 경우 공격자는 인증 미들웨어(예: NextAuth.js)가 요청 헤더를 완전히 처리하기 전에 즉시 코드 실행을 달성할 수 있습니다.

CVE-2025-66478 마스킹 해제

공격자의 킬 체인: 정찰에서 포격까지

Next.js 애플리케이션을 방어하는 보안 엔지니어의 경우 공격자의 워크플로우를 이해하는 것이 중요합니다. CVE-2025-66478을 익스플로잇하는 것은 스크립트를 실행하는 것만큼 간단하지 않으며, 공격 대상의 빌드 아티팩트에 대한 정교한 이해가 필요합니다.

1단계: 수동 정찰 및 지문 인식

공격자는 먼저 공격 대상이 취약한 버전의 Next.js를 실행하고 있는지 확인합니다. 이는 HTTP 헤더(X-Powered-By: Next.js)의 구조를 분석하거나 _next/static/ 디렉터리로 이동합니다.

2단계: "액션 ID" 수확

이는 수동 공격자가 기술적으로 가장 어려워하는 부분입니다. Next.js는 암호화 해시를 사용하여 서버 동작을 난독화합니다(예 a9fa42b4...)를 사용하여 번들 크기를 최소화합니다. 올바른 해시가 없으면 서버는 요청을 무시합니다.

공격자는 클라이언트 측 JavaScript 번들(웹팩 청크)을 파싱하여 이러한 해시를 추출하는 스크립트를 작성합니다. 공격자들은 등록 서버 참조 호출을 최소화했습니다:

자바스크립트

// 축소된 클라이언트 코드 스니펫 ...registerServerReference(a,"a9fa42b4c7d1",null)...

공격자는 이러한 ID를 스크래핑하여 서버의 로직에 유효한 진입점 맵을 구축합니다.

3단계: 페이로드 구성("React2Shell" 기술)

유효한 진입 지점을 찾으면 공격자는 "React2Shell" 페이로드를 구성합니다. 공격자는 POST 요청을 통해 콘텐츠 유형텍스트/엑스 컴포넌트 (또는 버전에 따라 유사).

본문은 역직렬화 가젯을 트리거하도록 설계된 재귀적 객체 구조입니다.

  • Target: child_process.exec 또는 fs.writeFileSync.
  • 메커니즘: 페이로드는 이러한 시스템 라이브러리를 가리키는 모듈 참조를 정의합니다.
  • 트리거: 구문 분석 시 서버는 모듈을 "해결"하려고 시도합니다.

4단계: 실행 및 유출

서버가 스트림을 구문 분석합니다. 악성 오브젝트가 인스턴스화됩니다. 명령 누가미 가 실행됩니다. 이는 대역 외에서 발생하므로(HTTP 응답이 충돌하거나 오류를 반환할 수 있음), 숙련된 공격자는 서버가 제어되는 도메인(예:, ping attacker.com)를 클릭하여 RCE를 확인합니다.

레거시 보안 도구가 맹목적인 이유

CVE-2025-66478 이후 많은 조직에서 기존의 DAST(동적 애플리케이션 보안 테스트) 도구로 경계를 검사한 결과 깨끗한 상태를 확인했습니다. 그들은 틀렸습니다.

레거시 스캐너(예: OWASP ZAP, Burp Suite Pro 기본 스캔 또는 Nessus)는 근본적인 이유로 여기서 실패합니다:

  1. 프로토콜 무지: 표준 스캐너는 비행 프로토콜 본문을 불투명한 텍스트로 취급합니다. 그들은 SQL 따옴표(' 또는 1=1) 또는 XSS 태그. Next.js는 이를 단순히 잘못된 바이너리 스트림으로 거부합니다. 스캐너는 500 오류를 표시하고 "안전"으로 간주하며 취약점은 그대로 유지됩니다.
  2. 컨텍스트 블라인드: 레거시 스캐너는 웹팩 청크를 스크래핑하여 액션 ID를 찾는 방법을 모릅니다. 12자로 구성된 영숫자 해시를 '추측'할 수 없습니다. ID가 없으면 문이 잠기고 스캐너는 취약한 코드 경로에 도달하지도 못합니다.
  3. WAF 회피: 페이로드 구조가 합법적인 React 컴포넌트 데이터를 모방하기 때문에 서명 기반 WAF는 복잡한 사용자 양식 제출과 직렬화된 RCE 익스플로잇을 구분하는 데 어려움을 겪습니다.

이러한 탐지 격차는 웹 2.0 도구로는 GenAI 시대의 문제를 해결할 수 없다는 업계의 중요한 요구를 강조합니다.

CVE-2025-66478 PoC 펜리전트

AI의 이점: 펜리전트가 로직 퍼즐을 푸는 방법

보안 패러다임이 "스캐닝"에서 "에이전트 침투 테스트"로 전환되는 시점입니다. 에서 Penligent.ai인간 해커처럼 생각하지만 기계의 속도로 작동하도록 플랫폼을 설계했습니다.

Penligent는 Next.js 애플리케이션을 분석할 때 전문화된 RSC 에이전트. 표준 스캐너와 다른 점은 다음과 같습니다:

1. 지능형 자산 파싱(소스 맵 분석)

펜리전트 에이전트는 블라인드 퍼징 대신 클라이언트 측 빌드 아티팩트를 다운로드하여 분석합니다. AI는 축소된 JavaScript의 AST(추상 구문 트리)를 파싱하여 다음을 식별합니다. server$reference 마커를 사용합니다. 인터넷에 노출된 모든 서버 측 기능의 맵을 효과적으로 재구성하여 어떤 정규식 스크립트도 따라잡을 수 없는 포괄적인 공격 표면 맵을 생성합니다.

2. 컨텍스트 인식 페이로드 생성

펜리전트는 리액트 플라이트 프로토콜의 문법을 이해합니다. 무작위 가비지를 전송하지 않습니다. 유효한 구조 안에 중첩된 악성 페이로드를 포함하는 구문적으로 완벽한 비행 요청을 구성합니다.

예시 시나리오: 펜리전트가 "프로필 업데이트" 작업을 식별합니다. 유효한 사용자 ID와 이메일 필드는 유지하되 중첩된 '기본 설정' 개체에 프로토타입 오염 가젯을 삽입합니다. 서버는 구조를 유효한 것으로 수락하고 역직렬화를 트리거하며 Penligent는 결과 이상 징후를 캡처합니다.

3. 로직 검증과 충돌 감지 비교

인간 펜테스터는 500개의 오류가 항상 취약점이 아니며 200개의 오케이가 항상 안전하지 않다는 것을 알고 있습니다. 펜리젠트는 행동 응답을 반환합니다. 시간 지연 명령을 삽입한 후 요청의 지연 시간이 500ms 증가하면 HTTP 응답 본문이 비어 있어도 Penligent는 성공적인 RCE로 추론합니다.

이 기능은자동화된 논리 추론-는 지난 10년간의 시끄러운 스캐너와 펜리젠트를 구분 짓는 요소입니다. 수동 감사의 깊이와 SaaS의 확장성을 제공합니다.

치료 및 강화: 심층 방어

Penligent와 같은 도구를 사용하면 취약점을 찾는 데 도움이 되지만, 취약점을 수정하려면 다층적인 접근 방식이 필요합니다.

즉각적인 완화: 패치

주요 수정 사항은 Next.js를 즉시 업그레이드하는 것입니다.

  • 고정 버전: v15.1.9+, v16.0.7+.
  • 메커니즘: 이 버전에서는 직렬화 가능한 유형에 대한 엄격한 허용 목록을 도입하고 수화 단계에서 모듈 참조를 살균하여 임의의 시스템 모듈이 인스턴스화되는 것을 방지합니다.

보조 방어: 런타임 강화

프레임워크 패치에만 의존하지 마세요. 다음 0일이 코앞에 다가왔다고 가정해 보세요.

  1. 최소 권한: Next.js를 실행하는 Node.js 프로세스에 제한된 권한이 있는지 확인합니다. 루트 액세스 권한이 없어야 하며 파일 시스템에 쓸 수 없어야 합니다(특정 임시 디렉터리 제외).
  2. 네트워크 세분화: 아웃바운드 연결을 제한합니다. Next.js 서버가 PWN된 경우 외부 IP에 대한 리버스 셸 연결을 시작할 수 없어야 합니다.
  3. 프로덕션에서 소스 맵을 비활성화합니다: 모호성을 통한 보안은 전략이 아니지만, 공개 소스 맵을 비활성화하면 공격자(및 자동화된 봇)가 서버 작업 ID를 매핑하기가 훨씬 더 어려워집니다.

고급 구성

즉시 업그레이드할 수 없는 경우 서버 작업을 일시적으로 비활성화할 수 있습니다. next.config.js로 변경하면 애플리케이션 기능이 중단될 수 있습니다:

자바스크립트

module.exports = { experimental: { serverActions: false, // 긴급 킬-스위치 }, }

결론 결론: AI와 보안의 미래

CVE-2025-66478은 자바스크립트 보안의 분수령입니다. 서버의 복잡성을 추상화할수록 취약점이 숨을 수 있는 새로운 불투명성 계층이 생겨난다는 것을 보여줍니다.

React Flight와 같은 프로토콜의 복잡성은 수동 코드 검토만으로는 관리할 수 있는 인지 부하를 초과하며, 기존 정규식 기반 스캐너의 기능을 확실히 뛰어넘습니다. 애플리케이션 보안의 미래 에이전트 AI-아키텍처를 이해하고, 코드를 읽고, 복잡한 테스트 전략을 자율적으로 수립할 수 있는 시스템입니다.

다음과 같은 도구 펜리전트 는 단순히 버그를 식별하는 것이 아니라 애플리케이션 로직의 무결성을 검증합니다. 역직렬화 결함 하나가 전체 보안 침해로 이어질 수 있는 시대에는 24시간 연중무휴로 방어 체계를 조사하는 AI 파트너를 확보하는 것이 더 이상 사치가 아니라 필수입니다.

다음 단계:

침해가 발생할 때까지 기다리지 마세요. 지금 바로 Next.js 버전을 확인하세요. 중요한 인프라를 관리하는 경우 자동화된 에이전트 침투 테스트를 배포하여 CVE-2025-66478 및 기타 로직 기반 취약점에 대한 노출 여부를 확인하는 것이 좋습니다.

기술 참조 및 기관 링크

게시물을 공유하세요:
관련 게시물