FlawOpen

flawopen.com/AI Security/mcp-typescript-sdk-bearer-token-audience-validation

● CWE-863 · CVSS 6.8 · Sedang
Riset Keamanan · FlawOpen

SDK TypeScript MCP tidak memeriksa audience token Bearer

GHSA-rvq5-wwqv-78pq berdampak pada server HTTP MCP yang menerima token tanpa memeriksa audience. Perbarui, aktifkan expectedResource, dan kembalikan audience terverifikasi melalui AuthInfo.resource.[1]

💡 Penjelasan Sederhana (ELI5)

Petugas keamanan menerima kartu akses yang valid, tetapi tidak memeriksa gedung mana yang dibuka kartu itu. Jika satu penerbit membuat kartu untuk banyak gedung, kartu gedung sebelah bisa ikut diterima. Server MCP harus mencocokkan tujuan kartu dengan URL resource miliknya.[1]

Konsep Kunci & Istilah

Audience (`aud`)
Resource atau layanan yang menjadi tujuan token akses. Tanda tangan valid atau introspeksi berhasil tidak membuktikan bahwa token tersebut ditujukan kepada server MCP ini.[1], [7]
`expectedResource`
Pengaturan yang harus diaktifkan secara eksplisit pada middleware yang telah diperbaiki. Nilai ini membandingkan URL resource konfigurasi dengan resource yang dilaporkan verifier token; ketidakcocokan menghasilkan HTTP 401.[1], [2], [7]
`AuthInfo.resource`
URL resource yang diturunkan verifier dari data validasi atau introspeksi token yang tepercaya. Middleware versi perbaikan membutuhkan nilai ini; jika tidak ada saat pemeriksaan aktif, permintaan ditolak.[1], [2], [7]
Paket terdampak
Advisory mencakup @modelcontextprotocol/sdk 1.6.0–1.31.0, @modelcontextprotocol/server 2.0.0–2.2.0, @modelcontextprotocol/express 2.0.0–2.0.1, dan @modelcontextprotocol/server-legacy 2.0.0–2.3.0. Tidak ada CVE; vendor mengaitkannya dengan CWE-863.[1], [3], [6]

Pemetaan kerangka kerja

  • Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-863

Alur Serangan Langkah demi Langkah

Langkah 1

Satu penerbit melayani beberapa API

Penerapan terdampak menggunakan autentikasi Bearer HTTP MCP dan server otorisasinya menerbitkan token untuk beberapa layanan. Token untuk API lain masih dapat memiliki tanda tangan yang benar dan belum kedaluwarsa.[1]

Langkah 2

Token divalidasi, tetapi tujuannya tidak

Pada integrasi terdampak, requireBearerAuth() / verifyBearerToken() belum memiliki pemeriksaan resource yang diharapkan. Jika verifyAccessToken() milik aplikasi juga tidak memeriksa aud, server MCP dapat menerima token untuk layanan lain.[1], [2], [5]

Langkah 3

Token layanan lain mencapai otorisasi MCP

Pemegang token valid untuk layanan lain dapat dianggap telah terautentikasi pada server MCP ini. Advisory memberi nilai CVSS 3.1 6,8 dan CWE-863; tidak ada insiden eksploitasi aktif tertentu yang dilaporkan.[1], [4]

Langkah 4

Perbarui dan ikat pemeriksaan ke resource MCP

Gunakan rilis yang sudah diperbaiki, atur expectedResource ke pengenal resource server ini, dan minta verifyAccessToken() mengembalikan audience terverifikasi sebagai AuthInfo.resource. Pembaruan saja tidak mengaktifkan opsi ini; tanpa resource, semua permintaan mendapat 401.[1], [2], [5], [3], [6], [7]

Paket MCP TypeScript SDK yang terdampak

PaketVersi terdampakVersi perbaikan
@modelcontextprotocol/sdk1.6.0–1.31.01.32.0 atau lebih baru
@modelcontextprotocol/server2.0.0–2.2.02.3.0 atau lebih baru
@modelcontextprotocol/express2.0.0–2.0.12.0.2 atau lebih baru
@modelcontextprotocol/server-legacy2.0.0–2.3.02.3.1 atau lebih baru
Paket apa pun yang memvalidasi aud sendiri di verifyAccessToken()Aplikasi mungkin sudah menerapkan pemeriksaan yang tidak ada di helper.Pastikan perbandingannya ketat dan memakai pengenal resource yang dimaksud.

Kode Sumber: Rentan vs Aman

Contoh ini mengikuti bentuk yang didokumentasikan SDK dan perbaikan yang telah digabungkan. verifyJwt mewakili validator JWT atau panggilan introspeksi yang sudah dimiliki aplikasi. Sebelum perbaikan, middleware tidak menyediakan expectedResource dan tidak membandingkan audience; versi yang diperbaiki mencocokkan resource konfigurasi dengan AuthInfo.resource. Gunakan pengenal persis yang ditempatkan server otorisasi di aud; contoh memilih URL audience dari origin yang sama lalu membiarkan SDK membandingkan resource lengkap. Perbarui SDK 1.x ke 1.32.0 atau lebih baru; untuk 2.x gunakan @modelcontextprotocol/server 2.3.0 atau lebih baru. Pengguna Express juga harus memperbarui @modelcontextprotocol/express ke 2.0.2 atau lebih baru. Karena AuthInfo.resource bertipe URL, nilai aud biasa yang bukan URL tidak dapat dibandingkan melalui expectedResource: validasi pengenal itu secara ketat di dalam verifyAccessToken() dan biarkan expectedResource tidak disetel untuk deployment tersebut. Implementasi verifyJwt khusus aplikasi dan sengaja tidak disertakan; tidak ada pemalsuan token atau langkah eksploitasi.[1], [2], [5], [3], [6], [7]

IMPLEMENTASI RENTAN
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); // Verifikasi JWT aplikasi
      return {
        token,
        clientId: payload.sub,
        scopes: payload.scopes,
        expiresAt: payload.exp,
        // Resource tidak dikembalikan, dan helper yang terdampak tidak memiliki opsi expectedResource.
      };
    },
  },
});
PERBAIKAN AMAN & KUAT
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); // Verifikasi JWT aplikasi
      // aud dapat berupa string, daftar, atau tidak ada. Kembalikan entri untuk server ini.
      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,
});

Daftar Periksa Penguatan Sistem Rekayasa

Sumber

← AI Security Directory →