Pular para o conteúdo
claudemods

Secret Redactor: ocultar segredos no Claude Code em prompts e saídas de ferramentas

Troca chaves, e-mails e IPs públicos por marcadores antes de o Claude vê-los e os restaura quando uma ferramenta roda.

Permissões

  • Intercepta chamadas de ferramentasVê cada chamada de ferramenta que o Claude faz (tool.call / tool.check) e pode bloqueá-la ou alterá-la.
  • Lê seus promptsPode ver o que você digita e a transcrição da conversa (prompt.* / session.append / session.messages).
  • Altera a interfaceDesenha na interface do Claude Code: faixas, painéis, texto de status, notificações (ui.render / $.ui.*).
testado com
v2.1.291
último teste
requer
Claude Code ≥ 2.1.287
superfícies
notificação

Instale dentro do Claude Code:

/plugin install secret-redactor --marketplace ray-amjad/awesome-claude-code-function-hooks
Todas as opções de instalação ↓

O que este mod faz?

O Secret Redactor é um mod da comunidade de Ray Amjad (ray-amjad), um dos plugins da coleção awesome-claude-code-function-hooks. Serve para ocultar segredos no Claude Code por três caminhos: o que você digita, o que uma ferramenta lê de volta e os blocos de contexto anexados à primeira mensagem. Cada segredo, endereço de e-mail ou endereço IP público é trocado por um marcador como [REDACTED-SECRET-164d0c98] antes de o modelo vê-lo.

O valor não é destruído. O mesmo valor sempre recebe o mesmo marcador, então o Claude ainda distingue um cliente ou uma chave de outra. Quando o Claude chama uma ferramenta depois, o hook restaura os marcadores, e um comando Bash ou um Write leva o valor real. Um cat .env mostra os marcadores ao Claude, e um comando posterior que os use continua funcionando.

Ele oculta chaves no formato de um fornecedor (sk-ant-, ghp_, AKIA, sk_live_, JWTs, webhooks do Slack e do Discord, blocos de chave privada, a senha de uma string de conexão), tokens de alta entropia, endereços de e-mail e endereços IP. Faixas de IP privadas como 127.x, 10.x e 192.168.x continuam visíveis por padrão. Ids de objetos do Stripe como price_ e prod_ são tratados como públicos. Segundo o README do autor, é preciso ativar os hooks de função; é a primeira coisa a conferir se parecer que nada acontece.

Demonstração

A gravação inicia o Claude Code com o mod carregado no pequeno projeto de demonstração, com os hooks de função ativados. Digitamos um prompt com a chave de teste do autor, de test/fixtures/sample.env (não são credenciais reais), e um e-mail de exemplo, e pressionamos Enter. O prompt enviado aparece na transcrição como KEY=[REDACTED-SECRET-164d0c98] mail [REDACTED-EMAIL-6f096ff7], e à direita do rodapé surge um aviso: secret-redactor: hid 2 value(s) from the prompt. O clipe termina enquanto o Claude ainda trabalha; não gravamos a resposta dele.

Instalação

Use qualquer um dos métodos do bloco de instalação; eles instalam direto do marketplace do próprio autor. Depois ative os hooks de função: adicione "env": { "CLAUDE_CODE_ENABLE_FUNCTION_HOOKS": "1" } a ~/.claude/settings.json, ou inicie uma sessão com CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 claude. Para testar sem instalar, clone o repositório e execute claude --plugin-dir ./awesome-claude-code-function-hooks/plugins/secret-redactor.

$ install secret-redactor

Requer Claude Code ≥ 2.1.287

Instala a partir do marketplace do autor: ray-amjad/awesome-claude-code-function-hooks

  1. 1.Uma linha, dentro do Claude Code

    /plugin install secret-redactor --marketplace ray-amjad/awesome-claude-code-function-hooks

    Cole em uma sessão em andamento (v2.1.275+). O Claude Code pede primeiro para adicionar o marketplace.

  2. 2.Pelo seu shell

    claude plugin marketplace add ray-amjad/awesome-claude-code-function-hooks
    claude plugin install secret-redactor@awesome-claude-code-function-hooks

    Depois execute /reload-plugins em qualquer sessão que já esteja aberta.

  3. 3.Experimente sem instalar

    git clone https://github.com/ray-amjad/awesome-claude-code-function-hooks
    claude --plugin-dir ./awesome-claude-code-function-hooks/plugins/secret-redactor

    Carrega o mod só para uma sessão. Nada é adicionado às suas configurações.

Como funciona

O módulo de hooks é um único arquivo, hooks/redact.ts. Um cofre no nível do módulo guarda dois mapas, e o marcador é o tipo mais um hash FNV-1a do valor:

function mint(kind: Kind, value: string): string {
  hidden++
  const seen = byValue.get(value)
  if (seen) return seen
  const tag = `[REDACTED-${kind}-${fnv1a(value)}]`
  byValue.set(value, tag)
  byTag.set(tag, value)
  return tag
}

prompt.submit limpa o texto que você digita e mostra o aviso. tool.call primeiro restaura os marcadores na entrada da ferramenta, deixa a ferramenta rodar com await next(input), limpa o resultado e coloca uma contagem na linha da ferramenta. prompt.context limpa segredos, mas não e-mails, nos blocos anexados à primeira mensagem.

Um valor é um segredo se corresponder a um padrão de fornecedor, se for um token de 24 caracteres ou mais com maiúsculas, minúsculas e dígitos acima de 3,6 bits por caractere, ou se um token mais curto acima de 3,0 bits vier depois de um nome como API_KEY=, "token": ou Bearer. Regras para palavras, nomes em camelCase, alfabetos e hexadecimal puro impedem que SHAs do git e identificadores sejam ocultados.

Personalize

O plugin declara doze opções, que você pode mudar em /config ou em pluginConfigs nas suas configurações de usuário:

  • secrets, pii: desligam cada classe.
  • restoreInToolInputs: deixa de colocar os valores reais de volta antes de uma ferramenta rodar.
  • notify: desliga o aviso e a contagem na linha da ferramenta.
  • minEntropy (3.6), minLength (24), contextMinEntropy (3.0): aumente para ocultar menos.
  • redactPrivateIps: oculta também 127.x, 10.x, 192.168.x e outras faixas reservadas.
  • allow, allowEmails, allowPrefixes, denyPrefixes: exceções e acréscimos separados por vírgula.

Permissões e segurança

Lemos todos os arquivos que o plugin pode executar antes de rodá-lo: plugin.json, hooks/hooks.json, hooks/redact.ts (o único módulo, sem imports além de tipos), o teste e o fixture. Não há package.json, script de instalação, binário nem código empacotado.

  • Rede, comandos, arquivos, ambiente: nenhum. O módulo não chama $.http, $.process, $.fs nem $.env, e não usa $.store ou $.state. O cofre vive na memória do módulo e morre com a sessão. As únicas chamadas de API são $.ui.toast e $.ui.notice.
  • Intercepta chamadas de ferramentas e lê seus prompts. É o objetivo do mod e bate com o README. Ele reescreve seu prompt, as entradas das ferramentas (marcador para valor real) e os resultados delas (valor para marcador). Nunca nega uma chamada.
  • Restaurar é uma capacidade. Qualquer marcador na entrada de uma ferramenta é trocado pelo valor real, seja qual for o comando. Se um resultado de ferramenta trouxer instruções injetadas, o Claude poderia ser convencido a colocar um marcador num comando curl, e a chave real seria enviada. Desligue restoreInToolInputs se isso o preocupa, ao custo de as ferramentas receberem o texto do marcador.
  • Marcadores não são secretos. O hash é um FNV-1a de 32 bits, então o marcador de um valor de baixa entropia, como um e-mail ou um IP, pode ser adivinhado calculando hashes de candidatos. Ele oculta o valor do contexto do modelo, não de quem já pode testar palpites. Em teoria, dois valores podem ter o mesmo hash.
  • As heurísticas deixam passar coisas. As regras de entropia podem deixar um segredo visível ou ocultar um token inofensivo. Ele não analisa o que o modelo escreve e não sobrevive a uma reinicialização.
  • Sem telemetria e sem instruções injetadas. Ele não acrescenta aos prompts nenhum texto próprio além dos marcadores.
  • Licença: MIT, com arquivo LICENSE no repositório.

O claude plugin validate não relatou erros nem avisos, mas as notas apontam dois hooks de bloqueio sem .catch (prompt.submit e tool.call). Se o hook lançar uma exceção, não há proteção de reserva, então um bug no hook poderia fazer o prompt ou a chamada falhar em vez de passar direto. O claude plugin test não encontrou nada para executar, porque o teste do autor é test/detect.test.mts (um script Node comum) e não um arquivo *.test.ts. Não o executamos.

Intercepta chamadas de ferramentas
Vê cada chamada de ferramenta que o Claude faz (tool.call / tool.check) e pode bloqueá-la ou alterá-la.
Lê seus prompts
Pode ver o que você digita e a transcrição da conversa (prompt.* / session.append / session.messages).
Altera a interface
Desenha na interface do Claude Code: faixas, painéis, texto de status, notificações (ui.render / $.ui.*).

Compatibilidade e solução de problemas

Verificado com o Claude Code 2.1.291 no macOS: o validate passou e a demonstração rodou com o plugin carregado. Se nada for ocultado:

  • Os hooks de função estão ativos: CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 nas configurações ou no shell que inicia o Claude Code.
  • Depois de instalar em uma sessão que já está aberta, execute /reload-plugins.
  • O valor está na lista de exceções: domínios de documentação como @example.com, endereços noreply@, faixas de IP privadas e ids de objetos do Stripe são deixados de lado de propósito.
  • Na caixa de entrada você vê seu texto como digitou; os marcadores aparecem depois que o prompt é enviado.

Perguntas frequentes

O Secret Redactor envia meus segredos para algum lugar?
Não. No código não encontramos chamadas de rede, comandos de shell nem acesso a arquivos. Os valores reais ficam em um mapa na memória do módulo de hooks e somem quando a sessão termina.
Por que nada é ocultado depois de instalar?
Segundo o README do autor, é um hook de função e não faz nada enquanto os hooks de função não estiverem ativados. Defina CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 no bloco env de ~/.claude/settings.json, ou inicie uma sessão com essa variável.
O Claude ainda consegue usar uma chave que não vê?
Sim, nas entradas das ferramentas. Antes de uma ferramenta rodar, o hook troca um marcador como [REDACTED-SECRET-164d0c98] pelo valor real, então um comando Bash ou um Write leva a chave real. O modelo só vê o marcador.
Ele oculta um segredo que o próprio Claude escreve?
Não. Só o que o Claude lê é analisado: seu prompt, os resultados das ferramentas e os blocos anexados à primeira mensagem. Uma chave que o modelo escreve em um comando é uma chave que ele já tinha.
Como evito que valores que quero ver sejam ocultados?
Use as opções em /config. allow aceita strings exatas, allowEmails aceita endereços ou um domínio como @yourdomain.com, allowPrefixes marca prefixos de id extras como públicos, e aumentar minEntropy oculta menos.
Bloquear comandos perigosos em execução no Claude CodeDestaque

Bloquear comandos perigosos

Recusa rm -rf /, force-push na main, DROP TABLE, curl | sh e outros comandos Bash destrutivos antes de rodarem.

  • notificação
  • Intercepta chamadas de ferramentas
  • Altera a interface

testado com v2.1.310

Contador de chamadas de ferramentas em execução no Claude CodeDestaque

Contador de chamadas de ferramentas

Conta as chamadas de ferramentas do Claude por turno e por sessão, mostra o total junto ao spinner e adiciona /tally.

  • spinner
  • transcrição
  • status
  • Intercepta chamadas de ferramentas
  • Altera a interface
  • Adiciona comandos/ferramentas

testado com v2.1.310

Mais em Proteções de segurança, Ferramentas que você adiciona ao Claude.