
Claude Code Auto Mode의 안전 설계 — 샌드박스만으로는 부족한 이유와 hook을 통한 다층 방어
요약
Anthropic의 Claude Code Auto Mode가 가진 안전 분류기의 한계와 이를 보완하기 위한 다층 방어 전략을 분석합니다. 분류기의 오탐 문제와 인프라 장애 시 발생하는 승인 피로를 해결하기 위해 hook을 활용한 설계 방안을 제시합니다.
핵심 포인트
- Auto Mode의 안전 분류기는 약 17%의 미탐률을 보임
- 명령어 복잡성으로 인한 오탐 및 인프라 장애 시 승인 피로 발생
- hook을 활용한 다층 방어(Defense-in-Depth) 설계의 필요성
Anthropic이 Auto Mode의 안전 설계에 관한 공식 기사를 공개했다.
핵심 데이터: 사용자는 확인 프롬프트의 93%를 승인하고 있다. 즉, 대다수의 프롬프트는 불필요하며 승인 피로(approval fatigue)를 유발하고 있다. Auto Mode는 이를 안전 분류기(Safety Classifier, Sonnet 4.6 기반)로 자동화한다.
하지만 "Auto Mode를 활성화하면 안전하다"라는 이해는 위험하다. 공식 기사 자체에서도 "신중한 인간의 검토(careful human review)를 대체할 수 없다"라고 명시하고 있다. 분류기에는 두 가지 약점이 있다.
오탐(false positive): 안전한 명령어를 "확인 필요"로 판정한다. $()를 포함하는 명령어, 파이프 체인(pipe chain), 복합 명령어가 빈번하게 걸린다 -
분류기 장애: Sonnet의 인프라가 다운되면, 모든 명령어가 "확인 필요" 상태가 된다. cat도 ls도 수동 승인이 필요해진다
GitHub Issue #38537(리액션 61개), #30435(리액션 33개), #39259, #38618. 모두 Auto Mode의 분류기로 인해 발생하는 문제에 대한 보고다.
hook을 사용하면 두 가지 문제 모두에 대처할 수 있다.
먼저, Auto Mode가 무엇을 하고 있는지 정리하자.
통상 모드(비-Auto)에서는 Claude Code가 명령어를 실행하기 전에 매번 사용자에게 허가를 구한다. Auto Mode를 활성화하면 안전 분류기가 중간에 개입한다.
[통상 모드]
Claude Code → 사용자에게 확인 → 실행
[Auto Mode]
...
분류기는 읽기 전용 명령어(ls, cat, grep 등)를 자동으로 허가하고, 파괴적인 명령어(rm, git push 등)를 차단한다. 이론상으로는 합리적인 설계다.
하지만 "이론상"과 "실제"는 다르다. 공식 기사의 데이터에 따르면, 분류기의 미탐률(false negative rate, 위험한 조작을 놓치는 비율)은 **17%**이다. 5번 중 1번은 놓친다.
Issue #38537의 보고. $(date +%Y%m%d)와 같은 명령어 치환(command substitution)을 포함하는 명령어가 "확인 필요"로 분류된다.
# 이들이 멈춤
mkdir backup-$(date +%Y%m%d) # 명령어 치환
cat file.txt | grep "pattern" # 파이프 체인
...
mkdir도 cat | grep도 cd && ls도 파괴적이지 않다. 하지만 분류기는 명령어의 구조적 복잡성을 "위험 신호"로 해석한다.
결과적으로 Auto Mode를 사용하고 있음에도 빈번하게 확인 다이얼로그가 나타난다. 자율 가동(autonomous operation) 중인 경우, 여기서 멈추게 된다.
Issue #39259, #38618의 보고. 안전 분류기의 인프라(Sonnet)가 장애를 일으키면 분류 결과가 반환되지 않는다.
이때 Claude Code는 페일 세이프(fail-safe)로서 모든 명령어를 "확인 필요"로 격하시킨다. cat README.md조차 수동 승인이 필요해진다.
자율 가동 중에 이런 일이 발생하면 완전히 멈춘다. 자고 일어났더니 "승인 대기" 상태 때문에 밤새 아무것도 하지 못했다는 상황이 벌어진다.
보안 세계에서는 "다층 방어(Defense-in-Depth)"가 기본 원칙이다. 하나의 방벽에 의존하지 않고, 여러 층으로 보호하는 것이다.
Auto Mode의 분류기는 하나의 층이다. hook을 또 다른 하나의 층으로 추가한다.
[다층 방어 모델]
Claude Code → hook(PreToolUse) → 안전 분류기(Sonnet) → 실행
↓ exit 2: 차단 ↓ 확인 필요: 사용자에게 확인
...
hook에는 두 가지 역할이 있다.
PreToolUse hook (auto-mode-safe-commands): 분류기의 오탐(false positive)을 보정한다. 안전한 명령어를 자동 허가한다 -
PermissionRequest hook (classifier-fallback-allow): 분류기가 다운되었을 때, 읽기 전용 명령어만 자동 승인한다
분류기가 "확인 필요"라고 오판하는 명령어를 hook으로 자동 허가한다.
#!/bin/bash
# auto-mode-safe-commands.sh — Fix Auto Mode false positives on safe commands
INPUT=$(cat)
...
포인트는 마지막의 exit 0이다.
다. 패턴에 일치하지 않으면 아무것도 출력하지 않는다. 분류기(Classifier)의 판단을 덮어쓰지 않는다. 안전하다고 확신할 수 있는 명령만 자동으로 허용한다. 모든 패턴은 cc-safe-setup의 examples/auto-mode-safe-commands.sh에서 확인할 수 있다.
settings.json에 등록:
{
"hooks": {
"PreToolUse": [{
...
분류기가 다운되었을 때를 위한 폴백(Fallback). PermissionRequest 훅으로 설정한다.
PreToolUse와 PermissionRequest의 차이를 이해할 필요가 있다.
PreToolUse: 명령 실행 전에 매번 호출된다. allow를 반환하면 사용자 확인을 스킵한다.
PermissionRequest: 사용자에게 확인 다이얼로그가 표시되기 직전에 호출된다. allow를 반환하면 다이얼로그를 스킵한다.
분류기가 정상이라면, 안전한 명령은 PermissionRequest까지 도달하지 않는다 (분류기가 자동으로 허용하기 때문). 분류기가 다운되었을 때만 모든 명령이 PermissionRequest에 도달한다. 이때 classifier-fallback-allow가 안전한 명령을 자동 승인한다.
#!/bin/bash
# classifier-fallback-allow.sh — Allow read-only commands when classifier is down
INPUT=$(cat)
...
settings.json에 등록 (PreToolUse가 아니라 PermissionRequest로):
{
"hooks": {
"PermissionRequest": [{
...
정리하면 다음과 같다.
| 상태 | auto-mode-safe-commands (PreToolUse) | classifier-fallback-allow (PermissionRequest) |
|---|---|---|
| 분류기가 정상 + 안전 명령 | 훅이 allow → 실행 | 도달하지 않음 (분류기가 먼저 허용) |
| ... |
중요한 것은, 위험한 명령은 아무도 자동으로 허용하지 않는다는 점이다. rm, git push --force, DROP TABLE은 어떤 계층에서도 통과되지 않고 반드시 사용자 확인 단계로 넘어간다.
auto-mode-safe-commands와 classifier-fallback-allow는 "안전한 명령을 막지 않기" 위한 훅이다. 반대 방향——"위험한 명령을 확실히 막기"——를 위해서는 destructive-guard와 branch-guard가 필요하다.
{
"hooks": {
"PreToolUse": [
...
Technical Note (CC 보충): 훅(hook) 배열은 위에서부터 순서대로 실행된다. destructive-guard를 가장 먼저 배치함으로써, 위험한 명령은 auto-mode-safe-commands에 도달하기 전에 차단된다. 설령 auto-mode-safe-commands의 정규 표현식에 누락이 있더라도, destructive-guard가 먼저 막아준다. 이것이 심층 방어 (Defense-in-Depth)의 의미다.
최종적인 방어 계층은 다음과 같다.
Layer 1: destructive-guard (PreToolUse)
→ rm -rf, git reset --hard 등을 기계적으로 차단
Layer 2: branch-guard (PreToolUse)
...
하나의 계층이 뚫리더라도 다음 계층이 보호한다. 분류기가 다운되어도 훅이 작동한다. 훅에 누락이 있더라도 사용자 확인이 있다.
npx cc-safe-setup을 통해 Layer 1, 2의 주요 훅을 설치할 수 있다. Layer 3, 5는 examples/ 디렉토리에서 추가할 수 있다.
npx cc-safe-setup
Auto Mode의 분류기는 편리하지만 단일 장애점 (Single Point of Failure)이 될 수 있다. 오탐 (False Positive, #38537, 61개 반응)과 분류기 장애 (#39259, #38618)라는 두 가지 약점이 있다. 훅을 통해 다층 방어를 구축하면 두 문제 모두 해결할 수 있다. "샌드박스가 있으니까 안전하다"는 식은 안 된다. 여러 계층으로 보호하라.
Auto Mode를 사용하며 겪었던 어려움이 있다면 댓글로 알려주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기