Skip to content

⚪ [risk] L26 · 워크스페이스 경로 이탈 검사 realpath 미적용 + 구분자 하드코딩 #528

Description

@hojinzs

#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 양쪽에 동일 규칙 적용(검사 로직 공통화 권장).

완료 조건

  • 경로 이탈 검사를 path.relative 기반으로 교체(구분자 하드코딩 제거)
  • realpath 기반 symlink 이탈 검사 추가 — safety.ts·identity.ts 양쪽
  • TC 작성·통과: .. 이탈 거부 / symlink 이탈 거부 / Windows 스타일 구분자 통과 / 정상 경로 회귀

규칙 문서(WORKFLOW.md · CONTRIBUTING.md) 준수, changeset 필수.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

changeset:patchRequires a patch changeset for CLI package releaserisk-audit2026-07-06 리스크 감사 후속 항목securitySecurity / vulnerability disclosure

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions