30 CVEs와 계속 증가: 아무도 말하지 않는 MCP 보안 위기
Source: Dev.to
위에 제공된 Source 라인만 보이며 번역할 본문 내용이 포함되어 있지 않습니다. 번역을 원하는 전체 텍스트를 알려주시면 한국어로 번역해 드리겠습니다.
개요
MCP – Model Context Protocol – 은 AI 에이전트가 외부 서비스와 통신할 수 있게 합니다.
Anthropic가 이를 출시했으며, 모든 주요 AI 연구소가 채택했습니다. 오늘날 수천 개의 MCP 서버가 에이전트를 데이터베이스, API, 금융 플랫폼 및 클라우드 인프라와 연결하고 있습니다.
⚠️ 30 CVEs 가 이미 MCP에 대해 보고되었으며, 그 속도는 가속화되고 있습니다.
주요 지표
| 지표 | 값 |
|---|---|
| 전체 MCP CVE | 30 |
| 인증이 없는 서버 | 36 % |
| 공격 표면 레이어 | 3 |
| 최신 CVE 이후 | 1 일 |
최근 취약점 – CVE‑2026‑27896
- Affected component: Official MCP Go SDK
- Root cause: JSON 파서가 필드 이름을 대소문자를 구분하지 않게 처리합니다.
- Impact:
- 공격자는
"method"대신"Method"(또는"params"대신"PARAMS")와 같은 응답을 보낼 수 있습니다. - SDK는 이를 조용히 받아들여 정확한 필드 이름을 확인하는 검증을 우회합니다.
- 예시:
"method": "tools/call"만 허용하도록 방화벽이 설정돼 있어도"Method": "tools/call"은 통과됩니다.
- 공격자는
Who is affected?
공식 Go SDK를 사용한 모든 Go 기반 MCP 구현 – 서버 및 클라이언트 모두.
Mitigation:
대소문자를 구분하는 JSON 파싱을 적용한 패치된 SDK 버전으로 업데이트하십시오.
MCP 보안이 독특하게 위험한 이유
공격 표면은 세 개의 구별되는 계층으로 구성됩니다. 어느 한 계층에 결함이 있으면 전체 체인이 손상될 수 있습니다.
1️⃣ MCP 서버
- 예시: QuickBooks, Stripe, 데이터베이스 커넥터, 파일‑시스템 브리지.
- 스캔된 MCP 서버의 **36 %**가 인증 없이 연결을 허용합니다.
일반적인 공격 벡터
- 인증되지 않은 접근
- 불충분한 권한 부여(어떤 클라이언트든 모든 도구를 호출 가능)
- 입력 검증 누락
- 도구 매개변수를 통한 SSRF
- 도구 응답을 통한 데이터 유출
2️⃣ 프로토콜 구현 라이브러리
- MCP 메시지를 파싱하는 공식 TypeScript, Python, Go SDK.
- 여기에는 CVE‑2026‑27896을 비롯해 다른 파싱 버그, 직렬화 불일치, 타입 혼동 문제가 존재합니다.
일반적인 공격 벡터
- 대소문자 구분 없는 파싱 우회(CVE‑2026‑27896)
- 잘못된 메시지 처리
- SDK 구현 간 타입 혼동
- 신뢰할 수 없는 데이터 역직렬화
- 프로토콜 버전 불일치
3️⃣ MCP 클라이언트 런타임
- MCP 클라이언트를 실행하는 머신(노트북, 서버, AI‑에이전트 런타임).
- 도구 호출은 호스트 프로세스의 권한으로 실행됩니다.
일반적인 공격 벡터
- 제한 없는 도구 접근(허용 목록 없음)
- 프롬프트 인젝션을 통한 쓰기 작업
- 도구 응답을 통한 민감 데이터 유출
- 연결된 MCP 서버를 통한 횡방향 이동
- 도구 설정에서 자격 증명 탈취
갭: 대부분의 MCP 구현은 이 계층에서 제어가 전혀 없습니다 – 에이전트가 무엇을 호출할지 결정하고, 이를 검증하는 것이 없습니다.
CVE 타임라인
| 기간 | CVE | 주요 하이라이트 |
|---|---|---|
| 2025 Q1‑Q2 | ~5 | 초기 발견 – 인증, SSRF 기본 |
| 2025 Q3‑Q4 | ~10 | SDK 수준 버그 등장, 구현 간 이슈 |
| 2026 Q1 (현재까지) | ~15 | 가속화 – CVE‑2026‑27896 (Go SDK 우회), 서버 인증 실패 |
| 총계 | 30 | 3계층 전체에 걸쳐 |
전체 MCP CVE의 절반이 지난 3개월 동안 발표되었습니다.
실제 영향
- **> 33 %**의 MCP 서버는 클라이언트 신원을 확인하지 않고 모든 연결을 허용합니다.
- 결과:
- Any AI agent(모든 AI 에이전트)이 엔드포인트를 발견하면 연결할 수 있습니다.
- All tool calls(파괴적인 쓰기 작업을 포함한 모든 도구 호출)가 허용됩니다.
- No audit trail(누가 무엇을 호출했는지에 대한 감사 로그가 없습니다).
- 하나의 에이전트에서 발생한 Prompt‑injection이 인증되지 않은 MCP 서버로 전이될 수 있습니다.
재무용 MCP 서버(QuickBooks, Stripe, Xero)의 경우 이는 재앙과도 같습니다 – 손상된 에이전트가 인증되지 않은 서버에서 직접 재무 작업을 호출할 수 있습니다.
방어 솔루션 – ClawMoat McpFirewall
McpFirewall 은 Layer 3 (AI 에이전트와 MCP 서버 사이) 에 위치합니다. 서버에 도달하기 전에 모든 도구 호출을 가로채며, MCP 자체에서 제공하지 않는 보안 정책을 적용합니다.
수행 기능
- 쓰기 작업을 29개의 패턴(예:
create_,add_,update_,delete_,transfer_,pay_등)과 매칭하여 차단합니다. - 읽기 전용 모드에서도 MCP 응답에서 민감한 필드(주민등록번호, 은행 계좌 번호, API 키 등)를 삭제합니다.
예시 (Node.js)
const { McpFirewall } = require('clawmoat/finance/mcp-firewall');
const firewall = new McpFirewall({
mode: 'read-only',
onBlock: (event) => {
console.log(
`Blocked ${event.tool} on ${event.server}: ${event.reason}`
);
}
});
// Agent tries to create an invoice via MCP
const result = firewall.intercept({
tool: 'create_invoice',
args: { amount: 50000, customer: 'Acme Corp' },
server: 'quickbooks-mcp'
});
// result.blocked === true
// result.reason === "Write operation 'create_invoice' blocked in read-only mode"
쓰기 패턴 목록 (29개 항목)
create_, add_, update_, edit_, modify_, delete_, remove_,
send_, post_, submit_, approve_, void_, cancel_, refund_,
transfer_, pay_, charge_, issue_, record_, close_, batch_,
import_, set_, assign_, link_, unlink_, archive_, restore_, merge_
방화벽 구성 개요
const firewall = new McpFirewall({
mode: 'read-only',
redactFields: ['ssn', 'tax_id', 'bank_account', 'routing_number'],
redactResponses: true
});
예시 – MCP 응답 마스크 처리 전후
| 전 | 후 |
|---|---|
{ customer: "Jane", ssn: "123-45-6789", balance: 5000 } | { customer: "Jane", ssn: "***-**-****", balance: 5000 } |
도구 허용 목록
에이전트가 어떤 도구가 안전한지 스스로 결정하게 하지 마세요. 명시적인 허용 목록을 정의하세요:
const firewall = new McpFirewall({
mode: 'read-only',
allowedTools: ['get_invoices', 'get_profit_loss', 'get_balance_sheet'],
blockedTools: ['delete_company', 'export_all_data']
});
속도 제한
빠른 연속 툴 호출을 통한 데이터 유출 방지:
const firewall = new McpFirewall({
mode: 'read-only',
rateLimit: 10, // max 10 calls per tool per minute
allowedTools: ['get_transactions']
});
인식된 금융 MCP 서버
McpFirewall는 15개의 인기 있는 금융 MCP 서버에 대한 패턴 인식을 제공합니다:
- QuickBooks
- Xero
- FreshBooks
- Stripe
- Plaid
- Square
- PayPal
- Braintree
- Coinbase
- Mercury
- Wise
- Wave
- Gusto
- Rippling
- Bill.com
공격 시나리오 (Go SDK 우회)
-
공격자 페이로드 – 대소문자가 혼합된 필드 이름:
{"Method": "tools/call", "Params": {"name": "transfer_funds"}} -
통과되는 이유 – 검증은
"method"(소문자)만 확인하므로 검증에 실패한다. -
Go SDK 동작 –
encoding/json은 대소문자를 구분하지 않으므로 SDK가 여전히 요청을 파싱한다. -
결과 – 도구 호출이 MCP 서버가 부여한 권한으로 실행된다.
-
완화 방안 – McpFirewall은 SDK 파싱 후에 동작한다; 해결된 도구 이름과 인수를 검사하여 메시지가 어떻게 파싱되었든 관계없이 무단 호출을 차단한다.
즉각적인 조치
- MCP 서버 감사 – 인증이 필요하도록 확인합니다.
- SDK 업데이트 – 특히 Go SDK (CVE‑2026‑27896 참조).
- 방화벽 레이어 추가 – 에이전트가 MCP 도구를 무제한으로 호출하지 못하도록 합니다.
- MCP 연결 인벤토리 – 에이전트가 접근할 수 있는 서버를 파악합니다.
- 보안 스캔 실행 – 빠른 평가를 위해 ClawMoat의 무료 스캐너를 사용합니다.
왜 보안이 중요한가
MCP는 AI 에이전트에게 HTTP가 웹 브라우저에게 그랬던 것처럼, 서비스에 연결하기 위한 범용 프로토콜입니다.
하지만 보안 모델은 사후에 고려되었습니다:
- Authentication – 선택 사항.
- Authorization – “구현에 맡김”.
- Encryption – 필수 아님.
- Tool‑level access control – 표준 없음.
30 CVEs in ~15 months 은 단순한 숫자가 아니라 패턴입니다. 이 프로토콜은 보안이 아니라 기능성을 위해 설계되었습니다.
McpFirewall 기능
- 29 write patterns 탐지
- Field‑level redaction (필드 수준 레드액션)
- Tool allowlisting (툴 허용 목록)
- Rate limiting (속도 제한)
- Zero dependencies (의존성 없음)
- 277 automated tests (277 자동 테스트)
이것은 host layer를 보호하고 서버 및 SDK 수준 제어를 보완합니다.
시작하기
npm install clawmoat
- ⭐ GitHub에 별표 달기
- 🔍 무료 보안 스캐너
McpFirewall은 오픈‑소스(MIT 라이선스)이며 clawmoat/finance/mcp-firewall에 있습니다.
시간이 흐르고 있습니다. 지금 바로 MCP 생태계를 강화하세요.