콘텐츠로 이동

01-개념

01. 개념 — 권한은 “셸 확장 후”에서 검사해야 한다

섹션 제목: “01. 개념 — 권한은 “셸 확장 후”에서 검사해야 한다”

Claude Code의 권한 시스템은 두 층이다.

  1. 정적 정책settings.jsonallowedTools, permissions.defaultMode, hook 차단 규칙.
  2. 런타임 승인 — 모델이 도구를 호출할 때마다 사용자에게 묻는 (또는 묻지 않는) 흐름.

이 두 층 사이에 가장 위험한 틈이 있다 — 셸 확장(Shell expansion) 이다. Mike Wolak의 사례는 산업 패턴을 정확히 보여준다.

“The permission system passed the command — but the shell then expanded ~ into the literal home path, and the command annihilated the entire project plus years of files.”
의역: “권한 시스템은 명령을 통과시켰다. 그러나 셸이 ~를 실제 홈 경로로 확장하면서 프로젝트와 수년치 파일이 함께 사라졌다.”
Mike Wolak: Claude Code’s rm -rf ~/ Wiped a Home Directory, byteiota.com

교훈은 단순하다. 검증은 원본 문자열이 아니라 셸 확장 이후의 결과에 걸어야 한다. 그리고 rm -rf /, rm -rf ~, rm -rf $HOME 같은 패턴은 어떤 프로젝트에서도 hook으로 하드 차단해야 한다.

코딩 어시스턴트라고 해서 모든 도구가 필요한 것은 아니다. 보통 다음 정도면 충분하다:

  • 항상 허용: Read, Grep, Glob, Edit, Write, Bash(git status), Bash(git diff *), Bash(npm test*), Bash(pnpm *).
  • 확인 후 허용: Bash(git commit *), Bash(git push *), 새 dependency 설치.
  • 하드 차단: Bash(rm -rf *), Bash(curl * | sh), Bash(*--force*), secrets 디렉토리 쓰기.