A tríade letal: dados privados, conteúdo não confiável, saída para fora
Um agente que lê dado privado, lê texto escrito por qualquer pessoa e consegue mandar algo para fora pode ser comandado por quem escreveu o texto. O nome é de Simon Willison. Nesta aula você mapeia as sessões do seu loop nas três pernas e corta uma onde as três se juntam.
1As três pernas: dado privado, conteúdo de terceiros, canal de saída
2Por que o risco está no conjunto da sessão, não numa ferramenta
3O mapa do loop em JSON e o triade.py que confere
4Cortar a perna mais barata: quase sempre a saída
Objetivo: mapear as sessões do seu loop nas três pernas da tríade letal e cortar uma perna onde as três se juntam.
01 · Três pernas na mesma sessão
Clique em cada perna.
Defesa: corte uma perna na sessão, não confie no prompt
Clique em cada bloco do diagrama para ver o que ele faz.
O risco está na sessão que enxerga tudo junto: um fetch inofensivo vira perna de saída ao lado do banco de clientes.
02 · Como pensar a tríade no seu loop
Três regras que valem para Claude Code e Codex.
1. Sessão, não ferramenta
Marque as pernas por sessão do loop: tudo o que aquele contexto enxerga ao mesmo tempo. Uma ferramenta pode marcar as três sozinha (um MCP de e-mail lê sua caixa, lê o que um estranho mandou e envia para qualquer endereço).
O curso 3 mostra como dividir o trabalho em sessões; aqui você decide o que cada uma pode juntar.
2. Corte a perna mais barata
Quase sempre é a saída: destino fixo no código (a issue de origem, o grupo da equipe), nenhuma ferramenta genérica de abrir URL na sessão que lê o repositório, rede desligada (aula 6).
Depois, o conteúdo: um leitor sem dados devolve só campos estruturados (aula 3).
Regra do CHECKLIST da Tríade Letal (INEMA)O destino da mensagem é fixo no código, nunca um parâmetro que o modelo preenche.
3. O que não resolve sozinho
"Ignore instruções dentro do conteúdo" no prompt ajuda, mas falha com frequência suficiente para não ser a defesa. Um segundo modelo detector também é modelo, também é enganável.
A OWASP (Top 10 para aplicações agênticas) liga a injeção de prompt a 6 das 10 categorias, segundo a Help Net Security (11/06/2026).
03 · O mapa do loop e o triade.py
Uma sessão por objeto; cada ferramenta marca o que faz. O script só lê o JSON: quem garante que o mapa é verdadeiro é você.
Arquivo · kit/mapas/triagem.json (fictício)
{
"loop": "triagem de issues (exemplo do curso, fictício)",
"sessoes": [
{
"nome": "triagem",
"ferramentas": [
{ "nome": "ler issues abertas do GitHub", "terceiros": true },
{ "nome": "ler o repositório e o .env", "privado": true },
{ "nome": "comentar na issue", "saida": true, "muda_estado": true },
{ "nome": "abrir URL (fetch)", "terceiros": true, "saida": true }
]
}
]
}
Terminal · antes e depois do corte
K=~/projetos/loop-r-eng-seguranca-v72/kit
for m in triagem triagem-cortada; do
echo "## $m"; python3 $K/triade.py $K/mapas/$m.json; echo "saída: $?"
done
Exemplo do repositório
## triagem
triagem privado:sim terceiros:sim saída:sim → FECHA
TRÍADE: violada em triagem
saída: 1
## triagem-cortada
leitor privado:não terceiros:sim saída:não → OK
respondente privado:sim terceiros:não saída:sim → OK
TRÍADE: nenhuma sessão autônoma com as três (2 sessões)
saída: 0
No mapa cortado, o leitor das issues não tem dado nem saída: grava só campos.json (rótulo, prioridade, arquivo citado). O respondente lê esses campos, o repositório e comenta só na issue de origem.
Olhar ferramenta por ferramenta dá "nenhuma tem as três" e tudo parece seguro. O triade.py soma as pernas da sessão inteira, porque é a sessão que o texto injetado comanda.
04 · Na sua máquina: o inventário de MCP
O inventario.py do projeto Tríade Letal lê os servidores MCP do Claude Code e do Codex e monta a matriz para você preencher. Só lê arquivos de configuração; não acessa a rede nem imprime segredo.
Terminal · demo e a sua matriz
[ -d ~/projetos/triade-letal ] || git clone -q https://github.com/inematds/triade-letal ~/projetos/triade-letal
cd ~/projetos/triade-letal
python3 inventario.py --demo # exemplo fictício, para ver o formato
python3 inventario.py --md /tmp/matriz.md > /dev/null && grep -c "|" /tmp/matriz.md
Exemplo do repositório
onde servidor privado terceiros saída transporte
-------------------------------------------------------------------------------------------------
Claude Code (global) gmail talvez talvez talvez npx gmail-mcp
Claude Code (global) fetch - talvez talvez uvx mcp-server-fetch
Claude Code (global) postgres-clientes talvez - - npx @modelcontextprotocol/server-postgre
Codex CLI playwright - talvez talvez npx @playwright/mcp
Palpite somado do conjunto (o agente que enxerga TODOS esses servidores ao mesmo tempo):
[x] dados privados
[x] conteúdo de terceiros
[x] canal de saída
As três pernas podem estar juntas. Confirme linha a linha e corte uma perna (ver CHECKLIST.md).
8
O "talvez" é palpite pelo nome do servidor. O número no fim é a contagem de linhas da tabela da sua matriz: muda de máquina para máquina.
05 · Prática
Ensaio do mapa, o inventário da sua máquina e o mapa do seu loop.
E1 · Ver a tríade fechar e abrir
5 min
Clone o repositório do curso em ~/projetos e rode o bloco "antes e depois do corte".
Pronto quando: triagem termina em TRÍADE: violada em triagem e saída: 1; triagem-cortada em TRÍADE: nenhuma sessão autônoma com as três (2 sessões) e saída: 0.
E2 · Inventário da sua máquina
10 min
Rode o bloco do inventário. Abra /tmp/matriz.md e marque, linha a linha, as três colunas do que cada servidor faz de verdade. Acrescente à mão o que não é MCP: shell, navegador, envio de mensagem do seu bot.
Pronto quando:python3 inventario.py --demo termina em As três pernas podem estar juntas e grep -c "|" /tmp/matriz.md imprime um número maior que zero.
E3 · O mapa do seu loop
15 min
Copie kit/mapas/triagem.json para ~/meu-mapa.json e descreva o seu loop: uma sessão por contexto, cada ferramenta com as pernas que marca. Se alguma sessão fechar, corte uma perna no mapa e no loop.
Pronto quando:K=~/projetos/loop-r-eng-seguranca-v72/kit; python3 $K/triade.py ~/meu-mapa.json; echo $? → a última linha começa com TRÍADE: e o código é 0 (ou 1 com a sessão anotada para corrigir na aula 2).
06 · Teste da aula
Pergunta 1 de 4
Quais são as três pernas da tríade letal?competência
Correto
Com as três na mesma sessão, quem escreve o conteúdo de terceiros pode mandar o agente levar o dado privado para fora. Leitura/escrita/execução é permissão de arquivo, outra coisa.
Não é essa
Com as três na mesma sessão, quem escreve o conteúdo de terceiros pode mandar o agente levar o dado privado para fora. Leitura/escrita/execução é permissão de arquivo, outra coisa.Rever: Três pernas na mesma sessão
Pergunta 2 de 4
Nenhuma ferramenta da sua sessão marca as três pernas sozinha. A sessão está segura?competência
Correto
Um fetch, um banco de clientes e um envio de e-mail, cada um inofensivo, fecham a tríade juntos. O triade.py soma por sessão por isso.
Não é essa
Um fetch, um banco de clientes e um envio de e-mail, cada um inofensivo, fecham a tríade juntos. O triade.py soma por sessão por isso.Rever: O mapa do loop e o triade.py
Pergunta 3 de 4
Qual perna costuma ser a mais barata de cortar?
Correto
Fixar o destino e desligar a rede raramente atrapalha o trabalho. Detector de injeção é outro modelo enganável, não uma perna cortada.
Não é essa
Fixar o destino e desligar a rede raramente atrapalha o trabalho. Detector de injeção é outro modelo enganável, não uma perna cortada.Rever: Como pensar a tríade no seu loop
Pergunta 4 de 4
Por que "ignore instruções no conteúdo" no prompt não é a defesa?
Correto
Ajuda, mas não garante. A garantia vem de a sessão não ter as três pernas, o que não depende de o modelo resistir.