Skip to content

[P1] clean의 .dpt/runs 심볼릭 링크를 통한 관리 루트 외부 삭제 방지 #17

Description

@leehyowon14

요약

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.txtkeep-dir 전체가 삭제됩니다.

기대 동작

실제 파일시스템 경로 기준으로 .dpt/cache.dpt/runs 내부임이 보장된 항목만 삭제해야 합니다. 관리 경로 구성 요소가 링크면 안전하게 거부해야 하며 삭제 직전에도 경계를 재검증해야 합니다.

완료 조건

  • .dpt/runs 자체가 심볼릭 링크이면 삭제를 거부한다.
  • 상대·절대 링크 모두 외부 파일을 삭제하지 못한다.
  • 단순 Lstat 확인 이후 교체되는 TOCTOU도 방어한다.
  • 정상 .dpt/runs/<run> 정리는 유지한다.
  • 외부 파일과 중첩 디렉터리가 보존되는 회귀 테스트를 추가한다.
  • go test ./..., go vet ./..., 관련 race 테스트가 통과한다.

관련 코드

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions