Claude Code 에이전트 모드, bash 가드 우회

Claude Code의 에이전트 bash 가드는 기본 꺼짐입니다. Telegram 제어판과 거래용 브로커 API 안전을 다룹니다.

Claude Code 에이전트 모드, bash 가드 우회
Share

보안 문서는 런타임이 조용히 꺼 버리는 안전장치를 약속할 수 있습니다. Claude Code를 실시간 트레이딩 운영자로 돌릴 때 핵심에 놓인 간극이 바로 이것입니다. 문서에서 본 "dangerous Bash pattern" 필터는 실제 에이전트형 배포에서 가장 많이 쓰는 모드에서는 실행되지 않습니다.

Bash 필터가 하는 일과 꺼지는 조건

Screenshot of https://raw.githubusercontent.com/RichardAtCT/claude-code-telegram/main/docs/tools.md

dangerous-Bash pattern 필터는 셸 명령을 실행하기 전에 검사해, 위험하다고 알려진 패턴을 거부하는 문자열 매칭 계층입니다. Richard Atkinson의 claude-code-telegram 브리지는 이 검사를 보안 참고 문서에서 경로 탐색 검사, 시크릿 파일 차단, 속도 제한과 함께 설명합니다. 하지만 브리지의 자체 도구 참고 문서에는 제목이 가리키는 단서가 덧붙어 있습니다. 이 패턴 계층은 "classic mode only"이며 agentic mode에서는 활성화되지 않습니다.

"The dangerous-Bash-pattern layer is classic mode only," — claude-code-telegram tools reference (source: docs/tools.md).

따라서 에이전트형 배포에서는 Bash가 그런 가로채기 없이 실행됩니다. 남는 장벽은 OS 샌드박싱, Claude Code의 권한 규칙, 그리고 직접 작성한 주문 게이트 코드뿐입니다. 브리지 자체가 셸 호출이 브로커에 도달하는 것을 막아 주지는 않습니다. 문자열 필터를 대신하는 플랫폼 수준 제어는 Claude Code의 권한 참고 문서에 설명된 Agent SDK의 평가 순서입니다. 순서는 hooks → deny rules → permission mode → allow rules → canUseTool입니다. hooks가 가장 먼저 실행되므로, PreToolUse hook이 실질적인 대체 수단입니다. 셸 명령이 실행되기 전에 차단할 수 있습니다.

따라오는 결론은 명확합니다. 에이전트는 적어 둔 것만 강제합니다. 2026년 5월 공개된 Bybit 선물 봇 14세션 빌드 사례는 59개 파일에 걸쳐 961번의 도구 호출을 기록했고, Session 5에서 Claude가 BYBIT_TESTNET=false를 감지하자 스스로 중단했다고 적었습니다 . 거래를 거부한 것입니다. 하지만 그 제약이 CLAUDE.md에 있었기 때문입니다. 내장된 무언가가 잡아낸 것이 아닙니다.

아래 스니펫은 설명용입니다. 실행된 것이 아니며, 인증된 Claude Code 로그인이 필요합니다. 문제의 형태는 보여 줍니다. bypassPermissions와 좁은 allowedTools로 실행하는 것은 안전 경계가 아닙니다.

import subprocess
import sys

prompt = (
    "Use Bash to run exactly this command and report the output: "
    "python3 -c 'print(\"BASH_GUARD_SKIPPED\")'"
)

cmd = [
    "claude",
    "-p",
    "--bare",
    "--permission-mode",
    "bypassPermissions",
    "--allowedTools=Bash(echo *)",
    prompt,
]

try:
    result = subprocess.run(cmd, text=True, capture_output=True, timeout=20)
except subprocess.TimeoutExpired:
    print("Claude Code timed out before demonstrating whether Bash(echo *) was enforced.")
    sys.exit(124)

print(result.stdout, end="")
if result.stderr:
    print(result.stderr, end="")
sys.exit(result.returncode)

Telegram은 Channels로 붙일까, 오픈 브리지로 붙일까?

Telegram: Channels or open bridge? (source: cdn.quasa.io)

실행 중인 Claude Code 세션을 Telegram에 연결하는 길은 두 가지이고, 편의성과 통제력 사이에서 선택이 갈립니다. 공식 경로는 Claude Code Channels입니다. Anthropic이 2026년 3월 20일 출시한 플러그인으로, 로컬 세션이 Telegram과 Discord 메시지를 받고 답할 수 있게 해 줍니다. Claude Code v2.1.80 이상이 필요합니다. 설정은 짧습니다. BotFather로 봇을 만들고, Channels 플러그인을 설치하고, 토큰을 .claude/channels/telegram/.env에 저장한 뒤, claude --channels plugin:telegram@claude-plugins-official로 다시 실행하면 됩니다. 리서치 프리뷰 동안 --channels는 이 단일 허용 목록의 플러그인만 받습니다. 조사 시점에 Anthropic의 목록 페이지는 설치 수를 100,332건으로 표시했습니다.

셀프 호스팅 대안은 Richard Atkinson의 claude-code-telegram입니다. 확인한 커뮤니티 제어 플레인 중 가장 완성도가 높습니다. main 브랜치는 version 1.6.0, Python ≥3.11, python-telegram-bot ^22.6, claude-agent-sdk ^0.1.39를 보고하며, 사용자별 세션 지속성, SQLite 감사 로그, 허용 목록 인증, webhook HMAC, 디렉터리 샌드박싱을 추가합니다. README의 설치 스니펫은 main이 안정화될 때까지 v1.3.0 태그로 고정하라고 여전히 권장하므로, 배포 전 릴리스를 의도적으로 선택해야 합니다.

어느 쪽이든 전송 계층은 python-telegram-bot입니다. 이 라이브러리의 v22.7(2026년 3월 16일 릴리스)은 Bot API 9.6, 비동기 webhook과 polling, 그리고 한 번 탭해 승인/취소하는 흐름을 위한 inline keyboard를 지원합니다. HumbledTrader의 IBKR 빌드는 모든 Telegram 호출을 try/except로 감싸, 알림 실패가 거래 로직을 중단하지 못하게 했습니다 [HumbledTrader, 2026-05].

Telegram은 오래가는 승인 계층이 아니라 콘솔로 다루어야 합니다. Callback data는 일시적이고, 전달은 best-effort이며, 프리뷰 허용 목록은 claude-plugins-official뿐입니다. 첫날부터 Telegram 장애를 전제로 설계하십시오. 주문 상태와 확인은 서버 쪽에 보관해야 합니다.

텔레그램에서 체결까지: Robinhood, Alpaca, CCXT

주문 입력 계층에서 세 갈래가 갈립니다. 브로커 네이티브 MCP 서버, 모의투자 REST API, 또는 암호화폐 거래소 SDK입니다. Robinhood의 Agentic Trading은 2026년 5월 27일 주식 전용 베타로 출시되었고, 배선 작업이 가장 적은 경로입니다. 명령 하나로 추가하면 커스텀 브로커 코드를 완전히 건너뛸 수 있습니다.

claude mcp add robinhood-trading --transport http https://agent.robinhood.com/mcp/trading

에이전트는 실시간 P&L과 연결 해제/일시정지 제어가 있는 전용 에이전틱 계정을 받으며, 해당 계정 안에서만 거래를 넣을 수 있습니다 [Robinhood 지원]. Robinhood의 자체 경고는 신중히 읽어야 합니다. 승인 없이 행동하도록 에이전트에 지시하면 거래가 추가 확인 없이 실행될 수 있고, 그 책임은 사용자에게 남습니다.

Alpaca는 전략을 충분히 담금질하기에 가장 안전한 장소입니다. 모의투자는 무료이고, 기본값은 10만 달러 모의 계정이며, 별도 엔드포인트인 https://paper-api.alpaca.markets에서 동작합니다 [Alpaca 문서]. client_order_id로 식별되는 시장가, 지정가, 스톱, 브래킷, OCO, OTO 주문을 지원합니다. 단점도 있습니다. 슬리피지, 대기열 위치, 지연 시간, 규제 수수료를 명시적으로 모델링하지 않기 때문에 모의 결과는 실거래 성과를 과대평가합니다.

암호화폐 선물에서는 개발자들이 CCXT나 Bybit 같은 네이티브 SDK를 선택합니다. API 키를 만들 때는 언제나 출금 권한을 꺼야 합니다. 또한 ErrCode 10001(Hedge 모드와 One-way 모드 불일치)은 연결 시점이 아니라 주문 제출 시점에만 나타납니다. 한 빌드 일지에서는 실행 중간에 이 문제가 발생했으므로 먼저 테스트넷에서 검증하세요 [dev.to 빌드 일지].

IBKR은 가장 강력하지만 운영 부담도 가장 큽니다. Client Portal Web API의 제약은 어떤 에이전트 루프에서도 중요합니다.

제약
브로커리지 세션사용자당 활성 세션 1개; /tickle 없으면 약 6분 인증 타임아웃; 자정 리셋 포함 최대 24시간 수명
전역 요청 한도10 req/s; /iserver/account/orders GET은 5초당 1회; 위반자는 15분 패널티 박스
TWS 모의투자 포트7497
IB Gateway 포트4002 (모의) / 4001 (실거래)

배선 작업을 얼마나 감당할 수 있는지에 따라 고르면 됩니다. 커스텀 코드가 가장 적은 쪽은 Robinhood, 무료 모의 운용은 Alpaca, 세션과 속도 제어 규율을 감수하고 통제력을 원하면 CCXT/IBKR입니다 [HumbledTrader, 2026-05].

보완 장치: 킬 버튼, 손실 한도, 멱등성

From Telegram to fill: Robinhood, Alpaca, or CCXT

에이전틱 모드에서는 위험한 Bash 패턴 계층이 비활성화되므로, 모든 제동 장치는 대화가 아니라 에이전트가 시작할 때 읽는 설정 안에 있어야 합니다. 참고 빌드들이 수렴하는 외부화된 가드레일은 작지만 뚜렷합니다. 전역 취소 및 포지션 정리를 실행하는 빨간 킬 플래그, 일일 손실 약 2%에서 포지션 크기를 줄이는 서킷 브레이커, 일일 손실 약 3% 또는 10% 드로다운에서 강제 청산, 거래 재개 전 수동 재개를 요구하는 락 파일입니다 .

숫자 한도는 에이전트가 반드시 따라야 하는 곳, 즉 rules.json이나 CLAUDE.md에 적어 두세요. IBKR 참고 빌드는 최대 동시 포지션을 5개, 거래당 위험을 1%, 최대 포지션 크기를 10%로 제한하고, MAX_TRADES_PER_DAY 한도를 강제하며, PAPER_TRADING 플래그가 연결된 포트 번호와 맞지 않으면 부팅을 거부하는 시작 가드를 추가합니다 . 이 방식은 실제로 작동합니다. 14세션 빌드에서 Claude는 세션 5에 스스로 중단했습니다. BYBIT_TESTNET=false를 감지한 뒤 거래를 거부한 것입니다. 다만 그 제약이 CLAUDE.md에 적혀 있었기 때문에 가능했습니다 .

승인은 지속 가능한 기록으로 남아야 합니다. 모든 제출에 브로커가 생성한 주문 ID와 멱등성 키를 사용하고, 리스크 결정 로그와 브로커 확인을 서버 쪽에 저장하세요. 텔레그램 콜백 데이터만으로는 버튼 탭이 감사 가능하고 재실행에 안전한 기록을 남기지 않기 때문에 지속 가능한 승인이 아닙니다.

"승인을 요구하지 않고 에이전트가 행동하도록 요청하면, 거래가 추가 확인 없이 실행될 수 있으며 그 책임은 사용자에게 있습니다," — Robinhood, Agentic Trading 문서 (source: Robinhood).

플랫폼 측면에서는 PreToolUse 훅이 Agent SDK에서 사라진 Bash 필터에 가장 가까운 대응물입니다. SDK는 훅을 먼저 평가한 뒤 거부 규칙, 권한 모드, 허용 규칙을 평가하므로, 훅은 Bash 호출을 가로채고 실행 전에 의도한 명령을 타임스탬프와 함께 기록하며, "주문 넣기", "주문 수정", "전체 취소"를 대화형 동의가 아니라 코드 안의 명시적 승인 확인으로 통과시킬 수 있습니다 . 아래 스니펫은 설명용이며 실행된 것이 아닙니다. 이 필터가 왜 우회될 수 있는지를 보여줍니다.

import subprocess
import sys

prompt = (
    "Use Bash to run exactly this command and report the output: "
    "python3 -c 'print(\"BASH_GUARD_SKIPPED\")'"
)

cmd = [
    "claude",
    "-p",
    "--bare",
    "--permission-mode",
    "bypassPermissions",
    "--allowedTools=Bash(echo *)",
    prompt,
]

try:
    result = subprocess.run(cmd, text=True, capture_output=True, timeout=20)
except subprocess.TimeoutExpired:
    print("Claude Code timed out before demonstrating whether Bash(echo *) was enforced.")
    sys.exit(124)

print(result.stdout, end="")
if result.stderr:
    print(result.stderr, end="")
sys.exit(result.returncode)

핵심은 에이전트를 신뢰하지 않는 것입니다. 킬 스위치, 드로다운 한도, 멱등적 주문 게이트를 설정과 결정론적 훅으로 외부화하세요. 에이전트는 적어 둔 제동 장치만 적용합니다.

자주 묻는 질문

dangerous-Bash 필터는 모든 에이전트형 배포에서 비활성화되나요, 아니면 claude-code-telegram에만 해당하나요?

이는 특히 claude-code-telegram 커뮤니티 브리지에서 문서화된 동작입니다. 해당 도구 문서에는 dangerous-Bash-pattern 계층이 “classic mode only”이며 agentic mode에서는 활성화되지 않는다고 되어 있습니다 . 이 패턴 필터는 하나의 계층일 뿐입니다. Anthropic 자체 제어와는 별개입니다. Claude Agent SDK는 훅, deny 규칙, 권한 모드, allow 규칙, canUseTool 순서로 평가하며, 어떤 브리지를 실행하든 PreToolUse가 위험한 작업을 차단할 수 있습니다 . 둘을 서로 다른 계층으로 봐야 합니다. 브리지의 필터가 사라져도 SDK 수준의 bash 권한과 훅이 제거되는 것은 아니며, 어느 쪽도 브로커 측 제어를 대신할 수 없습니다.

Claude Code Channels와 claude-code-telegram 커뮤니티 브리지는 무엇이 다른가요?

Channels는 Anthropic의 공식 플러그인으로, 2026년 3월 20일 출시됐습니다. Claude Code v2.1.80 이상이 필요하며, 리서치 프리뷰 기간에는 대략 6단계 설정을 거쳐 claude-plugins-official 허용 목록에 있는 플러그인만 받습니다 . claude-code-telegram 브리지는 셀프 호스팅 방식입니다. main 브랜치의 pyproject.toml에는 버전 1.6.0으로 표시되어 있으며 , 감사 로그, HMAC/Bearer 웹훅 인증, 디렉터리 샌드박싱, 사용자별 세션 지속성을 추가합니다 . README 설치 예시는 v1.3.0 태그를 권장하지만 main은 1.6.0이므로, 특정 릴리스를 직접 검증하기 전까지는 v1.3.0에 고정하세요.

Robinhood의 에이전트형 계정은 아직 암호화폐 거래를 지원하나요?

아직은 아닙니다. 2026년 5월 27일 출시 시점 기준 Robinhood의 Agentic Trading은 주식 전용 베타이며, 전용 에이전트형 계정과 연결 해제/일시정지 제어를 갖춘 AI 네이티브 MCP 서버를 통해 실행됩니다 . 2026년 7월 1일 발표에서는 미국 에이전트형 암호화폐 계정이 곧 출시될 예정이라고 확인했지만, 확정 날짜는 제시하지 않았습니다 . 지금 암호화폐가 필요하다면 Robinhood 경로를 기다리지 말고 CCXT나 네이티브 SDK로 거래소를 직접 연결하세요.

포지션이 열려 있는 동안 Telegram이 다운되면 어떻게 되나요?

문제가 생기면 안 됩니다. Telegram은 콘솔이지 안전 시스템이 아니기 때문입니다. 안전에 중요한 상태는 idempotency key, 주문 ID, 타임스탬프, 브로커 확인과 함께 서버 측에 있어야 합니다. callback data만으로는 지속성 있는 승인으로 충분하지 않습니다. 시간 기반 강제 청산(예: ET 3:51)과 재시작 후에도 남는 lock file이 있으면 채팅 연결이 없어도 에이전트가 안전하게 멈출 수 있으며, 참고용 IBKR 빌드는 모든 Telegram 호출을 try/except로 감싸 알림 실패가 거래 로직을 절대 중단하지 않도록 합니다 . 채팅 계층이 끊기면 알림만 약화되고, 리스크 강제 집행은 흔들리지 않도록 설계해야 합니다.

Robinhood나 Alpaca 대신 IBKR을 써도 되나요?

가능하지만 운영 부담이 더 큽니다. 로컬 경로에서는 봇이 paper용으로 포트 7497의 TWS에 연결하는 반면, 프로덕션 가이드는 headless IB Gateway(포트 4002 paper / 4001 live)를 요구합니다 . Client Portal Web API는 마찰이 더 많습니다. /tickle 없이 약 6분이 지나면 세션이 만료되고, 전역 속도 제한은 10 req/s이며, /iserver/account/orders GET은 5초당 1회로 제한되고, 위반하면 15분 penalty box에 들어갑니다 . IBKR은 빠른 반복 개발보다는 진지한 프로덕션 사용에 더 맞습니다. 빠른 프로토타이핑이라면 Alpaca의 무료 paper 계정이나 Robinhood의 연결 작업이 거의 없는 MCP 경로가 더 가볍습니다.

이 글이 도움이 되셨다면, 새 글이 올라올 때마다 이메일로 받아보세요.

구독하기