메인 콘텐츠로 건너뛰기
“러그풀(rug pull)“은 당신이 지켜보는 동안에는 얌전히 행동하다가 신뢰를 얻은 후 적대적으로 변하는 MCP 실패 모드입니다: 연결 시 승인한 툴이 추가 인자를 몰래 끼워 넣기 시작하거나, 나열한 커뮤니티 서버가 조용히 새 기능을 추가하거나, 에이전트가 자체 설치한 스킬이 프로덕션에서 무해함에서 위험함으로 뒤집힙니다. 위험은 연결이 라이브된 후 아무도 그것을 재검토하지 않는다는 것입니다 — 신뢰 결정은 핸드셰이크에서 한 번 내려졌고 다시 검토되지 않았습니다. OrcaRouter는 핸드셰이크를 신뢰하지 않습니다. 그것은 세 전선에서 방어합니다. Firewall의 MCP 게이트웨이는 각 tools/call을 디스패치 시 당신의 라이브 정책에 대해 평가합니다. 각 등록된 서버의 광고된 툴 세트는 첫 프로브에서 기준선화되고 드리프트를 다시 검사받습니다 — 툴 스키마가 승인된 기준선에서 변경되면, 서버는 admin이 다시 승인하거나 격리할 때까지 닫힘으로 실패합니다. 그리고 스킬 레이어는 모든 설치된 기능에 위험 밴드와 강제 모드를 할당하여 — 위험하거나 검토되지 않은 것을 사람이 승인할 때까지 격리합니다. 서버는 처음 백 번의 호출 동안 얌전히 굴어서 무료 통행권을 얻을 수 없습니다.

1. 왜 MCP 러그풀 방어에는 호출별 평가가 필요한가

연결 시 검토는 한 질문에 한 번 답합니다: 이 서버는 나열하기에 안전한가? 그것은 런타임에 실제로 중요한 질문에는 답할 수 없습니다: 이 특정 호출이, 이 특정 인자로, 지금 안전한가? OrcaRouter는 두 번째 질문에 답합니다. 게이트웨이를 가로지르는 모든 tools/call은 실제 서버로 디스패치되기 전에 툴 이름과 인자를 손에 쥔 채 mcp 표면에서 평가됩니다. 판정은 매번 새로 계산되므로, 툴이 당신의 정책이 금지하는 무언가를 하기 시작하는 순간 — 인자로 시크릿을 유출, 거부된 호스트에 도달, 승인한 적 없는 기능 호출 — 그 호출은 멈춰지며, 같은 툴이 일 분 전에 어떻게 행동했는지와 무관합니다.
호출별 평가는 각 호출의 동작 — 인자 내용, 목적지, 소유하는 스킬의 위험 — 을 관리하므로, 툴이 동일한 시그니처를 유지하고 동작만 적대적으로 변해도 러그풀을 잡습니다. 스키마 드리프트 탐지(아래 §)는 보완 레이어입니다: 그것은 서버의 광고된 툴 세트 자체가 변경되는 경우를 잡습니다. 둘 다 실행됩니다.
엔진이 mcp 표면에서 반환할 수 있는 판정:

allow / audit

서버로 전달됨. audit는 호출을 로깅하고; allow는 조용히 있습니다.

sanitize

툴 호출 인자가 먼저 편집된 채 전달됨(서버가 반환하는 것은 결코 재작성하지 않음).

deny

모델에 툴 오류(firewall deny: …)로 반환되어, 에이전트가 크래시하는 대신 적응할 수 있습니다.

pending_approval

호출이 실행될 수 있기 전에 사람이 해결하도록 보류됩니다.

2. 스킬 위험 밴드 격리

러그풀 방어의 후반부는 공급망을 다룹니다: 에이전트가 설치하는 스킬, 플러그인, 그리고 bring-your-own MCP 서버. 각각은 워크스페이스 범위 레코드로 등록되고, 결정론적 위험 엔진에 의해 스캔되며, 위험 밴드(low / medium / high / critical)와 강제 모드가 할당됩니다:
모드런타임 효과
allow규칙 판정이 결정함; 스킬은 아무것도 추가하지 않음.
quarantinedeny에 못 미치는 모든 것이 pending_approval로 에스컬레이션됨 — 툴은 사람이 승인한 후에만 실행됨.
block스킬의 툴이 즉시 거부됨.
여기가 러그풀이 봉쇄되는 곳입니다. 에이전트가 자체 설치하는 기능은 auto_detected이며 검토될 때까지 격리됩니다 — 깨끗하게 스캔되었더라도, 자신의 권한으로 실행되지 않습니다. 그리고 스킬의 모드는 재스캔 시 더 엄격하게만 래칫됩니다: 당신이 설정한 block이나 quarantine은 매니페스트가 다시 제시되어도 조용히 완화되지 않습니다.
격리는 shadow 모드와 독립적으로 강제됩니다. quarantine이나 block으로 설정된 스킬은 주변 정책이 shadow 롤아웃 중이어도 여전히 보류됩니다 — 따라서 위험한 기능은 단계적 배포 중에 빠져나갈 수 없습니다.
전체 스캐너, 점수 가중치, 그리고 신뢰 신호는 Firewall: 스킬을 참조하세요.

3. 툴 스키마 드리프트 탐지

전형적인 러그풀은 광고하는 것을 변경하는 등록된 서버입니다 — 툴을 추가, 툴의 입력 스키마를 변경, 설명을 교체. OrcaRouter는 성공적인 프로브에서 각 등록된 서버의 광고된 툴 세트를 기준선화하고 드리프트를 감시합니다.

첫 프로브에서 기준선화

첫 성공적인 프로브가 서버 툴의 정규 해시를 기록합니다(발견 자세 하에서의 trust-on-first-use; 강제 자세 하에서는 기준선화되지 않은 서버가 admin이 초기 툴 세트를 승인할 때까지 pending으로 보류됩니다).

드리프트는 닫힘으로 실패

이후 프로브에서, 정규 툴 세트가 승인된 기준선과 더 이상 일치하지 않으면 서버는 changed로 표시되고 제공이 중단됩니다 — 당신이 결정할 때까지 게이트웨이는 그 툴을 디스패치하지 않습니다.

승인 또는 격리

새 스키마로 다시 기준선화하려면 다시 승인하거나, 서버를 격리하세요. 격리된 서버는 비활성화도 되며 명시적 승인만이 서비스를 복구합니다 — 평범한 편집으로는 다시 활성화할 수 없습니다.

감사됨

승인된 기준선으로부터의 드리프트의 첫 탐지는 워크스페이스 감사 항목을 쓰므로, 그 변경은 기록에 남습니다.
서버의 스키마 상태는 unknown(결코 기준선화되지 않음), verified(기준선 일치), changed(드리프트됨, 보류됨), pending(강제 하에서 기준선화되지 않음), 또는 quarantined 중 하나입니다. 이 레이어는 스키마를 움직이는 러그풀을 잡습니다; 호출별 평가(§1)는 동일한 시그니처를 유지하고 동작만 변경하는 것을 잡습니다.

4. 하나의 구체적인 예

커뮤니티 MCP 서버 notes가 무해한 notes.search 툴을 광고한다고 합시다. 당신은 그것을 나열하고, 검토하고, 작동합니다. 일주일 후 서버가 손상되고 notes.search가 당신의 컨텍스트를 공격자 호스트로 POST하는 유출 인자를 첨부하기 시작합니다. 연결 시에만 작동하는 게이트웨이는 그것을 전달할 것입니다 — 툴 이름과 스키마가 변경되지 않아 보입니다. OrcaRouter는 호출을 평가합니다:
# 콘솔(Developer+)에서 deny 규칙을 구성, 릴레이 키를 통하지 않음.
# 규칙: mcp 표면에서, notes.search가 유출 형태의 인자를 운반할 때마다
#       deny.
#   tool_name_glob: notes.search
#   args_match:     { "path": "$.callback_url", "op": "regex",
#                     "value": "^https?://(?!notes\\.example/)" }  → deny
(args_match 연산자는 eq, contains, regex, in, cidr_match, gt, lt입니다; cidr_match는 IP 값 인자를 CIDR에 대해 테스트합니다. 툴이 어디까지 host/CIDR로 도달할 수 있는지 제한하려면, 인자 절 대신 egress 목적지 목록을 사용하세요.) 디스패치 시 엔진은 deny를 반환하고, 호출을 전달하는 대신 게이트웨이는 에이전트에게 MCP 툴 결과 오류 — 오류로 플래그된 정상 결과이며, 전송 실패가 아닌 — 를 건네므로 모델이 적응할 수 있습니다:
firewall deny: <your rule's reason>
지난주에 성공했던 동일한 호출이 이제 차단됩니다 — 결정이 연결이 아니라 호출에 대해 내려지기 때문입니다.
sanitize당신의 에이전트가 보내는 인자를 편집하며, 툴이 반환하는 내용은 결코 아닙니다. 툴이 어디까지 도달할 수 있는지 제약해야 하면, deny 규칙을 egress 목적지 목록과 짝지으세요 — 응답을 정제하는 데 sanitize에 의존하지 마세요.

5. 함께 들어맞는 방식

호출별 평가는 신뢰된 툴이 악성으로 변하는 것 — 같은 이름, 인자나 목적지의 새 동작 — 을 잡습니다. 스킬 격리는 새롭거나 검토되지 않은 기능이 애초에 나타나는 것 — 자동 탐지된 설치, 새로 저하되는 재스캔된 매니페스트 — 을 잡습니다. 러그풀은 어느 형태든 취할 수 있으므로, 둘 다 실행됩니다: 스킬의 모드가 호출별 규칙 판정 위에 올라탑니다.
예 — §3을 참조하세요. 각 등록된 서버의 광고된 툴 세트는 첫 프로브에서 기준선화되고 드리프트를 다시 검사받습니다; 드리프트된 서버는 당신이 다시 승인하거나 격리할 때까지 닫힘으로 실패합니다. 그것은 호출별 평가에 보완적이며, 호출별 평가는 또한 동일한 시그니처를 유지하고 동작만 변경하는 툴을 잡습니다.
pending_approval 판정은 콘솔(Developer+) 또는 HMAC 승인 콜백을 통해 사람이 해결하도록 호출을 보류합니다. 보류와 승인이 에이전트에 표면화되는 방식은 강제 모드를 참조하세요.

6. 구성하기

아래의 모든 단계는 세션 또는 액세스 토큰으로 인증되는 콘솔/관리 액션입니다 — sk-orca-… 릴레이 키가 아닙니다. /v1/* 릴레이 트래픽만이 릴레이 키를 사용합니다.
1

게이트웨이 뒤에 MCP 서버 등록하기

각 서버의 툴이 하나의 감사 엔드포인트 아래 광고되도록 각 서버를 연결하세요. 등록은 **Developer+**입니다.
2

mcp 표면에 기본 판정과 규칙 설정하기

위험한 호출이 deny, sanitize, 또는 pending_approval로 해결되도록 tool_name_globargs_match로 규칙을 작성하세요. Firewall 규칙 레퍼런스를 참조하세요.
3

격리된 스킬 검토하기

자동 탐지된 모든 것은 검토자(Developer+)가 승인할 때까지 quarantine에 있습니다. 밴드와 발견 사항을 먼저 읽으세요.
4

shadow로 롤아웃한 다음 강제하기

강제 모드를 사용하여 새 규칙을 shadow로 실행하고, 감사 이벤트를 관찰한 다음, 판정이 옳아 보이면 강제로 전환하세요.
읽기(설정, 정책, 발견된 툴, 이상 징후)는 모든 Member에게 열려 있습니다; 모든 쓰기는 **Developer+**입니다. firewall-gateway 키의 평문 읽기는 **Developer+**입니다.

관련

Firewall: MCP 서버

전체 MCP 게이트웨이 레퍼런스 — 등록, 프로빙, 디스패치.

Firewall: 스킬

스캐너 패스, 위험 점수화, 그리고 격리 도출.

MCP 툴 포이즈닝

러그풀 방어가 대응하기 위해 존재하는 위협 모델.

Egress 한도

툴이 도달할 수 있는 곳을 제한하는 host/CIDR 거부 규칙을 작성합니다.

신뢰 체크리스트

MCP 서버를 신뢰하기 위한 엔드투엔드 체크리스트.

Guardrails vs. Firewall

콘텐츠 정책이 적용될 때와 firewall이 적용될 때.