flawopen.com/AI Security/mcp-typescript-sdk-bearer-token-audience-validation
MCP TypeScript SDK में Bearer token की audience जाँच नहीं थी
GHSA-rvq5-wwqv-78pq उन MCP HTTP सर्वरों को प्रभावित करता है जो audience जाँचे बिना token स्वीकार करते थे। अपडेट करें, expectedResource सक्षम करें और सत्यापित audience को AuthInfo.resource में लौटाएँ।[1]
सुरक्षा गार्ड वैध प्रवेश-पत्र स्वीकार करता है, लेकिन यह नहीं देखता कि वह किस इमारत के लिए है। एक ही जारीकर्ता कई इमारतों के लिए पत्र दे तो पड़ोसी इमारत का पत्र भी चल सकता है। MCP सर्वर को पत्र का गंतव्य अपने resource URL से मिलाना चाहिए।[1]
इस पेज के मुख्य शब्द
Audience (`aud`)- वह resource या service जिसके लिए access token जारी हुआ है। सही signature या सफल introspection यह साबित नहीं करता कि token इसी MCP सर्वर के लिए था।[1], [7]
`expectedResource`- ठीक किए गए middleware की स्पष्ट रूप से चालू की जाने वाली setting। यह configured resource URL को token verifier द्वारा बताए गए resource से मिलाती है और अंतर होने पर HTTP 401 देती है।[1], [2], [7]
फ्रेमवर्क मैपिंग
- इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-863
हमले का चरण-दर-चरण प्रवाह
एक issuer कई API के लिए token देता है
प्रभावित deployment MCP HTTP bearer authentication इस्तेमाल करता है और authorization server कई services के लिए token जारी करता है। दूसरे API के लिए बना token भी सही तरह signed और अभी valid हो सकता है।[1]
अपडेट करें और जाँच को MCP resource से बाँधें
ठीक किया गया release लगाएँ, expectedResource में इस server का resource identifier दें और verifyAccessToken() से सत्यापित audience को AuthInfo.resource में लौटाएँ। केवल update से विकल्प चालू नहीं होता; resource न होने पर सभी अनुरोध 401 होंगे।[1], [2], [5], [3], [6], [7]
प्रभावित MCP TypeScript SDK पैकेज
| पैकेज | प्रभावित संस्करण | ठीक किया गया संस्करण |
|---|---|---|
@modelcontextprotocol/sdk | 1.6.0–1.31.0 | 1.32.0 या बाद का |
@modelcontextprotocol/server | 2.0.0–2.2.0 | 2.3.0 या बाद का |
@modelcontextprotocol/express | 2.0.0–2.0.1 | 2.0.2 या बाद का |
@modelcontextprotocol/server-legacy | 2.0.0–2.3.0 | 2.3.1 या बाद का |
verifyAccessToken() में अपना aud validation करने वाला कोई भी package | Application में helper की अनुपस्थित जाँच पहले से लागू हो सकती है। | पुष्टि करें कि तुलना strict है और अपेक्षित resource identifier का उपयोग करती है। |
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
यह उदाहरण SDK के दस्तावेज़ और शामिल किए गए सुधार के अनुरूप है। verifyJwt application के मौजूदा JWT validator या introspection call को दर्शाता है। सुधार से पहले middleware में expectedResource नहीं था और audience की तुलना नहीं होती थी; ठीक किया गया version configured resource को AuthInfo.resource से मिलाता है। Authorization server aud में जो सटीक identifier रखता है, वही उपयोग करें; उदाहरण समान origin वाला audience URL चुनता है और पूरे resource की तुलना SDK पर छोड़ता है। SDK 1.x को 1.32.0 या बाद में अपडेट करें; 2.x के लिए @modelcontextprotocol/server 2.3.0 या बाद का उपयोग करें। Express के साथ @modelcontextprotocol/express को भी 2.0.2 या बाद में अपडेट करें। क्योंकि AuthInfo.resource का प्रकार URL है, इसलिए सामान्य गैर-URL aud मान की तुलना expectedResource से नहीं की जा सकती। ऐसे deployment में verifyAccessToken() के भीतर उस identifier की सख्ती से जाँच करें और expectedResource सेट न करें। verifyJwt का implementation application-specific है और छोड़ा गया है; token forgery या exploit steps नहीं दिए गए हैं।[1], [2], [5], [3], [6], [7]
import { requireBearerAuth } from '@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js';
const mcpServerUrl = new URL('https://api.example.com/mcp');
const auth = requireBearerAuth({
verifier: {
async verifyAccessToken(token) {
const payload = await verifyJwt(token); // ऐप्लिकेशन JWT सत्यापन
return {
token,
clientId: payload.sub,
scopes: payload.scopes,
expiresAt: payload.exp,
// यहाँ resource लौटाया नहीं जाता, और प्रभावित helper में expectedResource विकल्प नहीं था।
};
},
},
});
import { requireBearerAuth } from '@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js';
const mcpServerUrl = new URL('https://api.example.com/mcp');
const auth = requireBearerAuth({
verifier: {
async verifyAccessToken(token) {
const payload = await verifyJwt(token); // ऐप्लिकेशन JWT सत्यापन
// aud स्ट्रिंग, सूची या अनुपस्थित हो सकता है। इस सर्वर की प्रविष्टि लौटाएँ।
const audience = [payload.aud ?? []].flat().find(
aud => URL.canParse(aud) && new URL(aud).origin === mcpServerUrl.origin,
);
const resource = audience ? new URL(audience) : undefined;
return {
token,
clientId: payload.sub,
scopes: payload.scopes,
expiresAt: payload.exp,
resource,
};
},
},
expectedResource: mcpServerUrl,
});
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓
requireBearerAuth()याverifyBearerToken()वाले MCP HTTP servers खोजें और पता करें कि authorization server कई APIs के लिए token जारी करता है या नहीं।[1] - ✓SDK 1.x को 1.32.0 या बाद में अपडेट करें; 2.x में
@modelcontextprotocol/server2.3.0 या बाद में और Express के लिए@modelcontextprotocol/express2.0.2 या बाद में लें;server-legacyको 2.3.1 या बाद में करें।[1], [3], [6] - ✓विश्वसनीय server configuration में
expectedResourceको इस MCP server के सटीक resource identifier पर सेट करें; इसे incoming request से न निकालें।[1], [2], [7] - ✓
verifyAccessToken()से trusted authorization server के साथ token validate कराएँ और verified audience कोAuthInfo.resourceमें लौटाएँ। यदि issuer सामान्य गैर-URL audience identifier देता है, तो verifier के भीतर उसका सख्ती से मिलान करें औरexpectedResourceसेट न करें; उसका अनुमान न लगाएँ और उसे URL में न बदलें।[1], [2], [7] - ✓जाँचें कि इसी resource का token सफल हो, जबकि दूसरे service का token, missing audience और अलग scheme, host, port या path वाली audience पर 401 मिले।[1], [2], [7]
- ✓सिर्फ update को पर्याप्त न मानें:
expectedResourceसेट होने तक बंद है; इसे चालू करकेAuthInfo.resourceन लौटाने पर सभी requests अस्वीकृत होंगी।[1] - ✓अनपेक्षित audience के लिए access logs और validation telemetry देखें; credentials को तभी revoke या rotate करें जब सबूत संभावित दुरुपयोग दिखाएँ।[1]
स्रोत
- GitHub Security Advisory GHSA-rvq5-wwqv-78pq
- MCP TypeScript SDK pull request #2930: requireBearerAuth में expectedResource
- MCP TypeScript SDK 1.32.0 release notes
- MITRE CWE-863: गलत authorization
- MCP TypeScript SDK v2 pull request #2929: add expectedResource to bearer-token check
- MCP TypeScript SDK release notes for 2.3.0
- MCP TypeScript SDK server guide: bearer-token audience validation