L’autenticazione è il guardiano che determina se le potenti capacità di un server MCP sono disponibili per utenti legittimi o per attaccanti. Se sbagli, ogni altro controllo di sicurezza diventa irrilevante — un server MCP non autenticato o mal autenticato con accesso a email, file e database è una vulnerabilità critica indipendentemente da quanto bene hai rafforzato tutto il resto.
La guida del Progetto di Sicurezza OWASP GenAI identifica autenticazione e autorizzazione come uno degli otto domini di sicurezza fondamentali per i server MCP, con requisiti specifici che vanno oltre ciò che la maggior parte degli sviluppatori implementa per impostazione predefinita. Questo post spiega perché esistono questi requisiti e come implementarli correttamente.
La Sfida dell’Autenticazione in MCP
I server MCP affrontano un panorama di autenticazione più complesso rispetto ai servizi tradizionali perché mediano tra più principali:
- L’utente le cui istruzioni guidano l’assistente AI
- Il modello AI che interpreta le istruzioni e chiama gli strumenti
- Il client MCP (l’applicazione che ospita l’AI)
- Il server MCP che esegue le chiamate agli strumenti
- I servizi downstream che il server MCP chiama per conto dell’utente
Ciascuna di queste relazioni richiede i propri controlli di autenticazione e autorizzazione. Una debolezza in qualsiasi anello può essere sfruttata per bypassare gli altri.
Obbligatorio: OAuth 2.1 e OIDC per i Server Remoti
Per i server MCP remoti — quelli accessibili tramite rete anziché attraverso STDIO locale o socket Unix — la guida OWASP GenAI è inequivocabile: OAuth 2.1 con OIDC è obbligatorio, non facoltativo.
Questo requisito esiste perché:
OAuth 2.1 fornisce controllo esplicito degli scope. Ogni token di accesso dichiara esattamente quali risorse e azioni autorizza. Un server MCP può verificare al momento dell’invocazione dello strumento che il token presentato ha lo scope specifico necessario per quell’azione — non solo che l’utente è autenticato, ma che è autorizzato per questa operazione specifica.
OIDC fornisce identità crittografica. OpenID Connect aggiunge asserzioni di identità (il token ID) che il server MCP può verificare senza fare un round-trip al provider di identità. Il server valida iss (issuer), aud (audience), exp (expiry) e la firma su ogni richiesta.
I token OAuth 2.1 sono di breve durata per design. La specifica OAuth moderna (che consolida e sostituisce le best practice di OAuth 2.0) enfatizza token di accesso di breve durata che devono essere regolarmente rinnovati. Questo limita la finestra di danno se un token viene compromesso.
Cosa Validare su Ogni Richiesta
Non validare i token solo all’instaurazione della sessione. Valida su ogni invocazione di strumento:
def validate_token(token: str, required_scope: str) -> TokenClaims:
claims = jwt.decode(
token,
key=get_public_key(claims_preview['kid']),
algorithms=["RS256", "ES256"]
)
assert claims['iss'] == EXPECTED_ISSUER
assert EXPECTED_AUDIENCE in claims['aud']
assert claims['exp'] > time.time()
assert required_scope in claims['scope'].split()
return claims
Non memorizzare mai i risultati della validazione tra le richieste. Un token che era valido all’inizio della sessione potrebbe essere revocato a metà sessione.
Ambienti Client Dinamici
In ambienti dove i client MCP cambiano frequentemente (ad es., diversi assistenti AI che si connettono allo stesso server), chiavi API statiche o segreti pre-condivisi sono insufficienti. Usa la registrazione dinamica del client con OAuth 2.1 o OIDC per verificare l’identità del client al momento della connessione. Le allowlist, le policy di connessione hardcoded o il mutual TLS (mTLS) sono appropriati per relazioni statiche note tra client e server specifici.
Pronto a far crescere il tuo business?
Inizia oggi la tua prova gratuita e vedi i risultati in pochi giorni.
Il Problema del Confused Deputy
Comprendere l’Attacco
Il Confused Deputy è una vulnerabilità di autorizzazione classica con una manifestazione particolarmente pericolosa nelle architetture MCP. L’attacco sfrutta l’ambiguità di con quale autorità sta agendo un server MCP.
Considera questo scenario:
- L’utente Alice è autenticata su un server MCP con permessi limitati — può leggere i propri file ma non quelli degli altri
- Il server MCP ha ampie autorizzazioni di account di servizio per leggere tutti i file nell’organizzazione
- Il server MCP usa il token passthrough: inoltra il token di Alice ai servizi downstream
Quando Alice chiede all’assistente AI di “riassumere la mia cartella di progetto”, il server usa il token di Alice per accedere ai suoi file — comportamento corretto. Ma se un attaccante inganna il server nel fare una richiesta usando le proprie credenziali di servizio (forse attraverso un attacco di tool poisoning o iniezione di prompt indiretta), i permessi elevati del server vengono usati per accedere a file che Alice non è autorizzata a vedere.
Il server è il “deputy confuso” — è stato ingannato nell’usare la propria autorità per conto di qualcuno che non ha quell’autorità, agendo come proxy per l’escalation dei privilegi.
Perché il Token Passthrough Crea Questa Vulnerabilità
Molte implementazioni MCP inoltrano il token del client alle API downstream per semplicità. Questo sembra intuitivo — il token dell’utente rappresenta i permessi dell’utente, quindi usarlo per tutte le chiamate downstream mantiene il corretto controllo degli accessi.
Il problema: le API downstream che riconoscono il server MCP come intermediario fidato potrebbero concedere richieste usando il livello di identità del server, non il livello del token utente inoltrato. E se il server MCP agisce mai di propria iniziativa — attraverso il processo decisionale dell’AI che l’utente non ha esplicitamente richiesto — potrebbe usare le proprie credenziali anziché il token dell’utente.
L’inoltro dei token utente inoltre:
- Interrompe le tracce di audit (i log downstream mostrano l’identità dell’utente, non l’identità del server, oscurando il livello MCP)
- Dà a un attaccante che compromette il server MCP accesso a tutti i token utente inoltrati
- Crea problemi di conformità se i token per utenti diversi possono essere confusi o riprodotti
La Soluzione: Delega Esplicita dei Token con Flussi On-Behalf-Of
Invece di inoltrare i token del client, il server MCP dovrebbe ottenere i propri token per l’accesso ai servizi downstream usando il flusso On-Behalf-Of (OBO) di OAuth:
L'utente si autentica al client MCP → il client ottiene il token di accesso utente
Il client MCP presenta il token utente al server MCP
Il server MCP scambia il token utente per un token server tramite flusso OBO:
POST /token
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
assertion=<user_access_token>
scope=<minimum_required_scope>
Il server MCP usa il proprio token OBO per le chiamate downstream
Il token OBO:
- È esplicitamente limitato ai permessi minimi necessari per la specifica chiamata allo strumento
- Identifica il server MCP come parte chiamante (con l’utente come soggetto)
- È legato all’evento di autenticazione dell’utente (può essere revocato quando termina la sessione dell’utente)
- Non espone il token completo dell’utente ai servizi downstream
Token di Breve Durata e con Scope Limitato
La guida OWASP GenAI fa una raccomandazione specifica: emettere token di accesso con durate misurate in minuti, non ore. Questo si applica sia ai token che il server MCP accetta dai client sia ai token che ottiene per l’accesso ai servizi downstream.
Perché le Durate Brevi Contano
Un token di accesso rubato è valido per tutta la sua durata indipendentemente dal fatto che l’utente legittimo si sia disconnesso, abbia cambiato la password o abbia revocato la sessione. Un token di 24 ore rubato all’inizio di una sessione dà a un attaccante 24 ore di accesso persistente. Un token di 5 minuti rubato a metà sessione dà al massimo 5 minuti.
I token di breve durata impongono anche eventi di ri-autenticazione regolari, che forniscono opportunità per:
- Ricontrollare se l’account dell’utente è stato sospeso o i suoi permessi sono cambiati
- Rilevare pattern di autenticazione anomali (orari, posizioni o frequenza insoliti)
- Applicare autenticazione step-up per operazioni sensibili
Minimizzazione dello Scope del Token
Ogni token dovrebbe portare solo gli scope necessari per l’operazione specifica che viene eseguita. Non emettere un token con scope read:files write:files delete:files quando la chiamata allo strumento corrente necessita solo di read:files. Questo limita il danno se il token viene intercettato o il modello viene manipolato in chiamate di strumenti inaspettate.
def get_tool_token(user_id: str, tool_name: str) -> str:
# Mappa lo strumento agli scope minimi richiesti
required_scopes = TOOL_SCOPE_MAP[tool_name]
return oauth_client.get_token(
subject=user_id,
scopes=required_scopes,
lifetime_seconds=300 # durata di 5 minuti
)
Iscriviti alla nostra newsletter
Ricevi gratuitamente gli ultimi consigli, tendenze e offerte.
Trattare le Sessioni come Stato, Non come Identità
Un errore comune è usare gli ID di sessione come proxy di autorizzazione: se una richiesta porta un ID di sessione valido, il server assume che sia autorizzata. Questo confonde la gestione dello stato con la verifica dell’identità.
Il modello corretto: gli ID di sessione gestiscono lo stato conversazionale. L’autorizzazione viene verificata indipendentemente su ogni richiesta validando i claim del token OAuth. Anche una richiesta che porta un ID di sessione valido deve presentare un token OAuth valido, non scaduto e con scope appropriato prima che qualsiasi invocazione di strumento sia permessa.
Questo è importante perché gli ID di sessione possono essere rubati, indovinati o riprodotti in modi che i token OAuth — che portano garanzie di integrità crittografica — non possono.
Applicazione Centralizzata delle Policy
Anziché implementare controlli di autorizzazione sparsi in singoli gestori di strumenti, la guida OWASP GenAI raccomanda un gateway di policy centralizzato che:
- Intercetta tutte le richieste di invocazione di strumenti prima che raggiungano il codice specifico dello strumento
- Valida l’autenticazione (firma del token, issuer, audience, scadenza)
- Applica l’autorizzazione (scope richiesto per questo strumento specifico)
- Applica la verifica del consenso (l’utente ha esplicitamente autorizzato questo tipo di azione?)
- Implementa il filtraggio degli strumenti (questo strumento è consentito in questo contesto di deployment?)
- Registra tutte le decisioni con contesto completo per l’audit
La centralizzazione garantisce che le policy siano applicate in modo coerente su tutti gli strumenti e agenti. Un controllo di autorizzazione specifico dello strumento può essere dimenticato o bypassato durante lo sviluppo; un controllo del gateway non può.
Riepilogo: La Checklist di Autenticazione
Per i server MCP remoti, il livello minimo di sicurezza dell’autenticazione è:
Risorse Correlate