
Difesa steganografica contro il prompt injection per l'AI agentica tramite binding di provenienza in fase di decodifica, autenticazione HMAC e applicazione della fiducia MCP.
Una proof-of-concept riproducibile per un vettore di prompt-injection steganografico che aggira gli scanner di contenuto testuale, e una difesa che lo contiene al confine della decodifica — binding di provenienza al momento della decodifica.
Solo ricerca sulla sicurezza educativa / difensiva. Tutti i segreti in questo repo sono finti. Usare solo su sistemi di propria proprietà o per i quali si è autorizzati a eseguire test.
Un attaccante invia via email a una vittima un messaggio dall'aspetto ordinario. Un logo di un marchio nella
firma dell'email nasconde un'istruzione tramite steganografia (LSB, DCT o metadati).
L'immagine è visivamente identica all'originale e non contiene testo sospetto, quindi
uno scanner di contenuto non vede nulla e la vittima non clicca su nulla. Ma
l'agente di riepilogo della casella di posta abituale della vittima elabora la firma, uno strumento nella
sua pipeline decodifica l'immagine, e l'istruzione nascosta entra nel contesto dell'agente
— dove, in una pipeline MCP multi-agente, viene inoltrata tra agenti come output fidato di un peer e guida una chiamata critica a uno strumento. Questo è il riciclaggio di fiducia cross-modale. La difesa, il binding di provenienza al momento della decodifica, conia un'etichetta UNTRUSTED firmata con
HMAC nell'istante in cui viene eseguito uno strumento che inverte l'occultamento e
fa sì che il livello MCP mantenga esso stesso la discendenza di provenienza, così blocca qualsiasi
chiamata critica a uno strumento la cui discendenza non è fidata — anche quando un agente compromesso
presenta un'etichetta valida per un valore fidato non correlato. Contiene anziché
rilevare, quindi è indipendente dalla formulazione del payload e dal vettore.
Tasso di successo dell'attacco (ASR) — 24 payload (tre vettori × otto evasioni: semplice, con parole innocue, Base64, token-split, omoglifo cirillico, zero-width, confondibile Unicode, commento HTML); più basso è meglio. Il baseline taint in-process è un controllo del flusso informativo che marca l'output della decodifica come non fidato ma non porta alcun binding crittografico cross-dominio:
| Difesa | Perdite | n | ASR |
|---|---|---|---|
| Non difeso (nessun controllo) | 24 | 24 | 100% |
| Scanner di contenuto (keyword/DLP) | 15 | 24 | 62.5% |
| Parser di intenti regex | 15 | 24 | 62.5% |
| Taint del flusso dati (baseline IFC) | 0 | 24 | 0% |
| Provenienza al momento della decodifica (nostra) | 0 | 24 | 0% |
Taint e provenienza pareggiano sull'ASR a singolo dominio; divergono sotto rilancio avversariale (sotto), che è il punto del binding crittografico.
Sostituzione con etichetta valida — un agente compromesso presenta un binding TRUSTED
legittimamente firmato da uno strumento benigno, omettendo l'origine di decodifica UNTRUSTED
che in realtà guida la chiamata. La correzione è che il livello MCP mantiene la discendenza
esso stesso e decide sul proprio registro, non sul binding fornito dall'agente:
| Applicazione | Decisione |
|---|---|
| Solo binding fornito dall'agente (ingenuo) | consenti (perdite) |
| Mantenuto dal livello, dipendenza omessa | blocca |
| Mantenuto dal livello, dipendenza negli argomenti | blocca |
| Mantenuto dal livello, contesto pulito | consenti |
Ablazione dei componenti — quattro componenti, ciascuno difende da un attacco distinto. Disabilitarne
uno alla volta; substitution è in-domain, forged relay è un'etichetta TRUSTED falsificata
che attraversa un relay non fidato verso un verificatore remoto che detiene solo il binding
presentato. Fondamentalmente, l'HMAC da solo non ferma la sostituzione (lo fa il registro), e
il registro da solo non sopravvive a un relay cross-dominio (lo fa l'HMAC):
| Configurazione | Onesto | Sostituzione | Relay contraffatto |
|---|---|---|---|
| Meccanismo completo | bloccato | bloccato | bloccato |
| − marcatura di decodifica | perde | perde | perde |
| − autenticazione crittografica (HMAC) | bloccato | bloccato | perde |
| − tracciamento della lineage attendibile | bloccato | perde | bloccato |
| − mediazione del sink | perde | perde | perde |
Propagazione cross-contesto — la taint sopravvive a un confine di messaggio inter-agente, non solo a un handle di ritorno di uno strumento. Una decodifica non attendibile nell'Agente A raggiunge una chiamata critica nel contesto separato dell'Agente B, e su un canale mediato (che il modello di minaccia richiede già per le comunicazioni inter-agente) la taint si propaga e B viene bloccato. Un canale che il layer non media è fuori dal modello per costruzione — non una perdita nell'ambito:
| Canale A → B | Chiamata critica di B |
|---|---|
| Messaggio inter-agente mediato (nell'ambito) | blocco (taint propagata) |
| Canale laterale non mediato (fuori dal modello) | non coperto |
Scalabilità dell'overhead — MintBinding è ~O(1) (~10–14 µs indipendentemente dalla profondità);
EnforceCritical è lineare nella chiusura di dipendenze che attraversa (≈10 µs a profondità
1 → ≈0,66 ms a profondità 100 → ≈6,7 ms a profondità 1000) e costante (~6–7 µs) nel numero
di contesti taint concorrenti. Chiusure realistiche (profondità nell'ordine delle decine) restano sotto
~0,1 ms.
Utilità per attività legittime — un percorso di promozione attendibile sottoposto ad audit (ri-etichettatura di un valore decodificato specifico, ad esempio un numero di fattura OCR, sotto autorizzazione) elimina i blocchi falsi mentre l'attacco resta bloccato:
| Regime | Completamento | Blocchi falsi | Attacco bloccato |
|---|---|---|---|
| Nessuna promozione | 2/3 (67%) | 1 | sì |
| Promozione attendibile | 3/3 (100%) | 0 | sì |
Completezza del set di decodifica — l'assunzione di registrazione, messa direttamente alla prova:
| Set di decodifica | Attacco stego | Chiamata critica legittima |
|---|---|---|
| Corretto | bloccato | consentita |
| Decoder mancante | perde | consentita |
| Troppo ampio | bloccato | blocco falso |
Integrità delle etichette tra i passaggi — il binding sopravvive al relay onesto e resiste a un worker compromesso:
| Scenario di relay | Decisione del verificatore |
|---|---|
| Relay onesto, 1 / 3 / 5 / 10 hop | verifica; bloccato |
| Compromesso: riscrittura del payload, HMAC mantenuto | blocco (mancata corrispondenza HMAC) |
Compromesso: falsificazione di TRUSTED | blocco (mancata corrispondenza HMAC) |
| Compromesso: rimozione del binding | blocco (nessuna etichetta valida) |
Overhead — effettivamente gratuito nel punto di decisione: creare e verificare un binding costa ~8–9 µs ciascuno (~17 µs in totale), rispetto a una chiamata allo strumento di decodifica di ~11 ms — meno dello ~0,2% aggiunto. La distorsione del carrier è bassa (LSB ≈ 76 dB PSNR, metadati lossless; DCT ≈ 18 dB — una metrica di distorsione, non un'affermazione di impercettibilità percettiva).