O scan disse seguro — aí olhar para a skill a executou


Você instala uma skill da comunidade a partir de um hub. Uma linha installed pisca na tela, o relatório do scan diz seguro, e você segue em frente. Três semanas depois você abre a skill numa sessão só para olhar — e alguma coisa executa.

O momento perigoso não foi instalá-la. Foi olhar para ela. Aqui está o que a guarda de skills de fato escaneia, quais três casos ela deixou passar e a única ação de limpeza que vale fazer hoje.

Como a guarda funciona

Skills de origem externa passam por um scan estático por regex, depois uma política de instalação ciente de confiança decide se elas entram:

Nível de confiança veredito seguro veredito de cautela veredito perigoso
builtin (skills empacotadas) permite permite permite (nunca escaneadas)
trusted (openai/skills, anthropics/skills, huggingface/skills, NVIDIA/skills) permite permite bloqueia
community (qualquer outra fonte) permite bloqueia bloqueia
agent-created permite permite erro de volta ao agente (só quando skills.guard_agent_created está ligado)

Todo veredito é cacheado junto com uma versão de scanner (SCANNER_VERSION, v6 antes desta correção). Essa versão importa: quando ela muda, os vereditos cacheados deixam de contar e a skill é reescaneada.

Os três pontos cegos

1. Só um $HOME literal contava como home

A regra que pega “apague o seu diretório home” casava com a string literal $HOME:

rm -rf $HOME/Documents     → casou, crítico
rm -rf ~/Documents         → passou batido, julgado seguro

Então rm -rf ~/Documents passava batido em todos os níveis de confiança. A correção casa também as formas com til puro (~/, ~ , ~*, ~$), tanto para rm quanto para rmdir.

2. Nada vigiava a sintaxe de auto-execução !cmd``

Hermes skills suportam um fragmento de shell inline: um !`cmd` escrito no corpo da skill é expandido via bash -c quando a skill é visualizada ou carregada. Está desligado por padrão e é configurado explicitamente:

skills:
  inline_shell: false        # desligado por padrão; só habilite para fontes em que você confia
  inline_shell_timeout: 10   # segundos por trecho !`cmd`

Mas nenhuma regra de scan correspondia a isso. Uma skill cujo corpo continha !`rm -rf ~/Documents` era escaneada como segura, instalada, e então executava na próxima vez que você a abrisse.

A correção adiciona um padrão inline_shell_exec (severidade alta, categoria execution). Ele exige um payload não vazio, então uma skill que só documenta a sintaxe não é sinalizada.

3. Uma instalação bloqueada se reportava como bem-sucedida

O terceiro não é uma regra de scan — é a interface. O caminho de instalação do TUI-gateway rodava do_install(skip_confirm=True) com um console sink e retornava installed: True incondicionalmente.

Então, quando o scan de segurança bloqueava uma skill, o chamador (por exemplo, uma instalação com um clique no app desktop) era informado de que a instalação deu certo. Depois da correção, installed: True só volta de uma instalação real; falhas retornam um envelope de erro (código 5031) cuja mensagem e cujo data.log carregam o trecho impresso — a explicação do bloqueio do scan, a tabela de candidatos ambíguos ou a falha de fetch — em vez de despejá-lo num sink.

Skills que você já tem serão reescaneadas?

Sim — e isso funciona pela marca de versão, não por uma reinstalação. Como as entradas de cache guardam scanner_version, uma vez que o scanner passa para a v7:

  • vereditos “seguros” cacheados antes são invalidados;
  • skills de hub instaladas são reescaneadas sob a v7 quando são checadas;
  • qualquer coisa instalada de novo passa direto pela v7.

O segundo ponto é o que importa: se a sua máquina ainda roda o scanner v6, a conclusão “escaneie e era seguro” nunca foi válida para o caso do til puro — a regra simplesmente não existia.

O que fazer agora

  1. Confirme a versão do scanner. Depois de atualizar para uma build com a correção, o SCANNER_VERSION em tools/skills_guard.py deve ler skills-guard-v7 (era v6 antes).
  2. Reescaneie o que você já instalou. Esta é a importante:
    hermes skills audit
    Ela reescaneia skills de hub instaladas. A lista completa de subcomandos está na referência do hermes skills, e onde encontrar skills é coberto em hubs de skills e fontes de busca.
  3. Deixe skills.inline_shell desligado a menos que você confie na fonte. A flag é documentada como opt-in explícito para fontes confiáveis; esta correção deliberadamente não a limitou por confiança (isso é uma decisão de produto), então a regra só torna o risco visível na hora da instalação.
  4. Conheça os limites do scanner. Ele é regex, não análise de fluxo de dados. As próprias notas do módulo citam uma lacuna conhecida: APIs de escrita em nível de linguagem — open(..., 'w'), Path.write_text, shutil.copy* — voltadas para arquivos de config do agente geram só um achado de referência de severidade baixa, porque uma regex estática não consegue ligar a chamada a um destino computado dinamicamente. Passar no scan não é o mesmo que ser seguro para rodar sem olhar.
  5. Revise skills criadas pelo agente também. Com skills.guard_agent_created ligado, um veredito perigoso numa skill escrita pelo agente é devolvido ao agente como erro, para que ele possa reescrever; isso pega padrões ruins óbvios, não é uma revisão.

Para apertar mais a fronteira, skills locais de projeto e o portão de confiança cobre como skills vindas do repositório entram na decisão de confiança, enquanto skills opcionais e usar o catálogo MCP com segurança são dois outros lados da mesma questão.

Onde isso está

O PR #128443 foi mesclado na main em 2026-09-30; existe um relato anterior da mesma família de problemas (issue #63307, o veredito de scan engolido no RPC de instalação). A tag mais nova, v0.21.5, é de 9-24, então as tags ainda entregam o scanner v6 — instalações via git que seguem a main já estão na v7.

A conclusão

Os três pontos cegos compartilham uma forma: o scanner olha para quais caracteres estão escritos, enquanto o risco real muitas vezes mora em como esses caracteres são executados. $HOME e ~ são o mesmo diretório; !`...` e bash -c ... são a mesma execução. O casamento estático vê o primeiro e deixa passar o segundo.

A ação mais valiosa para você é curta: depois de atualizar, rode hermes skills audit. Ela recheca as skills que já estão na sua máquina sob a v7 — e algumas delas nunca foram de fato checadas.