
MCP 서버용 Layer-2 공급망 보안 강화 — Ed25519 서명 도구 매니페스트, 런타임 spawn-증명, 기본 거부(default-deny) 인자 샌니타이저. 마켓플레이스 오염 + CVE-2025-69256 + CVE-2025-61591 공격을 방어합니다.
StudioMeyer MCP Stack의 일부 — Mallorca에서 제작 🌴 · 사용한다면 ⭐를 눌러주세요
다음에 대한 직접적인 대응:
child_process.exec() 명령 삽입을 통한 Serverless Framework MCP RCE.이 패키지는 Anthropic이 제공하지 않기로 선택한 것을 제공합니다: 서버가 노출할 수 있는 툴과 실행할 수 있는 spawn 호출에 대한 암호화 검증입니다. 런타임을 대체하는 것이 아니라 바로 끼워 쓸 수 있는(drop-in) 의존성입니다.
우리는 지난 2년 동안 우리 자신을 위한 도구와 시스템을 만들어 왔습니다. 이 저장소가 작고 별이 적은 이유는 새로 만들어졌기 때문이 아닙니다. 우리가 만든 것을 공유하기로 결정한 게 이제서야였기 때문입니다. 이것은 새로운 실험이 아니라, 최근 커밋이 있는 오랜 이야기입니다.
우리는 무언가를 만들고 공유하는 것을 좋아합니다. 소셜 미디어 전술, 성장 해킹, 별과 팔로워 쫓기는 좋아하지 않습니다. 그래서 이 저장소는 작습니다. 코드는 진짜이며, 실제로 사용되고, 이슈는 답변을 받습니다. 직접 판단해 보세요.
여러분에게 도움이 된다면, 공유와 테스트, 피드백이 우리에게도 도움이 됩니다. 더 나아질 수 있다면, 이슈를 올려주는 것이 더 유용합니다. 이걸로 무언가를 만든다면 [email protected]로 알려주세요. 정말 기분 좋은 일이 됩니다.
Palma de Mallorca의 작은 스튜디오에서.
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)어노테이션은 정직합니다: attest_sign_manifest와 attest_keygen은 디스크에 파일을 쓰므로 읽기 전용이 아니지만, 기존 데이터를 파괴하지 않으므로 destructiveHint는 false로 유지됩니다. 툴별 기능 표는 docs/THREAT-MODEL.md를 참조하세요.
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으로 종료합니다.
| 스펙 버전 | 상태 |
|---|---|
| 2024-11-05 | 매니페스트에서 파싱 가능, 참조 서버 대상 아님 |
| 2025-03-26 | 매니페스트에서 파싱 가능, 참조 서버 대상 아님 |
| 2025-06-18 | 전체 대상 |
라이브러리는 전송 방식에 독립적입니다. 참조 서버는 stdio 전용입니다.
~/.mcp-attest/trust.json에 고정됩니다(재정의: MCP_ATTEST_TRUST_FILE). 이후 검증에서는 동일한 서버 이름에 대한 새 키를 TRUST_PIN_MISMATCH로 거부합니다. 이로써 Cursor 방식의 악성 업데이트 벡터를 잡아냅니다.--sigstore를 선택하여 공개 키 지문을 Sigstore Rekor 투명성 로그와 상호 참조할 수 있습니다.shellSafeString은 모든 ASCII 셸 메타 문자, NUL, CR, LF, VT, FF, NEL, 제로 너비 문자, BOM, RTL/LTR 오버라이드, Trojan-Source 아이솔레이트, 전각 라틴 혼동 문자(confusables)를 차단합니다. 허용 목록 동작은 명시적인 regex / enum / prefix / literal 규칙 종류가 필요합니다.regex 규칙. regex 규칙의 패턴은 작성자가 서명하지만 인자 값은 공격자가 제어합니다. 샌니타이저는 역추적(backtracking)이 발생하기 쉬운 패턴((a+)+ 같은 중첩 무제한 수량자)을 정적으로 감지하고 실행을 거부하므로, 조작된 단일 인자로 spawn 핫 경로를 멈출 수 없습니다. 규칙은 또한 입력 상한(기본값 4096)을 갖습니다.이 패키지가 하지 않는 일 (범위 외):
mcp-oauth-shield 빌드).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-server-attestation으로 별도 게시.StudioMeyer는 Palma de Mallorca에 기반을 둔 AI 및 디자인 스튜디오로, 전 세계 고객과 협업합니다. 우리는 중소기업을 위한 맞춤형 웹사이트와 AI 인프라를 구축합니다. 프로덕션 스택은 Claude Agent SDK, MCP, n8n 기반이며, Sentry, Langfuse, LangGraph로 옵저버빌리티와 자체 가드 레이어를 운영합니다.
MIT, Copyright 2026 Matthias Meyer (StudioMeyer). LICENSE 참조.
| 패키지 | 용도 |
|---|
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). |
| # | 이름 | readOnlyHint | destructiveHint |
|---|
| 1 | attest_verify_manifest | true | false |
| 2 | attest_inspect_spawn | true | false |
| 3 | attest_generate_manifest_template | true | false |
| 4 | attest_sign_manifest | false | false |
| 5 | attest_keygen | false | false |
regexmaxLengthprefix 규칙. prefix 규칙은 기본적으로 .. 경로 구성 요소를 거부합니다(denyTraversal: true, %2e%2e 인코딩 형태 포함). 따라서 /safe/../../etc/passwd는 prefix: "/safe/"를 충족하더라도 차단됩니다.attestSpawnVerified는 하나의 안전장치 호출로 spawn을 증명하기 전에 매니페스트 서명을 확인합니다. 진짜 핫 루프에서 spawn별 Ed25519 검증 비용을 측정하지 않았다면 attestSpawnStrict 대신 이것을 사용하세요.