Claude Code hook, 오류 시 fail open
Correction to my hook post from last week: it fails open. The fix, and 3 more ways a hook lets rm -rf through.
·2026.10.05 02:25
핵심 내용
Claude Code PreToolUse hook이 오류 시 fail open되어 위험한 명령을 차단하지 못한다.
자세히 보기
공유된 PreToolUse hook 구현에 대한 수정 사항으로, 기존 방식이 오류 발생 시 fail open 상태로 작동함을 확인했다. exit code 2가 아닌 모든 코드(Python 크래시로 인한 1, 의존성 누락으로 인한 127 등)는 비차단 오류로 간주되어 명령이 일반 권한 흐름을 통해 실행된다.
보안 영향
사용자 대신 분류기가 작업을 승인하는 auto mode에서 이 동작은 치명적이다. 다음 상황에서 hook이 실패하면 안전 장치가 우회되어 rm -rf 같은 명령이 개입 없이 실행된다.
- 입력 파싱 불가 (Python 크래시 유발)
- 타임아웃 (기본 10분)
- 의존성 누락 (예:
jq미설치,python3가 PATH에 없음) - 잘못된 exit code (예:
sys.exit("Refused")는 exit 1로 종료)
권장 수정 사항
보안 강화를 위해 hook은 fail closed 방식으로 작동해야 한다. 수정된 버전은 try/except 블록을 사용해 모든 오류에서 exit code 2를 강제한다.
!/usr/bin/env python3
import json, re, sys
try:
command = json.load(sys.stdin).get("tool_input", {}).get("command", "")
if re.search(r"\brm\s+-[a-zA-Z]*[rR]", command):
print("Recursive rm is blocked. Do not try another way; ask the user to run it.", file=sys.stderr)
sys.exit(2)
except Exception as error:
print(f"Guard failed ({type(error).__name__}), refusing.", file=sys.stderr)
sys.exit(2)
개발자는 잘못된 JSON 입력 파이프 등 실패 케이스를 테스트해 hook이 2를 반환하는지 확인해야 한다. 고장난 hook은 수정 전까지 모든 Bash 호출을 거부한다는 트레이드오프를 수용해야 한다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.