FlawOpen

flawopen.com/Incidents/deadbugz-mcp-delayed-metadata-supply-chain-campaign-august-2026

● Pillar Security / MCP ecosystem · CWE-829 (editorial mapping; no CVE assigned) · 2026-08-10 · 보통
보안 연구 · FlawOpen

Deadbugz: 승인 뒤 MCP 도구 메타데이터가 변경됨

Pillar Security는 정상 호출 세 번 뒤 메타데이터를 바꾸는 MCP 공급망 캠페인을 기록했습니다. 검토에서 GitHub PR 절차로 병합된 요청은 없었고 보고서에는 후속 침해가 기록되지 않았습니다. Cloud Security Alliance는 대상이 별도로 로컬 실행했는지 파악하는 데 한계가 있었다고 설명합니다.[1], [3]

💡 알기 쉬운 설명 (ELI5)

무해한 업무만 적힌 출입증을 보고 계약자를 승인했다고 생각해 보세요. 일상적인 배송 세 번 뒤 출입증이 조용히 바뀌어 잠긴 방에 들어가려 합니다. 건물이 이전 승인을 계속 신뢰하는 것이 위험입니다. MCP 클라이언트는 서버가 승인된 도구 설명을 바꾸는지 감지해야 합니다.[1]

핵심 개념 및 용어

MCP
AI 애플리케이션이 서버가 제공하는 도구를 검색하고 호출하는 프로토콜.[5]
도구 메타데이터
이름, 설명, 입력 스키마로, 클라이언트가 모델 문맥에 포함할 수 있음.[5], [1]
런타임 지연 변경
상호작용 횟수 기준에 도달한 뒤 나타나는 동작. Pillar는 세 번 호출되는 카운터를 보고함.[1]
공급망 전달
pull request 같은 신뢰된 개발 절차를 통해 의존성이나 설정을 도입하는 일.[1]
CWE-829
편집상 분류: 클라이언트의 신뢰 제어 영역 밖에 있는 서버에서 기능이 들어옴. CVE나 CVSS 점수는 지정되지 않음.[1], [3]

프레임워크 매핑

  • 이 가이드에서 설명하는 약점의 CWE 참조: CWE-829

사고 타임라인

2026-08-10

Pillar는 74분 동안 작성된 관련 pull request 23개를 확인했으며, 검토 당시 GitHub PR 절차로 병합된 건 없었다.[1]

2026-08-12

Pillar가 세 번 호출된 뒤 메타데이터가 바뀌는 현상과 지표를 기술한 보고서를 공개했다.[1]

2026-10-08

OWASP GenAI Project가 Deadbugz를 2026년 3분기 정리에 포함했다. 이는 관심을 보여 줄 뿐 침해나 검색량을 입증하지 않는다.[2]

단계별 공격 실행 흐름

단계 1

설정 변경이 제안됨

pull request가 AI 프로젝트에 원격 또는 로컬 MCP 서버 설정을 추가한다. Pillar는 원격 endpoint 변경 17건, 숨겨진 로컬 스크립트 참조 4건, 디렉터리/목록 제출 2건을 검토했다.[1]

단계 2

초기 검토에는 평범한 도구가 보임

처음 서버는 텍스트 서식 지정과 요약 도구를 제공한다. Pillar에 따르면 짧은 테스트에는 이 무해한 메타데이터만 보일 수 있다.[1]

단계 3

일반 사용이 임계치에 도달함

서버가 클라이언트별 호출 횟수를 센다. 세 번 호출된 뒤 tools/list와 prompts/get 응답이 달라진다.[1], [5]

단계 4

에이전트가 신뢰할 수 없는 지시를 받음

이 지시는 연결된 에이전트를 민감한 로컬 정보로 유도하고 활동을 숨기려 한다. 캠페인 설명은 침해 확인을 뜻하지 않는다.[1], [3]

단계 5

승인을 정확한 메타데이터에 연결

클라이언트는 승인된 도구 정의의 fingerprint를 기록하고 달라지면 운영자가 검토할 때까지 중단해야 한다. 파일, 자격 증명, 네트워크 권한은 별도 정책으로 강제한다.[1], [4], [5]

소스 코드 비교: 취약한 구현 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

엔지니어링 및 시스템 보안 강화 체크리스트

출처