#453 분해(1/3). 출처: docs/2026-07-06-risk-audit-report.md L26. 부모 Epic: #454.
L26. 워크스페이스 경로 이탈 검사 / 하드코딩 · symlink 미인식 (⚪ Low · 보안 · confirmed)
- 파일:
packages/core/src/workspace/safety.ts:10, packages/core/src/workspace/identity.ts:74
두 곳 모두 경로 이탈 검사를 문자열 prefix 비교로만 수행한다.
// safety.ts:10
if (candidate !== normalizedRoot && !candidate.startsWith(`${normalizedRoot}/`)) { ... }
// identity.ts:74
if (!candidate.startsWith(`${normalizedRoot}/`)) { ... }
- 구분자
/ 하드코딩 — Windows(\)에서는 정상 경로도 이탈로 판정되어 워크스페이스 생성이 항상 실패한다(가용성 이슈).
- realpath 미적용 — 워크스페이스 루트 하위에 루트 밖을 가리키는 symlink가 있으면 검사를 통과한 뒤 실제 I/O는 루트 밖에서 일어난다.
해결
- prefix 비교를
path.relative 기반으로 교체 — rel !== "" && !rel.startsWith("..") && !isAbsolute(rel). 구분자 하드코딩 제거.
- symlink 해석 후 재검사 — 경로가 이미 존재하면
realpath, 아직 없으면 존재하는 최근접 상위 디렉터리의 realpath를 기준으로 판정.
safety.ts·identity.ts 양쪽에 동일 규칙 적용(검사 로직 공통화 권장).
완료 조건
규칙 문서(WORKFLOW.md · CONTRIBUTING.md) 준수, changeset 필수.
L26. 워크스페이스 경로 이탈 검사
/하드코딩 · symlink 미인식 (⚪ Low · 보안 · confirmed)packages/core/src/workspace/safety.ts:10,packages/core/src/workspace/identity.ts:74두 곳 모두 경로 이탈 검사를 문자열 prefix 비교로만 수행한다.
/하드코딩 — Windows(\)에서는 정상 경로도 이탈로 판정되어 워크스페이스 생성이 항상 실패한다(가용성 이슈).해결
path.relative기반으로 교체 —rel !== "" && !rel.startsWith("..") && !isAbsolute(rel). 구분자 하드코딩 제거.realpath, 아직 없으면 존재하는 최근접 상위 디렉터리의realpath를 기준으로 판정.safety.ts·identity.ts양쪽에 동일 규칙 적용(검사 로직 공통화 권장).완료 조건
path.relative기반으로 교체(구분자 하드코딩 제거)safety.ts·identity.ts양쪽..이탈 거부 / symlink 이탈 거부 / Windows 스타일 구분자 통과 / 정상 경로 회귀규칙 문서(WORKFLOW.md · CONTRIBUTING.md) 준수, changeset 필수.