@vitest/browser: 브라우저 모드 공급자 명령은 파일 액세스 권한 게이트를 우회합니다.
브라우저 모드는 테스트 실행기의 Node.js 측에서 실행되고 로컬 파일 시스템(스크린샷 찍기, Playwright 추적 관리, <input type="file">에 대한 파일 업로드, 스크린샷 비교)을 다룰 수 있는 내장된 "명령" 세트를 노출합니다.
이러한 명령 중 일부는 브라우저에서 파일 경로를 수락하고 'allowWrite' 권한 게이트를 확인하지 않고 경로를 프로젝트 디렉터리로 제한하지 않고 해당 작업을 수행합니다. 따라서 브라우저 모드 API에 접근할 수 있는 클라이언트는 allowWrite가 false인 경우에도 Vitest 프로세스가 액세스할 수 있는 모든 곳에서 파일을 읽고, 생성하고, 덮어쓰거나 삭제할 수 있습니다.
이는 브라우저 모드 API가 네트워크에 노출될 때 가장 중요합니다(예: test.api.host가 설정되거나 개발 서버가 다른 시스템이나 원본에서 연결될 수 있음). 해당 구성에서 allowWrite는 파일 액세스를 차단하기 위해 기본적으로 false로 설정되며 이러한 명령은 해당 보호를 우회합니다. 신뢰할 수 있는 테스트 코드가 포함된 기본 로컬 호스트 전용 설정에서는 이를 악용할 수 있는 신뢰할 수 없는 당사자가 없습니다. 신뢰할 수 없는 테스트 코드를 포함하기 위해 allowWrite: false를 사용하는 경우에는 이러한 명령이 해당 플래그를 무시하기 때문에 차이가 여전히 중요합니다.
| 명령 | 운영 | 영향 |
|---|---|---|
업로드(극작가 + WebdriverIO) | 읽기 | 임의의 로컬 파일 읽기; 콘텐츠가 페이지에 로드되고 테스트 코드로 읽을 수 있습니다. 가장 영향력이 큰 사례. |
takeScreenshot(극작가 + WebdriverIO) | 쓰기 | 상위 디렉터리를 생성하여 임의의 경로(절대 경로가 그대로 사용됨)에 PNG를 작성합니다. |
screenshotMatcher | 쓰기 | 참조/차이점 PNG를 작성합니다. 클라이언트 경로에서 파생된 디렉터리는 부분 순회를 허용합니다. |
stopChunkTrace | 쓰기 | 추적 이름에서 ../를 통해 탈출 가능한 경로에 Playwright 추적 .zip을 씁니다. |
deleteTracing | 삭제 | 경로별로 임의의 파일을 삭제합니다. |
주석 추적 | 읽기(공개) | 보고자가 첨부 파일 디렉터리에 복사하는 클라이언트 제어 첨부 파일 경로를 기록하여 파일 내용을 공개합니다. |
쓰기를 하면 공격자가 파일 내용을 선택할 수 없으므로(PNG 이미지 또는 추적 아카이브 생성) 무결성에 미치는 영향은 선택한 페이로드를 작성하는 대신 임의의 경로에서 파일을 생성, 덮어쓰기 또는 삭제하는 것입니다. 읽기(upload, annotateTraces)는 임의 파일의 전체 내용을 노출하므로 더 심각합니다.
수정 사항은 모든 파일 관련 공급자 명령에 쓰기/삭제 작업에 대한 allowWrite 검사와 프로젝트 루트에 대한 경로 제한(기존 fs 명령 패턴과 일치)을 추가하므로 클라이언트가 제공하는 절대 경로와 ../ 순회가 거부됩니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 94.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 94.00 |
VPI 공식 vpi-v1 기준