Summary
storage.ts의 getVersion, saveVersion, deleteVersion, getExperiment 등에서 versionId/experimentId를 path.join에 직접 사용하여 Path Traversal 가능.
Context
const filePath = join(VERSIONS_PATH, \${versionId}.json`)` 패턴으로 파일 경로 구성
../../etc/passwd 같은 값으로 디렉토리 탈출 가능
- 서버 API 라우트(
GET /api/prompts/versions/:id)에서 URL 파라미터가 직접 전달됨
- Tailscale 내부 네트워크이지만, 방어 계층 추가 필요
Proposed Changes
Notes
Summary
storage.ts의getVersion,saveVersion,deleteVersion,getExperiment등에서versionId/experimentId를path.join에 직접 사용하여 Path Traversal 가능.Context
const filePath = join(VERSIONS_PATH, \${versionId}.json`)` 패턴으로 파일 경로 구성../../etc/passwd같은 값으로 디렉토리 탈출 가능GET /api/prompts/versions/:id)에서 URL 파라미터가 직접 전달됨Proposed Changes
safePath(base, id)유틸 함수 추가:..,/,\포함 시 거부 + resolved path가 base 내에 있는지 검증getVersion,saveVersion,deleteVersion,getExperiment,createExperiment,completeExperiment에 적용Notes