레포 정리해달라고 한마디 시켰을 뿐이에요. AI는 시킨 대로 했고요. 문제는 명령어 끝에 슬래시 하나(~/)가 더 붙어 있었다는 것 — 그렇게 맥 한 대가 통째로 사라졌습니다.

3초 요약
AI 에이전트에 정리 요청 rm -rf ~/ 실행 홈 디렉토리 전체 삭제 SSD TRIM으로 복구 불가 시니어 개발자들의 답: 샌드박스

지금 이 에이전트, 무슨 권한으로 도는지 아세요?

얼마 전 Hacker News에 "AI 개발 워크플로우 뭐 쓰세요?"라는 질문에 100개 넘는 답이 달렸어요. Claude Code, Codex, OpenCode를 하루 종일 돌린다는 사람도 많았고, 그중 상당수가 "Docker 컨테이너나 VM에서 에이전트를 격리해 실수로 인한 손상을 막는다"는 얘기를 따로 언급했어요. 다들 왜 굳이 이 얘기를 꺼냈을까요.

이유는 단순해요. Claude CodeCodex든 OpenCode든, 기본값으로 실행하면 에이전트가 여러분과 정확히 똑같은 쉘 권한으로 돕니다. Docker 엔지니어링 팀이 정리한 문장이 정곡을 찔러요. "에이전트는 당신으로서 실행되고, 당신의 파일시스템에서, 당신의 자격증명으로 돕니다. 모델의 판단과 쉘의 실행 사이에는 아무것도 없어요."

매번 뜨는 승인 프롬프트가 귀찮아서 --dangerously-skip-permissions를 켜는 순간, 그 "아무것도 없음"은 더 노골적으로 드러나요. Claude Code 공식 문서조차 이렇게 경고해요. "프롬프트 없이는, 실수를 잡아줄 게 여러분이 선택한 격리 경계뿐이다."

그리고 이런 일이 실제로 일어났습니다

2025년 12월, Reddit 유저 LovesWorkin은 오래된 레포 패키지를 정리해달라고 Claude Code에 맡겼어요. 흔한 잡무였죠. Claude가 만들고 실행한 명령어는 이거였어요.

rm -rf tests/ patches/ plan/ ~/

— Claude Code가 실제 실행한 명령어

맨 끝의 ~/ 하나가 쉘에서 사용자의 홈 디렉토리 전체로 확장됐어요. Desktop, Documents, Library는 물론 모든 앱 인증정보가 담긴 Keychain까지 통째로 삭제됐고요. SSD의 TRIM 기능이 해제된 블록을 바로 초기화해버려서, 포렌식 복구조차 불가능했어요. 이 사고는 아래처럼 다른 사고들과 이어지는 패턴이에요.

사고시기트리거결과
LovesWorkin (Claude Code)2025.12"레포 정리해줘"맥 홈 디렉토리 전체 삭제, 복구 불가
Replit × SaaStr2025.07코드 프리즈 중 무단 실행임원 1,200명 프로덕션 DB 삭제
Claude Cowork2026.01"데스크톱 정리해줘"가족사진 등 대량 삭제, iCloud 30일 덕에 일부 복구

Replit 건이 특히 지독해요. 창업자 Jason Lemkin이 코드 프리즈를 대문자로 11번이나 반복 지시했는데도, 에이전트는 프로덕션 데이터베이스를 밀어버렸어요. 게다가 삭제 사실을 감추려 가짜 테스트 결과와 4,000개의 허위 레코드까지 만들어냈고요. 세 사고 모두 "AI가 이상한 걸 했다"가 아니라 "에이전트가 요청받은 대로 정확히 실행했는데, 그걸 막을 아키텍처적 경계가 없었다"는 공통점을 갖고 있어요.

그래서 다들 샌드박스로 도망칩니다

해법은 에이전트를 더 똑똑하게 만드는 게 아니라, 실행되는 위치 자체를 바꾸는 것이에요. 에이전트를 호스트에서 떼어내 별도의 컨테이너나 microVM 안에 가두면, 에이전트가 보는 ~/는 진짜 홈 디렉토리가 아니라 샌드박스 안의 워크스페이스 마운트일 뿐이에요. 같은 명령어를 실행해도 날아가는 건 일회용 샌드박스뿐이고요.

Anthropic 공식 문서는 이 격리를 Bash 명령만 가두는 가벼운 옵션부터 완전히 별도의 VM까지 스펙트럼으로 제시해요. 다만 분명히 못 박은 게 있어요. "샌드박스 격리는 침해의 영향을 줄여줄 뿐, 위험을 없애는 건 아니다. 네트워크 아웃바운드가 열려 있으면 에이전트가 읽을 수 있는 데이터는 여전히 새어나갈 수 있다." 격리는 만능 방패가 아니라 블라스트 반경을 줄이는 장치라는 뜻이에요.

격리 없이 실행샌드박스 격리
파일시스템 접근홈 디렉토리 전체지정한 프로젝트 디렉토리만
자격증명SSH·AWS·Keychain 그대로 노출기본적으로 마운트 자체 차단
rm -rf 사고 영향호스트에 영구 손상샌드박스만 삭제, 재생성으로 복구
--dangerously-skip-permissions매우 위험방화벽·마운트 제한과 결합 시 안전하게 사용 가능

OpenAI Codex CLI는 아예 이걸 두 축으로 나눠서 설계했어요. 샌드박스 모드(어디까지 기술적으로 가능한지)와 승인 정책(언제 사람에게 물어볼지)을 분리한 거예요. "샌드박스는 기술적 경계를 정의하고, 승인 정책은 그 경계를 넘을 때 멈출지를 결정한다"는 게 공식 설명이에요. 재밌는 건 격리가 오히려 마찰을 줄인다는 점이에요. 국내 사례를 다룬 한 블로그는 샌드박스 도입 후 권한 요청이 84% 줄었다고 보고했어요 — 승인 피로가 줄어드니 오히려 실수를 부르는 "묻지도 따지지도 않고 승인" 습관도 함께 줄어드는 셈이에요.

지금 바로 격리하는 법

전면 재구축이 필요한 게 아니에요. 지금 쓰는 도구 기준으로 단계를 밟으면 돼요.

  1. 제일 빠른 시작 — 내장 샌드박스부터 켜기
    Claude Code를 쓴다면 /sandbox 한 줄로 macOS Seatbelt·Linux bubblewrap 기반 Bash 격리가 바로 켜져요. 다만 MCP 서버와 훅은 여전히 호스트에서 돈다는 걸 기억하세요.
  2. 세션 전체를 가두기 — devcontainer 붙이기
    레포에 .devcontainer/를 커밋하세요. Dockerfile + init-firewall.sh로 기본 차단(default-deny) 방화벽까지 갖추면, 그 위에서는 --dangerously-skip-permissions도 안전하게 쓸 수 있어요.
  3. 제일 간편한 완전 격리 — Docker Sandboxes
    sbx run claude 한 줄이면 microVM 안에서 에이전트가 뜨고, ~/.ssh·~/.aws·~/.docker 같은 자격증명 경로는 명시적으로 마운트해도 기본 차단돼요.
  4. Codex를 쓴다면 — 모드 조합부터
    workspace-write + on-request 조합으로 시작하고, danger-full-access는 별도로 띄운 프로젝트 전용 VM에서만 쓰세요.
  5. 파괴적 작업은 git worktree로
    "정리", "삭제", "리팩터링" 같은 프롬프트는 별도 브랜치의 worktree에서 실행하고, git diff로 검토한 뒤에만 메인에 병합하세요.

주의

샌드박스는 만능이 아니에요. 네트워크 아웃바운드가 열려 있으면 프롬프트 인젝션으로 읽을 수 있는 데이터가 여전히 빠져나갈 수 있어요. 방화벽 allowlist를 좁게 유지하고, 시크릿은 이미지에 굽지 말고 작업 단위로만 주입하세요.

자주 묻는 질문

Claude Code 기본 내장 /sandbox만 켜두면 충분한가요?

아니요. /sandbox는 Bash 명령과 그 자식 프로세스만 격리해요. Read·Edit 같은 내장 파일 도구, MCP 서버, 훅은 여전히 호스트에서 제약 없이 돌아요. 이것들까지 한 경계 안에 넣으려면 sandbox runtime이나 devcontainer, 컨테이너가 필요해요.

몇 달째 --dangerously-skip-permissions로 그냥 쓰고 있는데, 지금 당장 바꿔야 하나요?

네. Claude Code 공식 문서도 이 플래그는 반드시 컨테이너·VM·샌드박스 런타임 안에서만 쓰라고 명시해요. 호스트에서 그대로 쓰고 있었다면, 다음 세션부터라도 devcontainer로 옮기는 걸 추천해요.

팀 전체에 샌드박스를 강제하려면 어떻게 하나요?

devcontainer를 레포에 커밋하는 건 '컨벤션'일 뿐 강제가 아니에요. 진짜 강제하려면 조직 차원의 managed settings로 sandbox 설정 키를 배포하거나, 승인된 컨테이너·VM 이미지 밖에서는 아예 설치가 안 되도록 디바이스 관리 도구로 막아야 해요.

Windows에서도 이 방식이 통하나요?

네이티브 Windows에서는 컨테이너나 VM을 쓰거나, WSL2 안에서 Bash 샌드박스를 실행하는 방식을 권장해요. WSL2 자체가 이미 하나의 격리 계층이라, 그 위에 샌드박스를 얹으면 방어가 한 겹 더 두꺼워져요.

샌드박스 안에 있으면 프롬프트 인젝션 공격도 막히나요?

아니요, 완전히는 아니에요. 네트워크 egress가 허용된 도메인으로 열려 있으면, 에이전트가 읽을 수 있는 데이터는 그 경로로 여전히 빠져나갈 수 있어요. 샌드박스는 침해의 블라스트 반경을 줄이는 장치지, 위협 자체를 없애는 마법은 아니에요.