چیت‌شیت

امنیت و احراز هویت MCP

MCP Security and Authorization

شناسایی و رفع امتناع توکن، مسموم‌سازی متادیتای ابزار و محتوای تزریق‌شده. بررسی‌های CIMD، PKCE، iss، audience و PVE.

  • ۱۱ بخش
  • ۴ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. امتناع‌های توکن
  2. یافته‌های گیت‌وی و محتوا
  3. ترتیب اعتبارسنجی روی سرور منبع
  4. کد احراز هویت همراه با PKCE
  5. وظایف در کد
  6. الگوی PVE: اعتبارسنجی قبل از اجرا
  7. مسیرهای ثبت‌نام کلاینت
  8. هفت سطح حمله
  9. قوانین
  10. پرسش‌ها
  11. مخفف‌ها

امتناع‌های توکن

عیب‌یابی
  • 401 malformed

    علت
    توکن رمزگشایی نمی‌شود
    راه‌حل
    ارسال JWT معتبر در Authorization
  • 401 iss not allowed

    علت
    صادرکننده در allowed_issuers نیست
    راه‌حل
    فقط به صادرکنندگان authorization_servers اعتماد شود
  • 401 unknown kid

    علت
    کلید پس از یک واکشی مجدد مفقود است
    راه‌حل
    اصلاح جاب تازه‌سازی JWKS
  • 401 bad signature

    علت
    امضا تأیید اعتبار نمی‌شود
    راه‌حل
    رد درخواست. هیچ طرح پشتیبانی وجود ندارد
  • 401 audience mismatch

    علت
    توکن برای منبع دیگری است
    راه‌حل
    درخواست مجدد توکن با همین resource
  • 401 expired

    علت
    exp در گذشته است
    راه‌حل
    دریافت یک توکن جدید
  • 403 insufficient_scope

    علت
    ابزار نیازمند دامنه‌ی بزرگ‌تری است
    راه‌حل
    ارتقا (Step up) با دامنه‌های ترکیب‌شده، شناسه جدید
  • توکن‌های معتبر پس از تغییر کلید ناموفق می‌شوند

    علت
    کش JWKS کهنه و منقضی است
    راه‌حل
    تازه‌سازی زمان‌بندی‌شده به‌همراه یک واکشی مجدد در صورت miss

یافته‌های گیت‌وی و محتوا

عیب‌یابی
  • یافته‌ی metadata_poisoning

    علت
    تطابق اسکنر در یک توصیف (description)
    راه‌حل
    مسدودسازی و بررسی توصیف‌گر کامل
  • یافته‌ی rug_pull

    علت
    توصیف‌گر تأییدشده تغییر کرده است
    راه‌حل
    قرنطینه تا تأیید مجدد
  • یافته‌ی unapproved

    علت
    هیچ دایجست تأییدشده‌ای برای کلید وجود ندارد
    راه‌حل
    قرنطینه تا زمان بررسی
  • یافته‌ی shadowing

    علت
    دو سرور یک نام را اکسپوز کرده‌اند
    راه‌حل
    قراردادن در فضای نام، مثلاً notes.search
  • -32020

    علت
    Mcp-Method یا Mcp-Name با بدنه همخوانی ندارد
    راه‌حل
    رد درخواست پیش از مسیریابی، RBAC و محدودیت نرخ درخواست
  • -32021 در یک درخواست فرم

    علت
    کلاینت فقط استخراج ورودی مبتنی بر URL را اعلام کرده
    راه‌حل
    اعلام پشتیبانی فرم از elicitation
  • تکرار درخواست پس از تأیید رد شد

    علت
    requestState به آرگومان‌های دیگری مقید شده
    راه‌حل
    درخواست تأیید مجدد
  • ایجنت از یک صفحه‌ی وب اطاعت می‌کند

    علت
    عدم وجود برچسب منبع روی محتوای دریافت‌شده
    راه‌حل
    برچسب‌گذاری محتوا و اعتبارسنجی هر فراخوانی ابزار

ترتیب اعتبارسنجی روی سرور منبع

گام‌به‌گام
  1. رمزگشاییjwt_decode ناموفق است. بازگرداندن 401 malformed.
  2. صادرکنندهiss در allowed_issuers نیست. بازگرداندن 401 پیش از هرگونه واکشی JWKS.
  3. کلیدجستجوی kid در jwks_cache. در صورت miss، فراخوانی refresh_jwks برای یک‌بار.
  4. امضاjwt_verify ناموفق است. بازگرداندن 401 bad signature.
  5. مخاطبaud این منبع نیست. بازگرداندن 401 audience mismatch.
  6. انقضاexp در گذشته است. بازگرداندن 401 expired.
  7. دامنهدامنه‌ی لازم وجود ندارد. بازگرداندن 403 insufficient_scope همراه با دامنه.

کد احراز هویت همراه با PKCE

گام‌به‌گام
  1. کلاینتواکشی فراداده‌ی منبع حفاظت‌شده. انتخاب یک صادرکننده‌ی اعلام‌شده.
  2. کلاینتساخت یک code_verifier و code_challenge با الگوریتم S256 از طریق pkce_pair.
  3. کلاینتارسال client_id، redirect_uri، scope، code_challenge و resource.
  4. سرور احراز هویتبازگرداندن code و iss.
  5. کلاینتتطبیق دقیق iss با صادرکننده‌ی ثبت‌شده. در صورت عدم تطابق، کنار گذاشتن پاسخ.
  6. کلاینتمبادله‌ی کد با code_verifier، همان URI ریدایرکت و resource.
  7. کلاینتذخیره‌ی توکن ذیل (issuer, resource) در tokens_by_issuer_resource.

وظایف در کد

کار و کد
وظیفهکد
پین‌کردن کل یک توصیف‌گرdescriptor_digest(tool)
اسکن یک کاتالوگ در برابر پین‌هاscan_catalog(catalog, approved)
اسکن یک توصیفscan_description(description)
ساخت یک جفت PKCEverifier, challenge = pkce_pair()
ارتقای دامنه هنگام دریافت 403client.call_with_step_up(tool, server, auth)
اعتبارسنجی یک توکن Bearerserver.validate(bearer_token, required_scope=<s>)
واکشی مجدد مجموعه‌کلیدserver.refresh_jwks()
اجرای تست‌های درسpython3 -m unittest discover code/tests -v

الگوی PVE: اعتبارسنجی قبل از اجرا

کد
python
validator = Validator(
    allowed_tools=("search", "send_message", "read_memory"),
    sensitive_tools=("send_message",))
call = ToolCall("search", {"query": "<query>"}, intent="research")
contents = [Content("<text>", "user_message")]  # متن کاربر اسکن نمی‌شود
ok, reason = validator.assess(call, contents)   # لیست مجاز، آرگومان‌ها، متن دریافت‌شده
if ok:
    executor.run(call)                          # اجرا فقط پس از تأیید
looks_like_directive("<text>")                  # اولین تطابق مارکر یا None
memory_write_guard(MemoryWrite("<text>"))       # امتناع از نوشتن‌های شبه‌دستوری

مسیرهای ثبت‌نام کلاینت

مقایسه
عاملاز قبل ثبت‌شدهCIMDDCR
وضعیتدر صورت وجود، اولویت اول استترجیح‌داده‌شدهطرح پشتیبان منسوخ
شناسه‌ی کلاینتاز طرف اپراتورنشانی وب HTTPS دارای pathتولیدشده توسط POST /register
سیگنال ASرابطه‌ی شناخته‌شدهclient_id_metadata_document_supportedregistration_endpoint
application_typeالزامی نیستاختیاریالزامی: native یا web
صادرکننده‌ی جدیداعتبارنامه‌های جدیدURL قابل‌حمل باقی می‌ماندثبت‌نام مجدد
ریسک اصلیاستفاده‌ی مجدد در یک صادرکننده‌ی جدیدآسیب‌پذیری SSRF هنگام واکشیاسپم ثبت‌نام، سرقت توکن

هفت سطح حمله

مفهوم‌ها
مسموم‌سازی متادیتا
یک توصیف حاوی دستورالعمل‌های نامربوط به ابزار است.
عوض کردن زیرپوستی توصیف‌گر
یک نام، توصیف، اسکیما یا حاشیه‌نویسیِ تأییدشده تغییر می‌کند.
سایه‌اندازی میان‌سروری
دو بک‌اند یک نام نامشخص و بدون پیشوند را اکسپوز می‌کنند.
تداخل هدر و بدنه
Mcp-Method یا Mcp-Name با بدنه ناهمخوان است.
تشدید قابلیت
یک قابلیت اعلام‌شده به‌عنوان مجوز دسترسی برداشت می‌شود.
دستکاری وضعیت MRTR
یک requestState تغییریافته یا تأییدیه‌ی بازاستفاده‌شده.
اشتباه‌گیری هویت
یک نام نمایشی آشنا به‌عنوان اثبات هویت ناشر تلقی می‌شود.

قوانین

نکته‌ها
  • توکن Bearer را در تمام درخواست‌ها داخل هدر Authorization ارسال کنید. هرگز در URL نفرستید.
  • جریان کاری OAuth را به سرور محلی stdio اضافه نکنید.
  • هرگز توکن MCP را به APIهای پایین‌دستی هدایت نکنید. یک توکن جداگانه بگیرید.
  • iss را دقیق مقایسه کنید. بدون تغییر در حروف بزرگ/کوچک، اسلش یا پورت.
  • سرور منبع JWKS را تازه می‌کند. چرخش کلیدها فقط به عهده‌ی سرور احراز هویت است.
  • در صورت از کار افتادن درون‌نگری (introspection)، حالت رد پیش‌فرض (Fail closed) بگیرید. خطای شبکه هرگز active: true نیست.
  • قاعده‌ی دوگانه: یک مرحله هرگز نباید ورودی غیرقابل‌اعتماد، داده‌های حساس و یک اقدام خارجی را هم‌زمان ترکیب کند.

پرسش‌ها

پرسش و پاسخ
آیا clientInfo یک هویت معتبر است؟
خیر. یک مقدار خوداظهاری است.
آیا پین هش ایمن بودن ابزار را اثبات می‌کند؟
خیر. تنها ثبات آن را اثبات می‌کند.
آیا PKCE جلوی حمله‌ی اشتباه‌گیری را می‌گیرد؟
خیر. کلاینت باید حتماً iss را اعتبارسنجی کند.
آیا قابلیت‌های کلاینت مجوز دسترسی اعطا می‌کنند؟
خیر. آن‌ها فقط سازگاری را اعلام می‌کنند.
آیا قرار دادن «دستورالعمل‌های نامعتبر را نادیده بگیر» در پرامپت کافی است؟
خیر. این سازوکارِ اعمال قانون نیست.

مخفف‌ها

اصطلاح‌ها
CIMD
سند متادیتای شناسه کلاینت (Client ID Metadata Document). نشانی وب HTTPS آن همان شناسه‌ی کلاینت است.
DCR
ثبت پویای کلاینت (Dynamic Client Registration). استاندارد RFC 7591، منسوخ‌شده.
PKCE
وریفایر و چالش S256 که از کد محافظت می‌کنند.
JWKS
مجموعه‌کلید وب JSON، واکشی‌شده از jwks_uri، نمایه‌شده با kid.
RFC 9728
فراداده‌ی منبع حفاظت‌شده. سرورهای احراز هویت را نام می‌برد.
RFC 8707
نشانگر منبع. توکن را به یک منبع MCP مقید می‌کند.
RFC 9207
پارامتر iss در پاسخ احراز هویت. جلوی حمله‌ی اشتباه‌گیری را می‌گیرد.
PVE
الگوی پرامپت-اعتبارسنج-مجری (Prompt-Validator-Executor). مدل اعتبارسنج ارزان قبل از مدل اصلی.