- Poisoning — il server era malevolo fin dall’inizio. Il suo manifest sembrava benigno; il comportamento pericoloso era nell’implementazione del tool, non negli scope dichiarati.
- Rug-pull — lo hai considerato attendibile, poi è cambiato. È apparso un nuovo tool che l’operatore del server ha aggiunto silenziosamente, o una voce di un registro della community è stata dirottata e aggiornata per chiamare casa.
1. Come il MCP tool poisoning raggiunge i tuoi agent
Ognitools/call che il tuo agent emette viaggia attraverso il set di tool
dichiarato del MCP server. Un server avvelenato o con rug-pull sfrutta quella
fiducia in alcuni modi:
| Vettore | Cosa succede |
|---|---|
| Tool non dichiarato | Appare un nuovo tool in tools/list che il manifest del server non aveva mai dichiarato. Il tuo agent lo trova e lo chiama. |
| Voce del registro dirottata | Una lista di un registro della community viene presa in consegna; l’endpoint ora punta a un server controllato dall’attaccante. |
| Raccolta di credenziali | L’implementazione del tool del server invia gli input raccolti a un host esterno. |
| Prompt injection tramite il risultato del tool | Un tool restituisce testo controllato dall’attaccante che reindirizza la prossima azione dell’agent. |
2. Le difese di OrcaRouter
2.1 Ogni tools/call viene valutato dal firewall prima di girare
Gli MCP server si connettono ai tuoi agent attraverso il gateway MCP del
Firewall su /api/v1/firewall/mcp. Il gateway non inoltra una chiamata a tool
finché il motore del firewall non l’ha valutata
rispetto alla tua policy.
Questo significa che la tua allowlist è la fonte di verità — non il manifest
del tool del server. Se un rug-pull aggiunge shell.exec e la tua policy non
ha nessuna regola che lo consente, il verdetto è deny e la chiamata non lascia
mai il gateway. Il modello riceve un errore di tool (firewall deny: …) e può
reagire; il tool aggiunto dall’attaccante è morto all’arrivo.
Verdetti che il motore può restituire:
| Verdetto | Effetto |
|---|---|
allow / audit | Chiamata inoltrata; audit logga anche gli argomenti. |
sanitize | Argomenti riscritti prima dell’inoltro. |
deny | Chiamata bloccata; il modello riceve un errore di tool. |
pending_approval | Chiamata trattenuta; un essere umano deve approvare prima che proceda. |
cap_cost | Tetto di costo applicato; chiamata bloccata se lo supererebbe. |
2.2 Le capability auto-rilevate vengono messe in quarantena finché non vengono esaminate
Quando un agent auto-installa una capability — o un rug-pull aggiunge nuovi tool che non erano presenti quando hai registrato il server — il Firewall auto-rileva la nuova capability fuori dall’hot path, sintetizza un manifest, lo scansiona e assegna una banda di rischio e una modalità di applicazione. In modo cruciale, le capability auto-rilevate vengono sempre messe in quarantena indipendentemente dal risultato della scansione: vengono trattenute inpending_approval finché
un essere umano non le esamina.
Così vengono contenuti i rug-pull. Un operatore non può aggiungere silenziosamente
un nuovo tool e far sì che i tuoi agent inizino ad usarlo — quelle chiamate
vengono trattenute finché non ispezioni e approvi la nuova capability.
2.3 La scansione delle skill assegna una banda di rischio e una modalità di applicazione
Ogni capability installabile — che tu l’abbia registrata o che il Firewall l’abbia auto-rilevata — viene passata attraverso lo scanner delle skill. Lo scanner esegue passaggi deterministici sul manifest e sugli scope dichiarati:- prompt_injection — testo del manifest che tenta di dirottare le istruzioni.
- tool_creep — tool che il manifest usa ma non ha mai dichiarato.
- network_egress — host HTTP(S) al di fuori degli scope di rete approvati.
- fs_write_unsafe — accesso al filesystem in modalità di scrittura fuori da
/tmp.
low / medium / high
/ critical) e una modalità di applicazione:
| Modalità | Cosa succede a runtime |
|---|---|
allow | La skill non impone nulla di per sé; le regole della tua policy decidono. |
quarantine | Qualsiasi verdetto non-deny escala a pending_approval. Un essere umano deve approvare ogni chiamata a tool. |
block | Forza deny su tutti i tool di questa skill, indipendentemente dalle regole della policy. |
high viene messa in quarantena automaticamente; critical
viene bloccata. Un singolo risultato error (es. tool_creep per un shell.exec
non dichiarato) è sufficiente per bloccare una skill anche quando il suo punteggio
numerico sembra basso. La modalità si irrigidisce solo — approvare una skill non
allenta mai un block impostato da una scansione recente.
2.4 Le credenziali sono memorizzate cifrate
I segreti di autenticazione del server sono cifrati a riposo con una chiave dei segreti del workspace e iniettati dal gateway al momento del dispatch. Non raggiungono mai il modello, l’agent o gli argomenti della chiamata. Un server compromesso non può esfiltrare le tue chiavi API leggendo il proprioauth_json.
Checklist di verifica del MCP server di terze partiPrima di registrare un MCP server esterno:
- Verifica l’identità del publisher — chi controlla l’URL dell’endpoint?
- Leggi il sorgente o il changelog; cerca nuovi tool aggiunti dopo il rilascio iniziale.
- Controlla se la scansione della skill restituisce risultati
tool_creepoprompt_injectionalla registrazione. - Crea una regola del firewall con
tool_name_glob: <server>.*suauditopending_approvalfinché non hai una cronologia delle chiamate. - Esamina i risultati
network_egress: il manifest afferma di aver bisogno di un solo dominio ma le descrizioni dei tool ne menzionano altri? - Ri-sonda il server dopo qualsiasi bump di versione upstream (
POST /api/workspace/firewall/mcp_servers/:id/probe) per far emergere i nuovi tool.
3. Cosa fare dopo un sospetto rug-pull
- Disabilita immediatamente il server — un server disabilitato viene
rimosso dal registro runtime e le sue credenziali non vengono mai decifrate.
Usa
PUT /api/workspace/firewall/mcp_serverscon"enabled": false. - Ri-sonda per far emergere i cambiamenti —
POST /api/workspace/firewall/mcp_servers/:id/probeeseguetools/liste restituisce qualsiasi nuovo tool apparso dall’ultima sonda. - Ri-scansiona il record della skill —
POST /api/workspace/firewall/skills/:id/rescanri-esegue lo scanner rispetto al manifest aggiornato. Se il verdetto peggiora aflaggedoblocked, il Firewall emette un evento nel tuo feed. - Esamina la coda
pending_approval— qualsiasi chiamata trattenuta dal rug-pull è in coda. Ispezionala e negala invece di approvarla in blocco. - Controlla il log delle chiamate — controlla il trail degli eventi del Firewall per le chiamate che sono passate prima che rilevasi il cambiamento.
4. Abbinare la scansione delle skill con le regole del firewall
La scansione delle skill e le regole del firewall sono complementari e si compongono:- Una regola con
tool_name_glob: community.*impostata supending_approvalgarantisce che tu esamini ogni chiamata da un server con sorgente dalla community, indipendentemente dalla banda di rischio. - Una skill in quarantena sovrascrive una regola
allow— anche se la tua policy consentehttp.fetchin modo ampio, una skill in quarantena che lo possiede trattiene comunque la chiamata. - Usa
skill_name_globin una regola per vincolare policy più restrittive ai server non attendibili senza influenzare le tue integrazioni di prima parte.
5. Minacce correlate
- Chiamate a tool pericolose — regole per bloccare azioni di tool distruttive o irreversibili indipendentemente dalla sorgente.
- Esfiltrazione di dati — regole egress che limitano dove le chiamate a tool possono inviare dati.
- Modello di threat — la superficie d’attacco completa che OrcaRouter è progettato a difendere.
Firewall: MCP Server
Registra gli MCP server dietro il gateway, sonda i loro tool e applica
verdetti per-chiamata prima che qualsiasi chiamata raggiunga il server reale.
Firewall: Skill
Scansiona e assegna un punteggio di rischio a ogni capability installabile.
Metti in quarantena o blocca le skill rischiose prima che i loro tool possano
girare.
