요약
dpt clean은 .dpt/runs가 디렉터리 심볼릭 링크인지 확인하지 않은 채 os.ReadDir로 열고, 발견한 항목을 문자열 기준 경로 검사 후 os.RemoveAll로 삭제합니다. .dpt/runs가 외부 디렉터리를 가리키면 외부의 직계 파일과 하위 디렉터리가 삭제됩니다.
- 검토 기준:
main@4e87765f95c106edb3c956cfad2abc1db64c0c39
- 판정: CONFIRMED
- 우선순위: P1
영향
사용자가 삭제를 확인하거나 --yes를 사용하면 DPT 관리 루트 밖의 데이터가 삭제될 수 있습니다. 링크 대상 루트 자체는 남지만 내부 항목은 제거됩니다.
발생 조건 및 확인 범위
.dpt/runs가 외부 디렉터리 심볼릭 링크일 것
- 심볼릭 링크가 보존되는 macOS/Linux 환경일 것
- 사용자가 삭제를 승인하거나
--yes를 사용할 것
--all이 아니면 대상 mtime이 --older-than 기준을 만족할 것
- 실행 사용자에게 삭제 권한이 있을 것
macOS에서 재현했습니다. Windows junction/reparse point는 확인하지 않았습니다. 확인 UI에는 경로가 아닌 개수만 표시됩니다.
재현 및 검증 방법
go build -o /tmp/dpt-clean-repro ./cmd/dpt
pack="$(mktemp -d /tmp/dpt-clean-pack.XXXXXX)"
victim="$(mktemp -d /tmp/dpt-clean-victim.XXXXXX)"
mkdir -p "$pack/.dpt" "$victim/keep-dir"
touch "$victim/keep-file.txt" "$victim/keep-dir/nested.txt"
ln -s "$victim" "$pack/.dpt/runs"
/tmp/dpt-clean-repro clean --pack "$pack" --all --yes
find "$victim" -maxdepth 2 -print
현재 명령은 exit 0이고 keep-file.txt와 keep-dir 전체가 삭제됩니다.
기대 동작
실제 파일시스템 경로 기준으로 .dpt/cache와 .dpt/runs 내부임이 보장된 항목만 삭제해야 합니다. 관리 경로 구성 요소가 링크면 안전하게 거부해야 하며 삭제 직전에도 경계를 재검증해야 합니다.
완료 조건
관련 코드
요약
dpt clean은.dpt/runs가 디렉터리 심볼릭 링크인지 확인하지 않은 채os.ReadDir로 열고, 발견한 항목을 문자열 기준 경로 검사 후os.RemoveAll로 삭제합니다..dpt/runs가 외부 디렉터리를 가리키면 외부의 직계 파일과 하위 디렉터리가 삭제됩니다.main@4e87765f95c106edb3c956cfad2abc1db64c0c39영향
사용자가 삭제를 확인하거나
--yes를 사용하면 DPT 관리 루트 밖의 데이터가 삭제될 수 있습니다. 링크 대상 루트 자체는 남지만 내부 항목은 제거됩니다.발생 조건 및 확인 범위
.dpt/runs가 외부 디렉터리 심볼릭 링크일 것--yes를 사용할 것--all이 아니면 대상 mtime이--older-than기준을 만족할 것macOS에서 재현했습니다. Windows junction/reparse point는 확인하지 않았습니다. 확인 UI에는 경로가 아닌 개수만 표시됩니다.
재현 및 검증 방법
현재 명령은 exit 0이고
keep-file.txt와keep-dir전체가 삭제됩니다.기대 동작
실제 파일시스템 경로 기준으로
.dpt/cache와.dpt/runs내부임이 보장된 항목만 삭제해야 합니다. 관리 경로 구성 요소가 링크면 안전하게 거부해야 하며 삭제 직전에도 경계를 재검증해야 합니다.완료 조건
.dpt/runs자체가 심볼릭 링크이면 삭제를 거부한다.Lstat확인 이후 교체되는 TOCTOU도 방어한다..dpt/runs/<run>정리는 유지한다.go test ./...,go vet ./..., 관련 race 테스트가 통과한다.관련 코드
FindArtifactsRemoveArtifactsrunClean