피드로 돌아가기
path.join() Is Not Path Validation: A Next.js Traversal Walkthrough
Dev.toDev.to
Security

path.join() 맹신으로 인한 Path Traversal 취약점 해결 및 경로 검증 아키텍처 설계

path.join() Is Not Path Validation: A Next.js Traversal Walkthrough

Oopssec Store2026년 6월 3일5intermediate

Context

Next.js API 환경에서 사용자 입력값을 단순 path.join()으로 결합하여 파일을 제공하는 구조 설계. path.join()을 샌드박스로 오인하여 상위 디렉토리 접근을 차단하지 못한 설계 결함 발생.

Technical Solution

  • path.resolve() 도입을 통한 상대 경로의 절대 경로화 및 .. 세그먼트 완전 제거
  • baseDir와 최종 filePath의 일치 여부를 확인하는 경로 일치성 검증 로직 구현
  • startsWith(baseDir + sep) 조건 적용으로 유사 경로(Sibling Directory) 접근 가능성을 원천 차단
  • 파일 시스템 접근 전 경로 유효성을 먼저 판단하는 'Reject First, Read After' 전략 채택
  • 클라이언트 입력값에서 경로 구분자 및 특수 문자를 사전 필터링하는 입력값 검증 계층 추가
  • Least Privilege 원칙에 기반하여 프로세스 실행 권한을 최소 파일 읽기 권한으로 제한

1. 외부 입력값이 파일 경로에 포함될 경우 `path.resolve()`로 경로 정규화 수행

2. 정규화된 경로가 허용된 Base Directory 내에 존재하는지 `startsWith`로 검증

3. 경로 구분자(`/`, `\`) 및 `..` 포함 여부를 API 진입점에서 사전 차단

4. 파일 식별자를 직접 받는 대신 내부 매핑 테이블(Allowlist)을 통한 간접 참조 방식 검토

5. 애플리케이션 실행 계정의 OS 레벨 파일 접근 권한 최소화

원문 읽기