flawopen.com/Incidents/deadbugz-mcp-delayed-metadata-supply-chain-campaign-august-2026
Deadbugz: 승인 뒤 MCP 도구 메타데이터가 변경됨
Pillar Security는 정상 호출 세 번 뒤 메타데이터를 바꾸는 MCP 공급망 캠페인을 기록했습니다. 검토에서 GitHub PR 절차로 병합된 요청은 없었고 보고서에는 후속 침해가 기록되지 않았습니다. Cloud Security Alliance는 대상이 별도로 로컬 실행했는지 파악하는 데 한계가 있었다고 설명합니다.[1], [3]
무해한 업무만 적힌 출입증을 보고 계약자를 승인했다고 생각해 보세요. 일상적인 배송 세 번 뒤 출입증이 조용히 바뀌어 잠긴 방에 들어가려 합니다. 건물이 이전 승인을 계속 신뢰하는 것이 위험입니다. MCP 클라이언트는 서버가 승인된 도구 설명을 바꾸는지 감지해야 합니다.[1]
핵심 개념 및 용어
MCP- AI 애플리케이션이 서버가 제공하는 도구를 검색하고 호출하는 프로토콜.[5]
런타임 지연 변경- 상호작용 횟수 기준에 도달한 뒤 나타나는 동작. Pillar는 세 번 호출되는 카운터를 보고함.[1]
공급망 전달- pull request 같은 신뢰된 개발 절차를 통해 의존성이나 설정을 도입하는 일.[1]
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 CWE 참조: CWE-829
사고 타임라인
Pillar는 74분 동안 작성된 관련 pull request 23개를 확인했으며, 검토 당시 GitHub PR 절차로 병합된 건 없었다.[1]
Pillar가 세 번 호출된 뒤 메타데이터가 바뀌는 현상과 지표를 기술한 보고서를 공개했다.[1]
OWASP GenAI Project가 Deadbugz를 2026년 3분기 정리에 포함했다. 이는 관심을 보여 줄 뿐 침해나 검색량을 입증하지 않는다.[2]
단계별 공격 실행 흐름
소스 코드 비교: 취약한 구현 vs 보안 패치
보고서는 메타데이터 오염과 pull request 전달을 설명하며 MCP 사양 자체의 CVE를 설명하지 않습니다. 초기 승인 뒤에도 서버가 바꿀 수 있는 설명을 클라이언트가 계속 신뢰하면 위험이 생깁니다. Pillar는 이 캠페인을 공개 GitHub 계정에 귀속했습니다. 여기서는 이를 Pillar의 귀속으로 표현하며 실제 신원 확인으로 단정하지 않습니다. Pillar는 검토한 PR이 당시 GitHub PR 흐름으로 병합되지 않았고 후속 침해도 확인되지 않았다고 밝혔습니다. 연결된 소스 저장소는 현재 404를 반환하므로 기술 주장은 Pillar가 공개한 분석에 근거하며 코드 트리를 새로 독립 검증한 것은 아닙니다. Python 예시는 클라이언트 방어 정책의 예시이며 MCP 라이브러리를 바로 대체하는 코드가 아닙니다. CWE-829는 편집상 분류이고 CVE/CVSS는 없습니다. 어댑터는 MCP 변경 알림 뒤 데이터를 새로 가져오고 tools/list와 prompts/get을 모두 포함해야 합니다. metadata_snapshot은 설명용 어댑터 메서드이며 MCP SDK API가 아닙니다. approved_digest는 운영자 검토 후에만 생성합니다. 스냅샷에는 tools/list 정의와 승인된 프롬프트의 전체 prompts/get 내용을 포함한 모든 관련 서버 메타데이터가 들어가야 합니다. 실행 직전에 다시 가져오고 불일치하면 동작을 중단합니다. 이 검사는 서버 동작 변화나 검사와 사용 사이의 변경을 감지하지 못하므로 독립적인 동작 권한도 필요합니다.[1], [4], [5]
def agent_metadata(session):
# 어댑터는 서버의 현재 도구와 프롬프트를 JSON 데이터로 반환합니다.
return session.metadata_snapshot()
import hashlib
import hmac
import json
def fingerprint(snapshot):
normalized = dict(snapshot)
for key in ("tools", "prompts"):
normalized[key] = sorted(
snapshot[key],
key=lambda item: json.dumps(item, sort_keys=True, separators=(",", ":")),
)
canonical = json.dumps(normalized, sort_keys=True, separators=(",", ":"))
return hashlib.sha256(canonical.encode()).hexdigest()
def agent_metadata(session, approved_digest):
current = session.metadata_snapshot()
if not hmac.compare_digest(fingerprint(current), approved_digest):
raise PermissionError("MCP metadata changed; require operator approval")
return current
엔지니어링 및 시스템 보안 강화 체크리스트
- ✓승인된 MCP 도구의 이름, 설명, 입력 스키마에 대한 정규화 fingerprint를 저장한다.[1], [4]
- ✓승인 후
tools/list또는prompts/get이 바뀌면 도구를 멈추고 운영자 검토를 요구한다.[1], [5], [4] - ✓모델 지시나 메타데이터와 별도로 파일, 자격 증명, 프로세스, 외부 네트워크 권한을 강제한다.[1], [4]
- ✓MCP endpoint나 로컬 서버 스크립트를 추가하는 저장소 변경을 검토하고 활성화 전에 출처를 확인한다.[1]
- ✓서버 동작이 예상과 다르면 클라이언트 로그를 보존하고 정의 변경과 에이전트 동작을 대조한다.[1], [3]
출처
- Pillar Security — Deadbugz: Currently Active MCP Supply-Chain Campaign (12 August 2026)
- OWASP GenAI Security Project — GenAI and Agentic AI Exploit Roundup Q3 2026 (8 October 2026)
- Cloud Security Alliance — Deadbugz: Runtime-Gated MCP Metadata Poisoning as Supply-Chain Attack
- OWASP MCP Security Cheat Sheet
- MCP specification: Tools