오늘 아침 7시 반에 나온 클로드 코드 v2.1.259가, Bash 명령에 걸어 둔 `Read()` 거부 규칙이 파일을 옵션 값으로 넘긴 경우(`--ignore-revs-file=.env`·`-f.env`·`@file`)나 `git diff`·`git grep` 의 파일 인자, `cd DIR && cat FILE` 같은 복합 명령에는 걸리지 않던 문제를 고쳤어요 — 거부한 파일이 든 디렉토리를 `grep -r`·`cp -r` 로 훑는 것도 이제 물어봐요. 공개된 노트만 놓고 보면 같은 규칙을 다시 막은 게 이번이 세 번째예요: v2.1.251은 심링크로 도는 경로를, v2.1.257은 `< file` 리다이렉트와 `tac`·`egrep` 같은 읽기 명령을 막았거든요. 정작 같은 노트엔 `allowedMcpServers` 가 이제 사용자가 직접 추가한 서버만 관장하도록 바뀌어 그 목록으로 걸러 내던 `managed-mcp.json` 서버가 판올림하면 다시 로드된다고 적혀 있어요 — 막아 두려면 `deniedMcpServers` 로 옮겨야 하는데, 공식 관리자 문서는 아직 '허용·차단 목록은 관리 서버에도 적용된다'고 적어 두고 있어요.
- MCP
- Model Context Protocol. 에이전트를 외부 도구·데이터에 붙이는 표준 규약
- Read() 거부 규칙
- 설정 permissions.deny 에 적는 읽기 차단 규칙. 여기 걸린 파일은 묻지도 않고 막히지만, Bash 명령 안에서 그 파일을 읽는 모양까지 알아봐야 실제로 막힌다
- allowedMcpServers
- 회사가 관리 설정으로 내려보내는 MCP 서버 허용 목록. 목록에 없는 서버는 로드되지 않는다
- deniedMcpServers
- MCP 서버 차단 목록. 모든 설정 범위에서 합쳐지고, 허용 목록보다 우선해 무조건 막는다
- managed-mcp.json
- 관리자가 기계에 직접 배포하는 파일. 여기 적힌 MCP 서버만 로드되게 만든다
`Read()` 거부 규칙을 비밀 파일의 마지막 방어선으로 쓰고 있다면, 우회 경로가 세 번째로 나왔다는 것 자체를 신호로 보세요 — 정말 안 보여야 하는 파일은 작업 디렉토리 밖에 두고 거부 규칙은 실수 방지용으로만 쓰는 쪽이 맞아요. 사내 배포를 맡고 있다면 `allowedMcpServers` 로 걸러 내던 관리 MCP 서버가 있는지 먼저 확인해서, 팀이 올리기 전에 `deniedMcpServers` 로 옮겨 두세요.
- 앞선 두 판도 같은 거부 규칙을 고쳤어요 v2.1.257 노트엔 "Bash `Read()`/`Edit()` 거부 규칙이 `< file` 리다이렉트와 `tac`·`egrep` 같은 읽기 명령에 걸리지 않던 문제를 고쳤다"가 있고, v2.1.251은 권한 검사를 통과한 뒤 심링크가 바뀌는 경로를 막았어요. 같은 규칙이 세 판에 걸쳐 세 가지 다른 모양으로 새고 있었던 셈이에요. GitHub
- 공식 관리자 문서는 아직 반대로 적혀 있어요 MCP 접근 통제 문서는 지금도 "`allowedMcpServers` 와 `deniedMcpServers` 는 관리 서버에도 적용되므로, 이를 통과하지 못한 관리 서버는 로드되지 않는다"고 적어 두고 있어요. 이번에 새로 생긴 조직용 `managedMcpServers` 도 이 문서의 설정 요약 표에 아직 없고요. Claude Code Docs
- 8월에 고쳤다던 OAuth 캐시 무효화가 아직 남아 있었어요 v2.1.248이 "긴 세션에서 OAuth 토큰 갱신 뒤 도구 정의가 다시 만들어져 한 시간에 한 번꼴로 프롬프트 캐시가 날아가던" 문제를 고쳤다고 적었는데, 이번 v2.1.259에 "텔레메트리를 꺼 둔 세션에서 OAuth 토큰이 갱신될 때 프롬프트 캐시가 무효화되던 문제를 고쳤다"가 다시 들어왔어요. 앞선 수정이 그 경로까지는 덮지 못했던 거예요. GitHub