업데이트로 돌아가기
New releaseAug 20, 2026

mcp-server-attestation v0.2.0

MCP 서버용 Layer-2 공급망 보안 강화 — Ed25519 서명 도구 매니페스트, 런타임 spawn-증명, 기본 거부(default-deny) 인자 샌니타이저. 마켓플레이스 오염 + CVE-2025-69256 + CVE-2025-61591 공격을 방어합니다.

공유

StudioMeyer MCP Stack의 일부 — Mallorca에서 제작 🌴 · 사용한다면 ⭐를 눌러주세요

mcp-server-attestation

npm version npm downloads License Last commit GitHub stars

Model Context Protocol 서버를 위한 레이어-2 공급망 강화. Ed25519 서명 툴 매니페스트, 런타임 spawn 증명, 기본 거부(default-deny) 인자 샌니타이저.

다음에 대한 직접적인 대응:

  • OX Security 마켓플레이스 오염, 2026년 4월 — MCP 레지스트리 11곳 중 9곳이 악성 서버를 수용했습니다. Anthropic이 공식적으로 밝힌 입장: "예상된 동작".
  • CVE-2025-69256child_process.exec() 명령 삽입을 통한 Serverless Framework MCP RCE.
  • CVE-2025-61591 — spawn 하이재킹을 동반한 OAuth 설치 악성 서버를 통한 Cursor MCP RCE.

이 패키지는 Anthropic이 제공하지 않기로 선택한 것을 제공합니다: 서버가 노출할 수 있는 툴과 실행할 수 있는 spawn 호출에 대한 암호화 검증입니다. 런타임을 대체하는 것이 아니라 바로 끼워 쓸 수 있는(drop-in) 의존성입니다.

우리의 한마디

우리는 지난 2년 동안 우리 자신을 위한 도구와 시스템을 만들어 왔습니다. 이 저장소가 작고 별이 적은 이유는 새로 만들어졌기 때문이 아닙니다. 우리가 만든 것을 공유하기로 결정한 게 이제서야였기 때문입니다. 이것은 새로운 실험이 아니라, 최근 커밋이 있는 오랜 이야기입니다.

우리는 무언가를 만들고 공유하는 것을 좋아합니다. 소셜 미디어 전술, 성장 해킹, 별과 팔로워 쫓기는 좋아하지 않습니다. 그래서 이 저장소는 작습니다. 코드는 진짜이며, 실제로 사용되고, 이슈는 답변을 받습니다. 직접 판단해 보세요.

여러분에게 도움이 된다면, 공유와 테스트, 피드백이 우리에게도 도움이 됩니다. 더 나아질 수 있다면, 이슈를 올려주는 것이 더 유용합니다. 이걸로 무언가를 만든다면 [email protected]로 알려주세요. 정말 기분 좋은 일이 됩니다.

Palma de Mallorca의 작은 스튜디오에서.

패키지 (npm 워크스페이스)

패키지용도
mcp-server-attestation (packages/lib)라이브러리: Ed25519 서명/검증, 매니페스트 스키마, 샌니타이저, spawn 증명기, TOFU 신뢰 저장소.
mcp-attest-cli (packages/cli)CLI mcp-attest: keygen, sign, verify, inspect, fingerprint, check-pin.
mcp-attest-demo (packages/demo-server)라이브러리를 시연하는 5가지 툴을 노출하는 참조 MCP 서버 (stdio, spec 2025-06-18).

설치

npm install mcp-server-attestation
# CLI:
npm install -g mcp-attest-cli
# Reference MCP server:
npx mcp-attest-demo

Node 20+. 외부 암호화 의존성 없음 — node:crypto Ed25519 프리미티브를 사용.

다섯 줄 서버 빠른 시작

import { verifyManifestStrict, attestSpawnStrict, type SignedManifest } from "mcp-server-attestation";
import signed from "./signed/manifest.json" assert { type: "json" };

// 1. At startup: prove the manifest you ship is the manifest you signed.
verifyManifestStrict(signed);

// 2. Before every child_process.spawn:
attestSpawnStrict(signed as SignedManifest, { command, args });

이것이 전체 통합입니다. 함수 호출 두 번, SaaS도 데몬도 없습니다.

모든 spawn에서 서명을 다시 검증하고 싶다면(검증되지 않았거나 교체된 매니페스트가 게이트에 도달하는 것에 대한 심층 방어), 단일 안전장치 호출을 대신 사용하세요 — 이 호출은 검증한 다음 증명합니다:

import { attestSpawnVerified, type SignedManifest } from "mcp-server-attestation";
attestSpawnVerified(signed as SignedManifest, { command, args });

툴 (참조 서버 mcp-attest-demo)

#이름readOnlyHintdestructiveHint
1attest_verify_manifesttruefalse
2attest_inspect_spawntruefalse
3attest_generate_manifest_templatetruefalse
4attest_sign_manifestfalsefalse
5attest_keygenfalsefalse

어노테이션은 정직합니다: attest_sign_manifestattest_keygen은 디스크에 파일을 쓰므로 읽기 전용이 아니지만, 기존 데이터를 파괴하지 않으므로 destructiveHint는 false로 유지됩니다. 툴별 기능 표는 docs/THREAT-MODEL.md를 참조하세요.

CLI

mcp-attest keygen --out-dir ./keys --name prod
mcp-attest sign --manifest manifest.json --private-key keys/prod.key --out signed.json
mcp-attest verify --signed signed.json --pin                  # TOFU pin
mcp-attest verify --signed signed.json --sigstore             # opt-in Rekor cross-ref
mcp-attest inspect --signed signed.json --command /usr/bin/echo --arg "hello"
mcp-attest fingerprint --public-key keys/prod.pub
mcp-attest check-pin --server my-server --signed signed.json

verify는 잘못된 서명이면 코드 2로, 핀 불일치 시 코드 3으로 종료합니다.

MCP 스펙 호환성

스펙 버전상태
2024-11-05매니페스트에서 파싱 가능, 참조 서버 대상 아님
2025-03-26매니페스트에서 파싱 가능, 참조 서버 대상 아님
2025-06-18전체 대상

라이브러리는 전송 방식에 독립적입니다. 참조 서버는 stdio 전용입니다.

보안 모델

  • **최초 사용 신뢰(Trust-on-First-Use)**가 기본값입니다. 서버를 처음 검증하면 해당 공개 키가 ~/.mcp-attest/trust.json에 고정됩니다(재정의: MCP_ATTEST_TRUST_FILE). 이후 검증에서는 동일한 서버 이름에 대한 새 키를 TRUST_PIN_MISMATCH로 거부합니다. 이로써 Cursor 방식의 악성 업데이트 벡터를 잡아냅니다.
  • 번들 신뢰 키 목록 없음. 이 패키지는 게이트키퍼 역할을 하지 않습니다. 더 강력한 보증을 원한다면 --sigstore를 선택하여 공개 키 지문을 Sigstore Rekor 투명성 로그와 상호 참조할 수 있습니다.
  • 기본 거부(default-deny) 인자 샌니타이저. shellSafeString은 모든 ASCII 셸 메타 문자, NUL, CR, LF, VT, FF, NEL, 제로 너비 문자, BOM, RTL/LTR 오버라이드, Trojan-Source 아이솔레이트, 전각 라틴 혼동 문자(confusables)를 차단합니다. 허용 목록 동작은 명시적인 regex / enum / prefix / literal 규칙 종류가 필요합니다.
  • ReDoS 안전 regex 규칙. regex 규칙의 패턴은 작성자가 서명하지만 인자 값은 공격자가 제어합니다. 샌니타이저는 역추적(backtracking)이 발생하기 쉬운 패턴((a+)+ 같은 중첩 무제한 수량자)을 정적으로 감지하고 실행을 거부하므로, 조작된 단일 인자로 spawn 핫 경로를 멈출 수 없습니다. regex 규칙은 또한 maxLength 입력 상한(기본값 4096)을 갖습니다.
  • 트래버설 안전 prefix 규칙. prefix 규칙은 기본적으로 .. 경로 구성 요소를 거부합니다(denyTraversal: true, %2e%2e 인코딩 형태 포함). 따라서 /safe/../../etc/passwdprefix: "/safe/"를 충족하더라도 차단됩니다.
  • 검증 후 증명(Verify-then-attest). attestSpawnVerified는 하나의 안전장치 호출로 spawn을 증명하기 전에 매니페스트 서명을 확인합니다. 진짜 핫 루프에서 spawn별 Ed25519 검증 비용을 측정하지 않았다면 attestSpawnStrict 대신 이것을 사용하세요.
  • **표준 JSON(Canonical JSON)**이 서명 대상입니다. 재직렬화는 서명된 바이트를 변경할 수 없습니다.

이 패키지가 하지 않는 일 (범위 외):

  • 서버 프로세스를 샌드박스 또는 컨테이너화하지 않습니다.
  • OAuth 흐름 강화(별도 mcp-oauth-shield 빌드).
  • 네트워크 이그레스(egress) 제어.
  • 기존 서버 자동 패치.

테스트

npm install
npm run typecheck
npm test

테스트 코퍼스에는 CVE 재현 픽스처(packages/lib/tests/fixtures/cve-2025-69256-payloads.json, cve-2025-61591-payloads.json)가 포함됩니다. 빌드는 회귀 검사입니다: 모든 페이로드가 차단되어야 합니다.

배포

  • --provenance와 함께 GitHub Actions OIDC를 통한 npm 게시.
  • 참조 서버를 mcp.so와 FastMCP Directory에 제출.
  • 라이브러리는 mcp-server-attestation으로 별도 게시.

StudioMeyer 소개

StudioMeyer는 Palma de Mallorca에 기반을 둔 AI 및 디자인 스튜디오로, 전 세계 고객과 협업합니다. 우리는 중소기업을 위한 맞춤형 웹사이트와 AI 인프라를 구축합니다. 프로덕션 스택은 Claude Agent SDK, MCP, n8n 기반이며, Sentry, Langfuse, LangGraph로 옵저버빌리티와 자체 가드 레이어를 운영합니다.

라이선스

MIT, Copyright 2026 Matthias Meyer (StudioMeyer). LICENSE 참조.

카테고리