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
- Confirme a versão do scanner. Depois de atualizar para uma build com a correção, o
SCANNER_VERSIONemtools/skills_guard.pydeve lerskills-guard-v7(era v6 antes). - Reescaneie o que você já instalou. Esta é a importante:
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.hermes skills audit - Deixe
skills.inline_shelldesligado 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. - 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. - Revise skills criadas pelo agente também. Com
skills.guard_agent_createdligado, 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.