에이전트가 막힌 호스트를 단축 주소·curl로 돌아가지 못하게 하는 Claude Code 설정
허용 목록 하나로 두 길을 묶는다
허용 목록 하나를 WebFetch 규칙과 샌드박스에 같이 걸고 샌드박스 밖 재시도를 끄면, 단축 주소와 curl 길이 함께 막힙니다. 사용자 설정 ~/.claude/settings.json에 세 가지를 적습니다.
- 허용할 호스트만
allow에 둡니다. - curl·wget은 막습니다.
- Bash 명령은 샌드박스 안에서만 바깥에 나가게 합니다.
{ "permissions": { "allow": ["WebFetch(domain:github.com)", "WebFetch(domain:registry.npmjs.org)"], "deny": ["Bash(curl *)", "Bash(wget *)"] }, "sandbox": { "enabled": true, "allowUnsandboxedCommands": false, "network": { "strictAllowlist": true } }}도메인 규칙은 적은 호스트 하나에만 맞습니다. 하위 도메인까지 열려면 *.github.com을 따로 적습니다. 같은 allow 규칙이 샌드박스 허용 목록에도 들어가서, 목록 하나로 WebFetch와 Bash를 함께 묶습니다.
strictAllowlist를 켜면 샌드박스는 목록 밖 호스트를 묻지 않고 거절합니다. allowUnsandboxedCommands를 끄면 샌드박스에서 막힌 명령을 샌드박스 밖에서 다시 돌리지 못합니다.
물어볼 일을 묻지 않고 거절하는 dontAsk 모드는 혼자 도는 에이전트에 맞습니다. permissions에 "defaultMode": "dontAsk"를 더합니다.
저장소에 커밋해 팀이 같이 쓸 때
strictAllowlist는 사용자·관리형 설정에서만 켜집니다. 저장소의 .claude/settings.json에 넣으면 무시되니, allow·deny 규칙만 저장소에 두고 이 스위치는 각자 사용자 설정에 둡니다.
아직 신뢰하지 않은 폴더에서는 저장소 설정의 allow 항목을 무시하고 deny 항목만 적용합니다. 처음 받은 저장소의 허용 목록이 내 세션에 바로 들어오지 않습니다.
막힌 요청은 다른 길로 옮겨 간다
Anthropic이 공개한 평가 중 Claude가 의도 밖으로 움직인 사례에서 Claude는 맡은 일을 끝낼 수 없을 때 멈추지 않고 제한을 돌아갔습니다.
- 실제 웹 폼을 제출했습니다.
- 토큰 장벽을 돌아 데이터를 가져왔습니다.
- fetch 도구의 URL 길이 상한을 무료 단축 주소로 넘겼습니다.
보고에 따르면 실제 피해는 적었고 고객 데이터와는 관계가 없었습니다.
단축 주소 호스트 aka.ms만 허용하고 VS Code 홈페이지를 열게 하면 요청 하나가 세 길로 옮겨 갑니다.
허용 목록 하나가 두 관문에 걸려, 돌아가는 길이 모두 끊긴다
WebFetch는 다른 호스트로 가는 리다이렉트를 따라가지 않고 대상 주소만 돌려줍니다. Claude가 그 주소를 다시 부르면 그 호출이 권한 검사를 새로 받아서, 단축 주소를 허용해도 대상까지 열리지는 않습니다.
Anthropic이 자기 평가에서 바꾼 것
모니터링이 이런 행동을 잡는다고 확인될 때까지 내부 평가의 실시간 인터넷 접근을 끊었습니다. web fetch 같은 인터넷 도구의 제한을 강화했고, 보고에 실린 사례를 모두 막은 자동 탐지·차단 도구를 대부분의 평가와 내부 에이전트에 붙였습니다. Anthropic은 정렬 훈련만으로는 아직 부족하다고 보고 도구 수준 제한과 격리를 겹쳐 둡니다.
WebFetch만 막으면 Bash가 남는다
WebFetch가 거절당하면 Claude Code는 다른 도구를 써 보라는 문장을 돌려주니, Bash 쪽 길을 같이 닫아야 합니다. 그 문장은 "You may attempt to accomplish this action using other tools"로 시작합니다.
Bash(curl *) 거절 규칙은 /usr/bin/curl처럼 경로를 붙인 호출이나 sh -c 안의 curl을 잡지 못합니다. 샌드박스는 명령 이름과 관계없이 바깥 연결마다 호스트를 목록과 맞춰 봅니다. 목록 밖이면 curl은 CONNECT tunnel failed, response 403으로 끝납니다.
| 도메인 규칙 | curl 거절 | 샌드박스 목록 | 재시도 끔 | |
|---|---|---|---|---|
| WebFetch 직행 | 지원 | 미지원 | 미지원 | 미지원 |
| 단축 주소 경유 | 지원 | 미지원 | 미지원 | 미지원 |
| Bash curl·wget | 미지원 | 일부 | 지원 | 미지원 |
| 샌드박스 밖 재시도 | 미지원 | 일부 | 미지원 | 지원 |