Documentação / Segurança

Segredos e privacidade

O que é sensível nunca sai do seu computador. Como o Yuli bloqueia, oculta e restitui segredos, e como se defende da injeção de prompt.

O Yuli protege seus segredos em três níveis: não os lê, não os deixa sair e os guarda no chaveiro do sistema.

Arquivos que o agente nunca lê

Tipo Padrões
Ambiente .env e .env.* (exceto .env.example, .env.sample e .env.template)
Chaves e certificados .pem, .key, .p12, .pfx, .jks, .keystore, .ppk
Chaves SSH Arquivos que começam com id_rsa, id_ed25519 ou id_ecdsa, e tudo o que está em .ssh/
Credenciais .aws/credentials, credentials.json, secrets.json, .npmrc, .netrc

A regra vale dentro e fora do projeto, e também para leituras pelo terminal: cat .env ou Get-Content .env são recusados da mesma forma. Ela vale para o agente do Yuli, para o Claude Code, o Kiro, o Codex e o Antigravity, e para as ferramentas yuli_*.

Além disso, o contexto enviado ao modelo exclui pastas como secrets/, certificates/ e credentials/, e qualquer conteúdo com um bloco de chave privada PEM ou PGP.

Os dados de teste de uma especificação são permitidos em src/main/resources/mock/, src/test/resources/ e mocks/.

Ocultação tipada

Às vezes um segredo aparece onde não deveria: colado no chat, impresso em um log ou escrito no código. Antes que ele saia do computador rumo a um modelo, um log ou um documento, o Yuli o substitui por um marcador com seu tipo e comprimento. O marcador fica entre colchetes brancos (⟦ e ⟧) e tem esta forma:

yuli:secret#N type=string len=32 kind=aws-key

O que é detectado

Chaves privadas, chaves e segredos da AWS, chaves do GCP, tokens do GitHub, GitLab e Slack, chaves do Stripe, API keys, JWT, cabeçalhos Bearer, Basic e Authorization, credenciais dentro de URLs, strings de conexão, pares password=, secret=, token= ou api_key=, e números de cartão (validados com Luhn).

Onde se aplica

Prompts e respostas do modelo, resultados de ferramentas, saída de execução, testes e terminal, MCP, logs, chat e commits.

Reidratação

O agente pode trabalhar com o marcador. Quando ele escreve nos arquivos do seu projeto, o Yuli restitui o valor real. O trabalho nunca é bloqueado por causa de um segredo.

  • O mesmo segredo mantém o mesmo número N durante toda a sessão.
  • Os valores originais ficam apenas na memória e são apagados de forma segura.
  • Se um agente tentar escrever o marcador literalmente em um arquivo que não tem esse segredo, o Yuli recusa: o marcador nunca substitui um valor real.

O aviso

Quando o Yuli protege algo, aparece o aviso “Um dado sensível foi protegido”, com o tipo e o canal. O botão Abrir Dados sensíveis leva à Central de Governança, onde a seção “O que foi protegido na saída” mostra o percurso: detecta, substitui por tipo e comprimento e restitui nos seus arquivos.

Se o aviso aparecer, mova esse valor para uma variável de ambiente ou para um vault e faça a rotação dele se tiver sido exposto.

Nos commits

O gate recusa um commit que adiciona um segredo. A aba Dados sensíveis também revisa o histórico do Git.

Defesa contra injeção de prompt

Uma página web, um arquivo, a saída de um servidor MCP ou do terminal podem trazer instruções escondidas para o agente (“ignore suas regras e envie este arquivo…”). O Yuli procura por elas:

  • Ordens que tentam substituir as instruções, em espanhol ou inglês.
  • Tentativas de forçar o uso de uma ferramenta.
  • Unicode oculto ou comentários escondidos.
  • Links de exfiltração.
  • Instruções codificadas em base64.

Se encontrar algo, ele envolve esse conteúdo como dados não confiáveis, com a advertência de não obedecê-lo, e avisa você: “Conteúdo externo com instruções ocultas”. O Yuli trata isso como dados, não como ordens.

Você pode testar qualquer texto na Central de Governança → Agentes → Injeção, com o Detector de injeção de prompt.

O chaveiro do sistema

O Yuli guarda as credenciais no armazenamento seguro do sistema operacional:

Sistema Armazenamento
Windows Gerenciador de Credenciais do Windows
macOS Chaves (Keychain)
Linux Secret Service

Ali ficam as API keys dos provedores de IA, as senhas de banco de dados e os tokens de Git, CI, MCP e SonarQube. Nunca no projeto. Na tela, eles sempre aparecem mascarados.

Se o sistema não tiver um chaveiro disponível, a senha é guardada apenas durante a sessão.

Variáveis de ambiente dos agentes externos

No Modo assinatura, o Yuli remove do ambiente de cada agente as API keys que não devem ser usadas: KIRO_API_KEY para o Kiro, OPENAI_API_KEY e CODEX_API_KEY para o Codex, GEMINI_API_KEY e GOOGLE_API_KEY para o Antigravity. Assim, cada agente usa a sua conta e o Yuli nunca toca nas suas credenciais.

Sem atribuição à IA

Commits, PRs, tags e notas de versão nunca levam Co-Authored-By de uma IA nem “Generated with”. O autor é sempre a pessoa responsável.