
CVE-2025-29927에 대한 개념 증명 익스플로잇, Next.js 미들웨어 우회 취약점입니다. 버전별 페이로드와 보호된 경로에 대한 무단 접근 테스트를 위한 Docker 기반 실습 환경을 포함합니다.

Next.js의 11.1.4부터 13.5.6까지, 14.x의 14.2.25 미만, 15.x의 15.2.3 미만의 모든 버전이 이 취약점의 영향을 받습니다. 특히 접근 제어 구현을 위해 미들웨어에 의존하는 애플리케이션에서 영향이 크며, 공격자는 인증 없이 보호된 리소스에 무단 접근할 수 있습니다.
CVE-2025-29927 취약점은 Next.js가 x-middleware-subrequest 헤더를 처리하는 방식의 설계 결함에서 비롯됩니다. 이 헤더는 원래 Next.js 프레임워크 내에서 미들웨어의 무한 실행 루프를 방지하기 위한 내부 용도로 사용되었습니다.
Next.js 애플리케이션이 미들웨어를 사용할 때, runMiddleware 함수가 들어오는 요청을 처리하기 위해 호출됩니다. 이 함수의 기능 중 하나로 x-middleware-subrequest 헤더의 존재 여부를 확인합니다. 이 헤더가 존재하고 특정 값을 포함하면 미들웨어 실행이 완전히 건너뛰어지고, 요청은 NextResponse.next()를 통해 원래 대상으로 직접 전달됩니다.
취약점은 이 헤더 검사가 외부 사용자에 의해 악용될 수 있다는 데 있습니다. 공격자는 올바른 값을 가진 x-middleware-subrequest 헤더를 요청에 추가함으로써 미들웨어 기반의 모든 보호 메커니즘을 완전히 우회할 수 있습니다.
저장소를 클론합니다:
git clone <repository_url>
프로젝트 디렉토리로 이동합니다:
cd nextjs-docker-app
Docker 이미지를 빌드합니다:
docker build -t nextjs-app .
Docker 컨테이너를 실행합니다:
docker run -p 3000:3000 nextjs-app
브라우저에서 http://localhost:3000으로 애플리케이션에 접속합니다.
익스플로잇 방법은 Next.js 버전에 따라 약간씩 다릅니다:
이 버전에서는 미들웨어 파일의 이름이 _middleware.ts여야 하며 pages 폴더 안에 위치해야 했습니다. middlewareInfo.name의 값은 디렉토리 이름과 파일 이름으로 구성되었습니다:
x-middleware-subrequest: pages/_middleware
중첩된 라우트의 경우 여러 수준에 여러 미들웨어 파일이 있을 수 있으므로 헤더에 여러 가능한 값이 생깁니다:
x-middleware-subrequest: pages/dashboard/_middleware
또는
x-middleware-subrequest: pages/dashboard/panel/_middleware
버전 12.2부터 Next.js는 미들웨어 규칙을 변경했습니다. 파일 이름은 middleware.ts(밑줄 없음)여야 하며 더 이상 pages 폴더에 위치하지 않습니다. 이 버전의 경우 페이로드는 더 간단합니다:
x-middleware-subrequest: middleware
또한 Next.js는 /src 디렉토리를 사용하는 대체 프로젝트 구조를 허용합니다. 이러한 경우 페이로드는 다음과 같습니다:
x-middleware-subrequest: src/middleware
버전 13.2.0 이상에서는 Next.js가 미들웨어 실행에 최대 재귀 깊이를 도입했습니다. 이는 무한 루프를 방지하기 위해 구현되었지만 취약점에는 영향을 미치지 않습니다. 헤더 검사가 재귀 깊이 검사보다 먼저 발생하므로 익스플로잇은 동일하게 유지됩니다.
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
또는 /src 디렉토리 구조를 사용하는 프로젝트의 경우:
x-middleware-subrequest: src/middleware:src/middleware:src/middleware:sr
=======
# cve-2025-29927
>>>>>>> 56c7b2dcd548caf771750519107bf7c57749a864