Phase 13: Tools & Protocols

امنیت MCP: متاداتا مسموم، مسیر و وضعیت MRTR

بدون تابعیت به معنای بی اعتماد بودن نیست، به این معنی است که هر درخواست شواهد مورد نیاز یک سرور و دروازه را برای تأیید تماس به طور مستقل نشان می دهد.

Type: Learn

Languages: Python

Prerequisites: Phase 13 · 07 (MCP server), Phase 13 · 08 (MCP client)

Time: ~60 minutes

اهداف یادگیری

  • توصیفات ابزار، تشریحات، اطلاعات مشتری و اطلاعات سرور را به عنوان داده های غیرقابل اعتماد در نظر بگیرید.
  • سم کردن متاداتا، تغییر در وصف و برخورد نام های میان سرورها را تشخیص بده.
  • متاداتا درخواست 2026-07-28 و سرنخ های روتینگ HTTP قابل جریان را تأیید کنید.
  • حفاظت از MRTRrequestStateدر برابر تعویض و پیوند تایید به استدلال های دقیق.
  • محدودیت مجوز و نرخ را برای یک مدیر اعمال کنید نه یک جلسه پروتکل حذف شده.

مشکل

یک مدل توصیفات ابزار را برای تصمیم گیری در مورد آنچه که باید تماس بگیرید می خواند. یک روتر نام ابزار را برای تصمیم گیری در مورد اینکه درخواست را به کجا ارسال کند می خواند. یک کاربر برچسب ها را برای تصمیم گیری در مورد آنچه که باید تأیید کند می خواند. یک توصیف کننده مخرب می تواند سه مورد را هدف قرار دهد.

دستورالعمل امنیتی رسمی MCP مستقیم است: توضیحات و تشریح ها باید به عنوان غیرقابل اعتماد در نظر گرفته شوند مگر اینکه از یک سرور قابل اعتماد باشند. حتی در این صورت، اعتماد انتشار می تواند تغییر کند. یک بروزرسانی سرور، بسته آسیب دیده، خطای ثبت یا ادغام دروازه می تواند آنچه را که مدل می بیند تغییر دهد.

پروتکل فعلی همچنین مرز امنیتی را تغییر می دهد. در سال 2026-07-28 هیچ دست دادن هسته ای و جلسه حمل و نقل وجود ندارد. یک طرح امنیتی که کلید تایید، محدودیت نرخ یا تاریخچه حسابرسی را تنها توسط Mcp-Session-Idنه طراحی فعلی

مفهوم

هفت سطح حمله که ارزش چک کردن رو داره

به جای دستورالعمل مبهم، از لیست مشخصی استفاده کنید تا مراقب باشید.

  1. Metadata poisoning.یک توصیف شامل دستورالعمل هایی است که با رفتار ابزار اعلام شده مرتبط نیست.
  2. Descriptor rug pull.تغییر نام، توصیف، طرح یا تشریح قبلاً تایید شده است.
  3. Cross-server shadowing.دو پس زمینه به عنوان یک ابزار بدون شرایط یکسان نشان می دهند و روتینگ به طور خاموش یکی را انتخاب می کند.
  4. Header and body confusion. Mcp-MethodیاMcp-Nameبا درخواست JSON-RPC مخالف است.
  5. Capability escalation.یک همتایان یک ویژگی افزونه یا مشتری را ادعا می کند و سرور این اعلامیه را برای مجوز اشتباه می کند.
  6. MRTR state tampering.يه مشتری عوض ميشهrequestState، به یک سوال متفاوت پاسخ می دهد، یا با استدلال های مختلف از تایید استفاده می کند.
  7. Supply-chain identity confusion.نام نمایش آشنا به عنوان اثبات هویت ناشر یا سرور مورد استفاده قرار می گیرد.

این سطوح همپوش می شوند. هاش پینینگ در تغییر توضیحات کمک می کند اما ثابت نمی کند که اولین توضیحات ایمن است. اسکن ثابت عبارت های واضح را اما دستورالعمل های ظریف را نمی گیرد. نام فضا سازی یک کلاس برخورد را از بین می برد اما سرور نامهای مخرب را نمی کند. کنترل ها را جمع کنید.

پاکت درخواست فعلی شواهد است نه هویت

هر درخواست 2026-07-28 شامل:

json{
  "_meta": {
    "io.modelcontextprotocol/protocolVersion": "2026-07-28",
    "io.modelcontextprotocol/clientCapabilities": {
      "elicitation": {"form": {}}
    },
    "io.modelcontextprotocol/clientInfo": {
      "name": "security-lab",
      "version": "1.0.0"
    }
  }
}

با تایید نسخه و شکل قابلیت در هر درخواست. از قابلیت ها برای انتخاب یک شکل پاسخ سازگار استفاده کنید. استفاده نکنید clientInfoبه عنوان یک مدیر معتبر.

همین هشدار برای io.modelcontextprotocol/serverInfoدر نتیجه متاداتا. این برای ثبت و اشکال زدایی مفید است. این گواهی، اثبات ثبت نام، یا تصمیم مجوز نیست.

اعتبار مسیر قبل از سیاست

برایtools/call, HTTP قابل پخش شامل:

textMCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: notes.export

روش سرش باید برابر با روش بدن باشد. نام سرش باید برابر باشد params.name. مخالفت با-32020قبل از انتخاب یک پس زمینه، استفاده از RBAC یا مصرف یک توکن محدودیت نرخ.

این ترتیب یک عدم وضوح مشترک را قطع می کند: یکی از اجزای بدن را مجاز می کند در حالی که دیگری از طریق سر را هدایت می کند.

اعتبارسنجی سیم یک دنباله دقیق را دنبال می کند. انواع JSON-RPC و متاداتا را تأیید کنید، مقایسه ارزش های سرایت با بدن را مقایسه کنید، سپس بررسی کنید که آیا نسخه مطابقت پذیر پشتیبانی می شود. سرایت نامتناسب HTTP 400 را با -32020اگر عنوان و بدن در یک نسخه غیر پشتیبانی شده توافق کنند، HTTP 400 را با -32022وdataدقیقاً{"supported":["2026-07-28"],"requested":"<actual>"}. یک روش ناشناخته HTTP 404 را با -32601. .

هر شی خطا شامل گزینه ای استdataوقتی قرارداد به اطلاعات بازیافت ساختار یافته نیاز دارد.id، بنابراین هیچ وقت یک پاسخ موفقیت یا خطا JSON-RPC دریافت نمی کند. یک اطلاعیه HTTP پذیرفته شده با یک جسم خالی 202 را باز می آورد.

کل توصيفگر رو ببين

یک هاش توصیف به تنهایی تغییرات اسکیما و تشریح را از دست می دهد. کَنونیکالیز و هاش کردن زمینه های توصیف کننده که کاربر تایید کرده است:

pythonnormalized = json.dumps(tool, sort_keys=True, separators=(",", ":"))
digest = hashlib.sha256(normalized.encode()).hexdigest()

اين ادغام رو تحت يه کلید معترفيه نگه دارnotes.export، همراه با شواهد ناشر و زمان تایید خارج از این مثال اسباب بازی

در هر تازه کاری:

  • کلید ناشناخته: قرنطینه تا بازبینی
  • همون کلید، هضم متفاوت: قرنطینه به عنوان یک کشش فرش تا دوباره تایید.
  • نام نام غیرمتصفونی دوگانه: نیاز به نام های تعیین کننده.
  • ضربه اسکنر: بلاک و بررسی کامل توصیف کننده.

مساوات هش ثابت است، نه ایمنی. یک توصیفگر مسموم وقتی کاملاً بسته می شود مسموم باقی می ماند.

اسکن ایستاتیک یک سیم سهگانه است

الگوهای ساده می توانند برچسب های نقش، تغییر دستورات، پنهان کردن، دسترسی مخفی و مقاصد شبکه پنهان را نشان دهند. آنها برای زمان نصب و CI به اندازه کافی ارزان هستند.

آنها مدرک معنوی نیستند. یک توصیف امن می تواند یک عبارت نشان داده شده در یک هشدار مشروع را شامل شود. یک توصیف مخرب می تواند از هر عبارت جلوگیری کند. از تولید اسکنر به عنوان شواهد بررسی، نه نمره معصومیت خودکار استفاده کنید.

فضای نام قبل از ادغام

فرض کن دو سرور هر دو رو افشا ميکننsearch. هرگز اجازه نده که فرمان کشف تصمیم بگیرد که کدام برنده است

textnotes.search
issues.search

نام واجد شرایط نام دروازه عمومی است. نقشه برداری پشت سر را جداگانه ثبت کنید. نام های ثابت تأیید، حسابرسی، هاش پین وMcp-Nameرویت کردن به همان شی اشاره دارد.

قابلیت ها اعلامیه های سازگاری هستند

به درخواستclientCapabilitiesبه سرور می گوید که کدام پروتکل ویژگی های مشتری می تواند پردازش کند. این اجازه دسترسی به ابزار، داده ها یا اقدامات مشتری را نمی دهد.

اجازه هنوز از سیاست اصلی و منابع معتبر می آید.

  1. اعتبارات حمل و نقل را تأیید کنید.
  2. نسخه، سرنخ ها و شکل درخواست را تایید کنید.
  3. موافقيت قابليت را چک کن
  4. اجازه دادن به اصل، ابزار، منابع و استدلال ها
  5. اجرا یا درخواست ورودی کاربر

محافظت از تایید MRTR بدون دولت

یک ابزار بعدی ممکن است نیاز به تأیید کاربر داشته باشد. MCP فعلی از درخواست های چند بار به جای تماس مجدد سرور به مشتری استفاده می کند.

اولين پاسخ:

json{
  "resultType": "input_required",
  "inputRequests": {
    "confirm": {
      "method": "elicitation/create",
      "params": {
        "mode": "form",
        "message": "Export notes to archive?",
        "requestedSchema": {
          "type": "object",
          "properties": {
            "confirm": {"type": "boolean"}
          },
          "required": ["confirm"]
        }
      }
    }
  },
  "requestState": "opaque-integrity-protected-value"
}

مشتری ورودی را دریافت می کند و روش اصلی را با یک ID JSON-RPC جدید دوباره امتحان می کند:

json{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "notes.export",
    "arguments": {"query": "private", "destination": "archive"},
    "requestState": "opaque-integrity-protected-value",
    "inputResponses": {
      "confirm": {
        "action": "accept",
        "content": {"confirm": true}
      }
    },
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientCapabilities": {
        "elicitation": {"form": {}}
      }
    }
  }
}

هرکدومinputRequestsارزش یک درخواست کامل دربرگیر شده با methodوparams. کلیدش باید با ورودی مربوطه در inputResponses. یک شکل از طریق یک ریشه شی استفاده می کندrequestedSchema، و مشتری باید قبل از اینکه سرور درخواست کند قابلیت درخواست فرم را اعلام کرده باشد.

قابلیت فعلی دو اعلامیه معتبر دارد.{"elicitation":{}}به طور ضمنی از شکل جلب حمایت می کند، در حالی که {"elicitation":{"form":{}}}به طور صریح می گوید. یک اعلامیه فقط برای URL مانند {"elicitation":{"url":{}}}سرور HTTP 400 را با -32021وdata.requiredCapabilitiesبرابر به {"elicitation":{"form":{}}}. .

درمانrequestStateدر مورد این موضوع، دروس HMAC و HMAC و HMAC را برای نشان دادن مرز قابل مشاهده استفاده می کنند. دروس HMAC و HMAC را برای نشان دادن مرز قابل مشاهده می کنند.

این دفترچه نباید در داخل یک شی دروازه زندگی کند. مدل قابل اجرا یک ذخیره بازخورد محدود و تراز شده TTL را تزریق می کند که می تواند توسط چندین نمونه دروازه به اشتراک گذاشته شود. ادعای اتمی آن مرز اجرای است: تنها پذیرش تایید شده یا کاهش صریح ترمینال حالت را مصرف می کند. یک پاسخ نادرست یا cancelهیچ کاری انجام نمی دهد و تا زمان انقضاء قابل بازیافت باقی می ماند. یک ناوگان تولید به همان ادعای مشروط در ذخیره سازی پایدار مشترک نیاز دارد.

در یک جلسه پروتکل، زمینه تایید پنهان را ذخیره نکنید. هر نمونه سرور باید بتواند دوباره آزمایش را تأیید کند.

قاعده دوم برای تماس های با ریسک بالا

یک تماس را در سه محور طبقه بندی کنید:

  • اين اطلاعات غير قابل اعتماد رو مصرف ميکنه
  • می تونه به اطلاعات حساس دسترسی داشته باشه
  • این باعث یک عمل خارجی در نتیجه می شود.

یک مرحله خودکار نباید سه مرحله را ترکیب کند. آن را تقسیم کنید، امتیازات را کاهش دهید یا از طریق MRTR واردات صریح کاربر را درخواست کنید. این یک قابلیت طراحی هوریستی است، نه یک قابلیت پروتکل.

کاهش صلاحیت قبل از اعدام

بی شهرت به تنهایی ایمنی نیست. این تاریخچه پروتکل پنهان را حذف می کند، اما یک درخواست مستقل هنوز هم می تواند از یک عامل دارای قدرت بیش از حد خواسته شود تا داده ها را به ذره برساند یا تغییر غیر قابل برگشت ایجاد کند. امنیت از کاهش قدرت در هر مرز ناشی می شود:

  1. Typed verb.یک عملیات محدود را نشان دهید مانندarchive_note، نه يه دارو عامrunیاrequestابزار که می تواند قدرت های مرتبط را بیان کند.
  2. Validated arguments.از یک طرح بسته استفاده کنید که در آن عملی باشد، زمینه های ناشناخته را رد کنید، شناسایی کننده ها را یک بار عادی کنید، اندازه های کیپ، و قبل از ارزیابی سیاست، مقصد، مستاجر و مالکیت منابع را تأیید کنید.
  3. Current authorization.اصل معتبر را به فعل دقیق، منبع، محیط و استدلال های عادی متصل کنید. تشریحات ابزار و قابلیت های مشتری این اختیار را نمی دهد.
  4. Action-bound approval.برای یک تماس نتیجه ای، تایید را به یک ضریب فعل تایپ شده و استدلال های عادی شده، به علاوه سیاست اصلی، انقضاء و یک بار، متصل کنید. هر زمینه ای که تغییر کند، نیاز به تصمیم جدید دارد.
  5. First-class refusal.رد مدل، تصویب به پایان رسیده، کاهش کاربر و مقصد غیر امن به عنوان نتایج معمولی که هیچ عوارض جانبی انجام نمی دهند. رد را به یک ابزار ضعیف تر تبدیل نکنید.
  6. Redacted audit evidence.ثبت کنید که چه کسی پرسید، چه نسخه ای از توصیف کننده و سیاست مورد استفاده قرار گرفت، هدف عادی سازی چه چیزی مجاز بود، چرا تصمیم اجازه داده یا رد شده و اینکه اجرای اجرا شروع شد.

هر مرحله محدود می کند که بخش بعدی چه کاری انجام می دهد. مدیر نهایی باید یک دستور دامنه تایید شده را دریافت کند، نه متن مدل خام و همچنین اعتبارات گسترده. کل زنجیره را در یک آزمایش مجدد MRTR، به روزرسانی وظیفه یا تماس دروازه ای تکرار کنید. تأیید قبلی درخواست های بعدی را به ترافیک جلسه قابل اعتماد تبدیل نمی کند.

مسیرهای تعامل فعلی و قدیمی

ریشه ها، نمونه گیری و ثبت نام برای پیاده سازی های جدید 2026-07-28 منسوخ شده است. یک دروازه می تواند کد کانال درخواست قدیمی را فقط به عنوان یک مسیر سازگاری نسخه ای حفظ کند.

در مورد یک محدودیتی نمونه گیری در هر جلسه دفاعی جدیدی ایجاد نکنید. به عنوان منبع، صادر کننده، منبع، ابزار و پنجره زمانی معتبر، کوتا ها را اعمال کنید. برای کار تعاملی فعلی، درخواست های ورودی و پاسخ های MRTR را بررسی کنید.

چک های حمل و نقل بی تابعیت

  • پیام های مدرن MCP را در نقطه ی آخر POST واحد پذیرفت.
  • 405 رو برگردونيد براي GET و DELETE مدرن
  • نه به این موضوع وابسته باشیدMcp-Session-Id. .
  • جلسه قدیمی را نادیده بگیرید و عنوان ها را به عنوان ورودی های اختیار باز کنید.
  • JSON یا SSE درخواست شده را برای آن POST برگردانید.
  • استفاده کنیدsubscriptions/listenفقط برای اطلاعیه های تغییر طولانی مدت که از آن استفاده می شود.

آن را بسازید

code/main.pyیک مدل کوچک در حال اجرا در فرآیند دروازه امنیتی. آن را کَنونیک و پین کامل ابزار توصیفات، گزارش های سم و سایه متادتا، اعتبار مدرن درخواست پاکت و ارزش های مسیریابی و انجام دو دور تایید صادرات با امضا requestStateو یک فروشگاه بازخورد مشترک تزریق شده

این مدل پس از اینکه یک آداپتور HTTP بدن JSON و سرنخ های روتینگ را تجزیه و تحلیل کرده است شروع می شود.Content-TypeیاAccept. همان فرستنده را به آداپتور HTTP Streamable کامل درسی 09 متصل کنید که نیاز داردContent-Type: application/jsonو یکAcceptارزش حاوی هر دوapplication/jsonوtext/event-stream. .

اجرا کن

bashcd phases/13-tools-and-protocols/15-mcp-security-tool-poisoning
python3 code/main.py
python3 -m unittest discover code/tests -v

نمونه عمدا یک توصیفگر را جهش می دهد. اسکنر و مقایسه هضم یافته های مستقل را تولید می کند. صادرات سپس نشان می دهد که input_requiredپاسخ و تلاش مجدد بدون دولت

ازش استفاده کن

جایگزینش کنSAFE_TOOLSبا یک عکس فوری عادی از سرورهای تایید شده خود را. اعتبارات و اسرار را از عکس فوری نگه دارید. قبل از بروز رسانی هضم آن هر توصیفگر جدید یا تغییر یافته را بررسی کنید.

در یک دروازه، همان چک ها را در هنگام کشف و دوباره قبل از ارسال اجرا کنید. یک کش می تواند کار کشف را کاهش دهد، اما تأییدیه ای که در کش ذخیره شده است باید به پایان برسد یا با تغییر توصیف کننده باطل شود.

-باده

اين درس به ما ميگيرهoutputs/skill-mcp-threat-model.md. این یک مدل تهدید پروتکل فعلی در سراسر متاداتا، روتینگ، قابلیت، مجوز، MRTR، کیشینگ، ثبت نام و مرزهای سازگاری تولید می کند.

تمرینات

  1. تصمیم اصلی و فعلی مجوز را به وضعیت MRTR مهر شده متصل کنید، سپس یک تلاش مجدد تحت یک اصل مختلف را رد کنید.
  2. ذخیره بازیابی در حافظه را با یک ورودی مشروط مداوم جایگزین کنید و ثابت کنید که دو فرآیند نمی توانند هر دو یک از آنها را یک نونس ادعا کنند.
  3. بعد از تکرار درخواست شکست را تزریق کنید اما قبل از صادرات شبیه سازی شده. تعریف و آزمایش قانون معامله یا بی اختیار را که بازیابی را ایمن می کند.
  4. ابزار رو عوض کنinputSchemaبدون اينکه تصفيه اش رو عوض کني.
  5. اضافه کردن یک سیاست که از ذخیره سازی عمومی انکار می کند وقتیtools/listبا اساس متفاوت است.
  6. مدل سرور قدیمی تر پشت دروازه قرار بده. تمام دست دادن و رفتار جلسه رو پشت یک2025-11-25بخش سازگاری

اصطلاحات کلیدی

TermMeaning
Metadata poisoningInstructions or deceptive claims embedded in a tool descriptor
Rug pullChange to a previously approved descriptor
Tool shadowingAmbiguous routing caused by duplicate unqualified names
Header mismatchRouting header and JSON-RPC body disagreement, error -32020
Hash pinDigest of the complete approved descriptor
MRTRStateless response and retry pattern for server-requested input
requestStateOpaque round-trip value that must be treated as untrusted input
Capability declarationStatement of protocol compatibility, not authorization
Implicit form supportAn empty elicitation capability object, equivalent to form support
Qualified tool nameStable gateway name such as notes.search

خواندن بیشتر

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.