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 المباشرة.
  • حماية MRTR requestStateضد التلاعب والربط بالتحديد بالثباتات
  • تطبيق الحدود السموحة والسعر على الرئيسي، وليس جلسة بروتوكول إزالتها.

المشكلة

يقرأ نموذج وصف الأداة لتحديد ما يجب الاتصال به. يقرأ جهاز توجيه أسماء الأداة لتحديد أين يرسل طلبًا. يقرأ المستخدم علامات لتحديد ما يجب الموافقة عليه. يمكن أن يستهدف وصفًا ضارًا واحدًا الثلاثة.

إن إرشادات الأمن الرسمية للمكسب هي مباشرة: يجب التعامل مع التصفيات والإشارات كغير موثوق بها ما لم تأتي من خادم موثوق به. حتى في ذلك الحين، يمكن أن يتغير ثقة التنفيذ. يمكن تحديث الخادم أو حزمة مخاطر أو خطأ سجل أو دمج بوابة التسجيل أن يغير ما يراه النموذج.

البروتوكول الحالي يغير أيضا حدود الأمن. في 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، مع دليل الناشر وقتا الموافقة خارج هذا مثال اللعبة.

في كل إطراء:

  • مفتاح مجهول: الحجر الصحي حتى المراجعة.
  • نفس المفتاح، مختلفة التهضم: الحجر الصحي كمساحة السجاد حتى يتم إعادة الموافقة عليها.
  • اسم غير مؤهل مزدوج: يتطلب مساحة أسماء محددة.
  • ضربة المسح: حظر ومراجعة المصف الكامل.

إنّ المساواة تثبت الاستقرار، وليس السلامة.

المسح الدوري هو سلك ثلاثي

يمكن أن تكون النماذج البسيطة علامات على الأدوار، وتعديل التعليمات، والخفاء، والوصول السري، وجهات الشبكة المظلمة. فهي رخيصة بما فيه الكفاية للوقت التثبيت ومعلوماتية.

لا يعدون دليلًا تعنييًا. يمكن أن يحتوي وصف آمن على عبارة معينة في تحذير مشروع. يمكن أن يتجنب وصفًا ضارًا كل عبارة. تعامل نتائج المسحون كدليل مراجعة ، وليس نتيجة براءة تلقائية.

مساحة الأسماء قبل الاندماج

لنفترض أن خادمين يكتشفون كل منهما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"
}

يحصل العميل على المدخل ويعيد تجربة الطريقة الأصلية مع معرف 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 والحجج الدقيقة مطابقة لجعل الحدود مرئية.

لا يجب أن يعيش دفتر غير موجود داخل كائن بوابة واحد. يقوم النموذج المتمشي بتقديم مخزن إعادة التشغيل المحدود المقطوع 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 المُباشر الكامل للدروس 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.