
Defesa contra injeção de prompt esteganográfica para IA agêntica usando vinculação de proveniência em tempo de decodificação, autenticação HMAC e aplicação de confiança MCP.
Uma prova de conceito reproduzível de um vetor de injeção de prompt esteganográfico que contorna scanners de conteúdo textual, e uma defesa que o contém na fronteira de decodificação — vinculação de proveniência em tempo de decodificação.
Apenas para pesquisa educacional / de segurança defensiva. Todos os segredos neste repositório são falsos. Use apenas em sistemas que você possui ou está autorizado a testar.
Um atacante envia por e-mail à vítima uma mensagem de aparência comum. Um logotipo de marca na
assinatura do e-mail oculta uma instrução via esteganografia (LSB, DCT ou metadados).
A imagem é visualmente idêntica à original e não contém texto suspeito, então
um scanner de conteúdo não vê nada e a vítima nunca clica em nada. Mas o agente de
sumarização de caixa de entrada rotineiro da vítima processa a assinatura, uma ferramenta em
seu pipeline decodifica a imagem, e a instrução oculta entra no contexto do agente
— onde, em um pipeline MCP multiagente, ela é retransmitida entre agentes como
saída de par confiável e impulsiona uma chamada de ferramenta crítica. Isso é lavagem de confiança
entre modalidades. A defesa, vinculação de proveniência em tempo de decodificação, emite um
rótulo UNTRUSTED assinado com HMAC no instante em que uma ferramenta de reversão de ocultação é executada e
faz a camada MCP manter a linhagem de proveniência ela mesma, de modo que bloqueia qualquer
chamada de ferramenta crítica cuja linhagem seja não confiável — mesmo quando um agente comprometido
apresenta um rótulo válido para um valor confiável não relacionado. Ela contém em vez de
detectar, portanto é independente da redação do payload e do veículo.
Taxa de sucesso do ataque (ASR) — 24 payloads (três veículos × oito evasões: simples, com palavras benignas, Base64, divisão de tokens, homoglifo cirílico, largura zero, confusável Unicode, comentário HTML); menor é melhor. A linha de base de taint em processo é um controle de fluxo de informação que marca a saída de decodificação como não confiável, mas não carrega nenhuma vinculação criptográfica entre domínios:
| Defesa | Vazamentos | n | ASR |
|---|---|---|---|
| Sem defesa (sem verificações) | 24 | 24 | 100% |
| Scanner de conteúdo (palavra-chave/DLP) | 15 | 24 | 62,5% |
| Analisador de intenção por regex | 15 | 24 | 62,5% |
| Taint de fluxo de dados (linha de base IFC) | 0 | 24 | 0% |
| Proveniência em tempo de decodificação (nossa) | 0 | 24 | 0% |
Taint e proveniência empatam na ASR de domínio único; elas divergem sob retransmissão adversarial (abaixo), que é o ponto da vinculação criptográfica.
Substituição de rótulo válido — um agente comprometido apresenta uma vinculação TRUSTED
legitimamente assinada de uma ferramenta benigna, omitindo a origem de decodificação UNTRUSTED
que de fato impulsiona a chamada. A correção é que a camada MCP mantém a linhagem
ela mesma e decide com base em seu próprio registro, não na vinculação fornecida pelo agente:
| Aplicação | Decisão |
|---|---|
| Apenas vinculação fornecida pelo agente (ingênua) | permitir (vaza) |
| Mantida pela camada, dependência omitida | bloquear |
| Mantida pela camada, dependência nos argumentos | bloquear |
| Mantida pela camada, contexto limpo | permitir |
Ablação de componentes — quatro componentes, cada um defendendo um ataque distinto. Desative
um de cada vez; substitution é intra-domínio, forged relay é um rótulo TRUSTED forjado
cruzando um relé não confiável até um verificador remoto que detém apenas a vinculação
apresentada. Crucialmente, o HMAC sozinho não impede a substituição (o registro impede), e
o registro sozinho não sobrevive a um relé entre domínios (o HMAC sobrevive):
| Configuração | Honesto | Substituição | Relay forjado |
|---|---|---|---|
| Mecanismo completo | bloqueado | bloqueado | bloqueado |
| − marcação de decodificação | vaza | vaza | vaza |
| − autenticação criptográfica (HMAC) | bloqueado | bloqueado | vaza |
| − rastreamento de linhagem confiável | bloqueado | vaza | bloqueado |
| − mediação de sink | vaza | vaza | vaza |
Propagação entre contextos — a contaminação sobrevive a uma fronteira de mensagem entre agentes, não apenas a um handle de retorno de ferramenta. Uma decodificação não confiável no Agente A atinge uma chamada crítica no contexto separado do Agente B, e num canal mediado (que o modelo de ameaças já exige para comunicações entre agentes) a contaminação propaga-se e B é bloqueado. Um canal que a camada não medeia está fora do modelo por construção — não é um vazamento dentro do escopo:
| Canal A → B | Chamada crítica de B |
|---|---|
| Mensagem entre agentes mediada (no escopo) | bloqueio (contaminação propagada) |
| Canal lateral não mediado (fora do modelo) | não coberto |
Escalonamento de overhead — MintBinding é ~O(1) (~10–14 µs independentemente da profundidade);
EnforceCritical é linear no fecho de dependências que percorre (≈10 µs na profundidade
1 → ≈0,66 ms na profundidade 100 → ≈6,7 ms na profundidade 1000) e constante (~6–7 µs) no número
de contextos contaminados concorrentes. Fechos realistas (profundidade na casa das dezenas) mantêm-se abaixo de
~0,1 ms.
Utilidade para tarefas legítimas — um caminho auditado de promoção para confiável (re-rotulagem de um valor decodificado específico, por exemplo, um número de fatura obtido por OCR, sob autorização) elimina falsos bloqueios enquanto o ataque permanece bloqueado:
| Regime | Conclusão | Falsos bloqueios | Ataque bloqueado |
|---|---|---|---|
| Sem promoção | 2/3 (67%) | 1 | sim |
| Promoção confiável | 3/3 (100%) | 0 | sim |
Completude do conjunto de decodificação — a suposição de registo, testada diretamente:
| Conjunto de decodificação | Ataque esteganográfico | Chamada crítica legítima |
|---|---|---|
| Correto | bloqueado | permitido |
| Decodificador em falta | vaza | permitido |
| Demasiado abrangente | bloqueado | falso bloqueio |
Integridade do rótulo entre transferências — a vinculação sobrevive a relay honesto e resiste a um worker comprometido:
| Cenário de relay | Decisão do verificador |
|---|---|
| Relay honesto, 1 / 3 / 5 / 10 saltos | verifica; bloqueado |
| Comprometido: reescrever payload, manter HMAC | bloqueio (incompatibilidade de HMAC) |
Comprometido: forjar TRUSTED | bloqueio (incompatibilidade de HMAC) |
| Comprometido: remover vinculação | bloqueio (sem rótulo válido) |
Overhead — efetivamente gratuito no ponto de decisão: criar e verificar uma vinculação custa ~8–9 µs cada (~17 µs combinados), versus uma chamada de ferramenta de decodificação de ~11 ms — abaixo de ~0,2% adicionado. A distorção do portador é baixa (LSB ≈ 76 dB PSNR, metadados sem perdas; DCT ≈ 18 dB — uma métrica de distorção, não uma afirmação de impercetibilidade perceptual).
stego_provenance_defense_poc.ipynb # the full PoC (run top-to-bottom)
requirements.txt # dependencies (mcp pinned <2)