چیتشیت
امنیت و احراز هویت MCP
MCP Security and Authorization
شناسایی و رفع امتناع توکن، مسمومسازی متادیتای ابزار و محتوای تزریقشده. بررسیهای CIMD، PKCE، iss، audience و PVE.
فهرست مطالب
امتناعهای توکن
عیبیابی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به آرگومانهای دیگری مقید شده- راهحل
- درخواست تأیید مجدد
ایجنت از یک صفحهی وب اطاعت میکند
- علت
- عدم وجود برچسب منبع روی محتوای دریافتشده
- راهحل
- برچسبگذاری محتوا و اعتبارسنجی هر فراخوانی ابزار
ترتیب اعتبارسنجی روی سرور منبع
گامبهگام- رمزگشایی
jwt_decodeناموفق است. بازگرداندن 401 malformed. - صادرکننده
issدرallowed_issuersنیست. بازگرداندن 401 پیش از هرگونه واکشی JWKS. - کلیدجستجوی
kidدرjwks_cache. در صورت miss، فراخوانیrefresh_jwksبرای یکبار. - امضا
jwt_verifyناموفق است. بازگرداندن 401 bad signature. - مخاطب
audاین منبع نیست. بازگرداندن 401 audience mismatch. - انقضا
expدر گذشته است. بازگرداندن 401 expired. - دامنهدامنهی لازم وجود ندارد. بازگرداندن 403
insufficient_scopeهمراه با دامنه.
کد احراز هویت همراه با PKCE
گامبهگام- کلاینتواکشی فرادادهی منبع حفاظتشده. انتخاب یک صادرکنندهی اعلامشده.
- کلاینتساخت یک
code_verifierوcode_challengeبا الگوریتم S256 از طریقpkce_pair. - کلاینتارسال
client_id،redirect_uri،scope،code_challengeوresource. - سرور احراز هویتبازگرداندن
codeوiss. - کلاینتتطبیق دقیق
issبا صادرکنندهی ثبتشده. در صورت عدم تطابق، کنار گذاشتن پاسخ. - کلاینتمبادلهی کد با
code_verifier، همان URI ریدایرکت وresource. - کلاینتذخیرهی توکن ذیل
(issuer, resource)درtokens_by_issuer_resource.
وظایف در کد
کار و کد| وظیفه | کد |
|---|---|
| پینکردن کل یک توصیفگر | descriptor_digest(tool) |
| اسکن یک کاتالوگ در برابر پینها | scan_catalog(catalog, approved) |
| اسکن یک توصیف | scan_description(description) |
| ساخت یک جفت PKCE | verifier, challenge = pkce_pair() |
| ارتقای دامنه هنگام دریافت 403 | client.call_with_step_up(tool, server, auth) |
| اعتبارسنجی یک توکن Bearer | server.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>")) # امتناع از نوشتنهای شبهدستوری
مسیرهای ثبتنام کلاینت
مقایسه| عامل | از قبل ثبتشده | CIMD | DCR |
|---|---|---|---|
| وضعیت | در صورت وجود، اولویت اول است | ترجیحدادهشده | طرح پشتیبان منسوخ |
| شناسهی کلاینت | از طرف اپراتور | نشانی وب HTTPS دارای path | تولیدشده توسط POST /register |
| سیگنال AS | رابطهی شناختهشده | client_id_metadata_document_supported | registration_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). مدل اعتبارسنج ارزان قبل از مدل اصلی.