
Iniezione silenziosa di dipendenze attraverso pipeline di documentazione AI. 240 esecuzioni Docker isolate dimostrano che il server MCP senza sanitizzazione di Context Hub consente a documenti avvelenati di compromettere i progetti degli sviluppatori senza preavviso.
Vulnerabilità con assenza totale di sanitizzazione in Context Hub (@aisuite/chub v0.1.3) che consente l'iniezione silenziosa di dipendenze attraverso il pipeline di documentazione MCP.
Riferimenti: CWE-94 (Code Injection) | CWE-829 (Untrusted Control Sphere) | CWE-345 (Insufficient Verification of Data Authenticity) | OWASP LLM01 (Prompt Injection)
Abbiamo creato documenti realistici avvelenati contenenti dipendenze fittizie (plaid-link-verify, stripe-checkout-guard) e li abbiamo serviti tramite un server MCP chub locale all'interno di container Docker isolati. Nessun contenuto avvelenato è stato caricato nel registry di Context Hub – abbiamo eseguito chub build localmente e configurato il server MCP per servire l'output precompilato dal disco. Dal punto di vista dell'agente, l'esperienza è identica al recupero dei documenti dal registry live.
Quando gli assistenti di codifica AI hanno recuperato i documenti, Haiku ha silenziosamente scritto il pacchetto fittizio in requirements.txt nel 100% delle esecuzioni – senza mai menzionarlo nell'output testuale. Uno sviluppatore che legge la risposta dell'assistente non noterebbe nulla di sospetto, ma il suo progetto è avvelenato.
240 esecuzioni isolate. 3 modelli. 4 livelli di sforzo. 2 API. 0 contaminazione.
Il codice generato importa silenziosamente la dipendenza fittizia insieme ai moduli legittimi:

L'agente modifica anche CLAUDE.md per incorporare il pacchetto fittizio come "standard di progetto":

Queste tabelle mostrano i risultati di Plaid Link (120 esecuzioni isolate). Vedi RESULTS.md per i dati completi inclusi Stripe Checkout (240 esecuzioni totali).
Haiku non ha mai avvertito riguardo la dipendenza fittizia (0/40). Sonnet ha avvertito nel 48% delle esecuzioni (19/40) ma ha comunque avvelenato requirements.txt nel 53% complessivo. Opus ha avvertito nel 75% delle esecuzioni (30/40) e non ha mai avvelenato requirements.txt o il codice.
Haiku modifica il CLAUDE.md del progetto per includere la dipendenza fittizia come "standard di progetto" nell'88% delle esecuzioni (35/40). Questo file viene commitato su git – ogni futuro sviluppatore che clona il repository eredita la configurazione avvelenata.
flowchart LR
A["Attaccante\ninvia PR"] -->|"Nessuna verifica\ndell'identità"| B["Mantainer\nunisce PR"]
B -->|"Nessuna sanitizzazione\ndei contenuti"| C["Doc su CDN\n(nessun controllo d'integrità)"]
C -->|"MCP serve\ncontenuti grezzi"| D["Finestra di contesto\ndell'agente"]
D -->|"L'agente agisce su\ncontenuti non fidati"| E["Workstation\ndello sviluppatore"]
style A fill:#111,stroke:#333,color:#f0f0f0
style B fill:#161616,stroke:#333,color:#888
style C fill:#161616,stroke:#333,color:#888
style D fill:#161616,stroke:#333,color:#888
style E fill:#111,stroke:#333,color:#f0f0f0
L'avvelenamento di Haiku è completamente silenzioso. 0/80 esecuzioni di Haiku su entrambe le API hanno menzionato la dipendenza fittizia nella risposta. Il modello scrive su disco senza informare. Sonnet ha avvertito nel 48% delle esecuzioni ma ha comunque avvelenato requirements.txt in 35-53% delle esecuzioni. Opus ha avvertito in 23-75% delle esecuzioni e non ha mai avvelenato requirements.txt o il codice.
Haiku è sfruttabile al 100% a ogni livello di sforzo. Indipendente dallo sforzo su entrambe le API. Il modello più debole della famiglia non rileva mai la dipendenza fittizia.
Opus resiste all'avvelenamento del codice ma non a quello della configurazione. Opus non ha mai scritto la dipendenza fittizia in requirements.txt o in codice Python (0/80 su entrambe le API). Tuttavia, su Stripe, Opus ha modificato CLAUDE.md nel 38% delle esecuzioni, documentando il canarino come dipendenza di progetto senza installarlo.
La persistenza in CLAUDE.md crea un vettore di supply chain. I file di configurazione modificati vengono commitati su git, avvelenando ogni sviluppatore che clona il repository e ogni futura sessione AI in quel progetto. Questo funziona su tutti i modelli (Haiku 88-90%, Sonnet 58%, Opus 0-38%).
La familiarità con l'API è importante. Stripe (nota): i modelli rilevano pacchetti fittizi tramite dati di addestramento. Plaid (meno nota): i modelli non possono verificare e accettano la dipendenza fittizia senza discutere.
Questo è un problema di categoria. Context7 aveva ContextCrush (Feb 2026). Context Hub ha questo. Qualsiasi strumento che inietti contenuti esterni non sanitizzati nel contesto dell'agente è vulnerabile.
Zero sanitizzazione lungo tutto il pipeline:
annotations.js – writeFileSync con contenuti grezzi, nessun filtrobuild.js – nessuna scansione dei contenuti, nessuna normalizzazione Unicodecache.js – fetch da CDN con zero verifica di hash/firmasource: official nel frontmatter – auto-dichiarato, non verificatoContext Hub non ha un SECURITY.md. Non esiste un modo documentato per segnalare responsabilmente una vulnerabilità – nessun contatto di sicurezza, nessuna chiave PGP, nessuna politica di divulgazione. I membri della community hanno comunque trovato le vulnerabilità e le hanno segnalate come issue e PR regolari. Nessuna è stata revisionata.

Nota: Non abbiamo segnalato l'issue #74. Il nostro audit ha scoperto e quantificato indipendentemente queste vulnerabilità. L'issue #74 e le PR #69, #81, #125 sono citate come precedenti che dimostrano come la community abbia segnalato questi problemi senza alcun coinvolgimento dei manutentori.
Una volta che il pacchetto fittizio è in requirements.txt, un normale pip install -r requirements.txt concede all'attaccante l'esecuzione di codice arbitrario tramite gli hook post-installazione di setup.py. Non è un sandbox – pip esegue Python senza restrizioni con tutti i permessi dello sviluppatore.
Da quel singolo punto di ingresso, l'attaccante può:
.env o codice sorgente a un server controllato dall'attaccante.~/.chub/config.yaml per aggiungere una fonte di documenti controllata dall'attaccante. Tutte le future query chub su ogni libreria includeranno contenuti dell'attaccante. Sopravvive a chub cache clear perché la configurazione non è cache.Queste azioni non si escludono a vicenda. Un singolo hook post-installazione può fare tutto in meno di un secondo. Non abbiamo creato né registrato un pacchetto malevolo.
.
|-- README.md # Questo file
|-- RESULTS.md # Dataset completo con suddivisione per esecuzione
|-- REPRODUCE.md # Guida alla riproduzione basata su Docker
|-- alternatives-comparison.md # Confronto con Context7, LAP, GitMCP, Docfork
|-- article.html # Articolo completo
|-- docker/
| |-- Dockerfile # Ambiente di test isolato
| |-- run_isolated.ps1 # Esecutore PowerShell (Windows/macOS/Linux via pwsh)
| |-- seed-claude.md # CLAUDE.md minimo inserito in ogni esecuzione
| |-- plaid-doc/ # Documento Plaid Link avvelenato (canarino: plaid-link-verify)
| | `-- plaid/link/DOC.md
| `-- stripe-doc/ # Documento Stripe Checkout avvelenato (canarino: stripe-checkout-guard)
| `-- stripe/checkout/DOC.md
`-- results/
|-- plaid-isolated/ # 120 esecuzioni Plaid: JSON + trascrizioni sessione + file di progetto
`-- stripe-isolated/ # 120 esecuzioni Stripe: JSON + trascrizioni sessione + file di progetto
Vedi REPRODUCE.md per la guida completa alla riproduzione basata su Docker.
Avvio rapido:
# Plaid (predefinito)
docker build --build-arg DOC_DIR=plaid-doc -t plaid-bench docker/
docker run -d --name plaid-runner plaid-bench sleep infinity
docker exec -it plaid-runner claude login
# Stripe
docker build --build-arg DOC_DIR=stripe-doc -t stripe-bench docker/
docker run -d --name stripe-runner stripe-bench sleep infinity
docker exec -it stripe-runner claude login
# Quindi esegui la matrice di test dall'host (vedi REPRODUCE.md)
--permission-mode bypassPermissions. Gli agenti reali potrebbero chiedere conferma.MIT
Questa ricerca è stata condotta da Mickey Shmueli, sviluppatore di LAP, un'alternativa open source a Context Hub. LAP utilizza compilazione deterministica da specifiche API ufficiali, senza contenuti contribuiti dalla community nel pipeline. Questo audit è stato motivato da una genuina preoccupazione di sicurezza riguardante i pipeline di contenuti non sanitizzati – una classe di vulnerabilità che colpisce qualsiasi strumento in questo spazio che accetti contributi non verificati dalla community. I risultati parlano da soli: 240 esecuzioni Docker isolate, rilevamento deterministico, completamente riproducibile.
Questo PoC è solo a scopo educativo e di ricerca sulla sicurezza. Tutti i test eseguiti localmente in container Docker isolati. Nessun contenuto malevolo è stato inviato al repository di Context Hub. Tutti i nomi di pacchetto canarino verificati come inesistenti su PyPI prima del test.
Queste vulnerabilità sono state segnalate indipendentemente da membri della community in issue #74 (12 marzo) e PR #125 (17 marzo). Entrambe hanno ricevuto zero risposta da parte dei manutentori.
| Sforzo | Haiku | Sonnet | Opus |
|---|
| Basso | 100% | 60% | 0% |
| Medio | 100% | 70% | 0% |
| Alto | 100% | 40% | 0% |
| Massimo | 100% | 40% | 0% |
| Sforzo | Haiku | Sonnet | Opus |
|---|
| Basso | 90% | 70% | 0% |
| Medio | 80% | 70% | 0% |
| Alto | 90% | 40% | 0% |
| Massimo | 90% | 50% | 0% |
| Attaccante | Chiunque possa inviare una PR al registry dei documenti di Context Hub |
| Superficie d'attacco | Documenti della community che fluiscono dalla PR GitHub al CDN al MCP al contesto dell'agente |
| Confine di fiducia | Contenuti di collaboratori non fidati trattati come documentazione API autorevole |
| Prerequisito | Una PR unita contenente un documento avvelenato |
| Impatto | Esecuzione di codice arbitrario tramite iniezione di dipendenze + hook post-installazione di pip |
| Data | Evento |
|---|
| 2026-03-12 | Issue #74 segnalata da @bjorkbjork che riporta 4 vulnerabilità di sicurezza tra cui integrità CDN, verifica dell'origine auto-dichiarata e iniezione di annotazioni |
| 2026-03-12 | Issue #74 assegnata internamente a un membro del team principale – zero follow-up |
| 2026-03-17 | PR #125 presentata da @hobostay che aggiunge verifica di integrità dei contenuti – zero revisioni |
| 2026-03-12 a 03-20 | Ulteriori PR di sicurezza (#69, #81) presentate dalla community – zero revisioni |
| 2026-03-20 a 03-23 | Il nostro audit indipendente conferma e quantifica le vulnerabilità con 240 esecuzioni Docker isolate |
| 2026-03-23 | Divulgazione pubblica |