![Claude Code v2.1.221|zsh의 [[ ]]에서 권한 체크가 우회되던 문제 해결|매일 Changelog 해설 대표 이미지](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Farticle-ogp-background-afbab5eb44e0b055cce1258705637a91.png%3Fixlib%3Drb-4.1.1%26w%3D1200%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLXByb2ZpbGUtaW1hZ2VzLmltZ2l4Lm5ldC9odHRwcyUzQSUyRiUyRnFpaXRhLWltYWdlLXN0b3JlLnMzLmFwLW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20lMkYwJTJGMzk3NzM1NSUyRnByb2ZpbGUtaW1hZ2VzJTJGMTc4NDc5Mzc1Mj9peGxpYj1yYi00LjEuMSZhcj0xJTNBMSZmaXQ9Y3JvcCZtYXNrPWVsbGlwc2UmYmc9RkZGRkZGJmZtPXBuZzMyJnM9OGEzMmI1OTIxMTNjMWI4N2M5MGRjNWQ3Mjk0ZGFjYmM%26blend-x%3D120%26blend-y%3D467%26blend-w%3D82%26blend-h%3D82%26blend-mode%3Dnormal%26s%3De146b431fa4c0bef4392ccfb2bfdd6be?ixlib=rb-4.1.1&w=1200&fm=jpg&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjEuMSZ3PTk2MCZoPTMyNCZ0eHQ9Q2xhdWRlJTIwQ29kZSUyMHYyLjEuMjIxJUVGJUJEJTlDenNoJTIwJUUzJTgxJUFFJTIwJTVCJTVCJTIwJTVEJTVEJTIwJUUzJTgxJUE3JUU2JUE4JUE5JUU5JTk5JTkwJUUzJTgzJTgxJUUzJTgyJUE3JUUzJTgzJTgzJUUzJTgyJUFGJUUzJTgxJThDJUU3JUI0JUEwJUU5JTgwJTlBJUUzJTgyJThBJUUzJTgxJTk3JUUzJTgxJUE2JUUzJTgxJTg0JUUzJTgxJTlGJUVGJUJEJTlDJUU2JUFGJThFJUU2JTk3JUE1Q2hhbmdlbG9nJUU4JUE3JUEzJUU4JUFBJUFDJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMxRTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LXBhZD0wJnM9NWU3NDBmZDdlYjYyODU1OWNmYmY2MmJmMWZkYTY5NDE&mark-x=120&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjEuMSZ3PTgzOCZoPTU4JnR4dD0lNDBtb2hhMDkxOF8mdHh0LWNvbG9yPSUyMzFFMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtcGFkPTAmcz1lMjZlYWRiMmFhYzk4ZjNkMTM0YzE3YWU5NDIyMDY3NQ&blend-x=242&blend-y=480&blend-w=838&blend-h=46&blend-fit=crop&blend-crop=left%2Cbottom&blend-mode=normal&s=915fcf4517c75ddc614d2a9886d950f8)
Claude Code v2.1.221|zsh의 [[ ]]에서 권한 체크가 우회되던 문제 해결|매일 Changelog 해설
요약
Claude Code v2.1.221 업데이트를 통해 zsh의 [[ ]] 구문을 이용한 권한 체크 우회 취약점을 해결했습니다. 또한 MCP 서버 연결 안정성 개선, 샌드박스 인증 정보 마스킹 모드 추가, VSCode Focus view 도입 등 주요 변경 사항을 다룹니다.
핵심 포인트
- zsh 정규 표현식 조건 내 숨겨진 명령어 실행 취약점 수정
- MCP 서버가 첫 번째 턴 시작 전 준비되도록 연결 로직 개선
- Linux/WSL 환경을 위한 샌드박스 인증 정보 마스크 모드 지원
- VSCode 내 도구 실행 로그 요약을 위한 Focus view 추가
- auto 모드 권한 체크 시 프롬프트 캐시 재사용으로 비용 절감
zsh의 [[ ]]
정규 표현식 조건에 명령어를 숨기면, Bash 도구의 권한 체크를 통과하여 실행할 수 있었습니다. v2.1.221에서 이 취약점이 보완되었으며, 해당되는 명령어는 허가 프롬프트를 띄우게 됩니다. allow
규칙을 세세하게 작성하여 자동 실행시키고 있는 환경일수록, 통과/통과하지 못함의 경계가 움직입니다.
- zsh의 숨겨진 명령어가 Bash 도구의 권한 체크를 통과함
[[ ]]의 정규 표현식 조건에 심어둔 명령어가 확인 없이 실행됨 (v2.1.221)
- print 모드에서 MCP 서버가 첫 번째 턴에 맞춰 준비되지 않음
--mcp-config로 전달한 도구 호출이 그대로 문자열로 출력됨 (v2.1.221)
- 샌드박스 인증 정보 파일에 마스크 모드 추가
- Linux / WSL에서 더미 값을 읽게 하고, 외부 통신 시 프록시가 실제 값으로 교체함 (v2.1.221)
- VSCode에 Focus view 추가
- 도구 실행 로그를 턴 단위의 접기 요약으로 접음.
Ctrl+Alt+F로 전환 (v2.1.221)
- 도구 실행 로그를 턴 단위의 접기 요약으로 접음.
- 백그라운드 세션이 commit과 push를 수행하게 됨
- draft PR은 태스크가 요구할 때만 생성하며, 마지막에 결과물의 위치를 보고함 (v2.1.221)
- auto 모드의 권한 체크가 캐시된 프리픽스(prefix)를 재사용
- 병렬 도구 호출의 프롬프트 캐시 비용이 절감됨 (v2.1.221)
[[ ]]는 zsh의 조건식 구문으로, =~의 우변에 정규 표현식을 작성할 수 있습니다. 여기에 명령어를 교묘하게 섞어 넣으면, Bash 도구의 권한 체크를 그대로 통과하여 allow에도 deny에도 걸리지 않은 채 처리가 진행되었습니다. 사용자의 승인 없이 실행될 수 있는 형태였습니다.
Fixed a Bash tool permission-check bypass where zsh could execute hidden commands in [[ ]] regex conditionals; affected commands now prompt for permission
해결 방법은 "예외 취급을 중단하고 승인 쪽으로 돌리는 것"입니다. 누락되었던 명령어는 v2.1.221부터 허가 프롬프트 대상이 됩니다.
allow 규칙으로 Bash를 자동 실행시키고 있는 환경이 대상입니다. 지금까지 확인 없이 통과되던 패턴이 승인 대기로 바뀝니다. 무인 파이프라인을 돌리고 있다면, 중간에 멈추는 구간이 생기지 않는지 확인해 두시기 바랍니다.
동일한 릴리스에서 Windows 측의 권한 체크도 수정되었습니다. PowerShell에 인용구를 포함한 경로를 전달할 때 해석이 어긋나던 문제로, 이 역시 승인을 요청하는 동작으로 통일되었습니다.
claude -p "차이점을 리뷰해줘" --mcp-config <config>
이와 같은 형태로 전달한 MCP 서버가 첫 번째 턴이 시작되기 전에 연결되지 않았었습니다. 도구가 보이지 않는 상태로 모델이 동작하기 때문에, 도구 호출이 단순 텍스트로 출력됩니다. print 모드의 출력은 그대로 후속 스크립트로 전달되므로, 도구 실행을 전제로 하는 쪽에서 동작이 망가집니다.
v2.1.221에서는 첫 번째 턴 이전에 연결을 기다리도록 변경되었습니다. CI에서 -p로 호출했을 때 MCP 도구가 호출되지 않았다면, 우선 이 부분을 의심해 보아야 합니다.
샌드박스 인증 정보 파일에 mode: "mask"가 추가되었습니다. 샌드박스 내부의 명령어에는 sentinel 복사본을 읽게 하고, 외부 통신 시 샌드박스 프록시가 실제 값으로 치환합니다. 마스크 범위는 파일 전체로 할지, 혹은 extract의 정규 표현식으로 포착한 구간(span)만 할지 선택할 수 있습니다.
대응은 Linux와 WSL만 가능합니다. macOS에서는 파일 마스크가 deny로 폴백(fallback)되기 때문에, 토큰의 평문을 읽게 하면서 명령어를 실행하는 용도는 당분간 Linux / WSL로 한정됩니다.
| 버전 | 카테고리 | 변경점 | 개요 |
|---|---|---|---|
| v2.1.221 | 신기능 | VSCode Focus view | 툴 실행을 턴 단위의 접힌 요약(fold summary)에 숨기고, 실행 중인 툴을 인디케이터로 표시합니다. Ctrl+Alt+F 또는 명령 팔레트에서 전환 가능 |
| v2.1.221 | 신기능 | claude-api skill | 구형 모델용 작성 방식이 남아 있는지 프롬프트와 툴 설명을 감사하는 prompt-audit 서브 커맨드를 추가했습니다 |
| v2.1.221 | 변경 | 백그라운드 세션 | commit과 push를 통해 작업을 보존하고, draft PR은 태스크가 요구할 때만 생성합니다. CLAUDE.md의 git 지침을 따르며, 마지막에 산출물의 위치를 보고합니다 |
| v2.1.221 | 변경 | /fork | 포크된 세션이 원본 체크아웃을 공유하지 않고 자체 worktree를 만듭니다 |
| v2.1.221 | 변경 | /status | 세션 유형을 표시합니다. interactive인지, 백그라운드 작업의 attached / unattended인지 확인 가능 |
| v2.1.221 | 변경 | /plugin install | 카탈로그가 오래된 경우 재획득하여 재시도한 후 '찾을 수 없음'으로 보고합니다. 설치 직후에도 안전하다면 즉시 활성화되어, /reload-plugins가 필요 없어졌습니다 |
| v2.1.221 | 개선 | auto 모드 | 병렬 툴 호출의 권한 체크가 캐시 효율화되었습니다. 판정 간 대화 접두사(conversation prefix)를 재사용하여 비용을 절감합니다 |
| v2.1.221 | 개선 | Stats 패널 | 토큰 합계에 캐시분을 산입하고, input / output / cache read / cache write의 내역을 표시합니다 |
| v2.1.221 | 개선 | Windows 시작 | 프로세스 생성 시각을 PowerShell 시작이 아닌 kernel32의 네이티브 호출로 가져옵니다. 이로 인해 powershell.exe를 제한하는 보안 제품의 프롬프트가 나타나지 않게 되었습니다 |
| ... | 중단 턴의 자동 재개(automatic resume)를 비활성화할 수 없었던 문제. falsy 값이 존중되도록 변경되었습니다 | ||
| v2.1.221 | 수정 | Vim 모드 | yank 레지스터가 다이얼로그, 히스토리 검색, 트랜스크립트 표시를 거쳐도 사라지지 않게 되었습니다 |
v2.1.221의 핵심은 권한 체크의 허점을 막고, zsh의 [[ ]]와 Windows의 따옴표 포함 경로 두 가지 시스템을 개선했다는 점입니다. 둘 다 통했던 것이 승인 대기(pending approval)로 바뀌는 방향이므로, 자동 실행에 의존하는 환경일수록 동작 변화가 클 것입니다. 인증 정보 마스크 모드와 백그라운드 세션의 commit / push 역시 무인 실행의 안전한 쪽으로 기울어진 변경 사항이었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기