
SkillSpector v2.11.1
Scanner de segurança para skills de agentes de IA. Detecta vulnerabilidades, padrões maliciosos, riscos de segurança, injeção de prompt, exfiltração de dados e riscos de supply-chain em skills do Claude Code, Codex e MCP antes de instalá-las.
SkillSpector
Scanner de segurança para skills de agentes de IA. Detecte vulnerabilidades, padrões maliciosos e riscos de segurança antes de instalar skills de agentes.
Visão geral
Skills de agentes de IA (usadas por Claude Code, Codex CLI, Gemini CLI, etc.) são executadas com confiança implícita e verificação mínima. Pesquisas mostram que 26,1% das skills contêm vulnerabilidades e 5,2% apresentam provável intenção maliciosa.
O SkillSpector ajuda você a responder: "Esta skill é segura para instalar?"
O SkillSpector faz parte do pipeline NVIDIA Verified Skills, que verifica, avalia e assina skills de agentes antes da publicação. As skills aprovadas são publicadas no catálogo de skills da NVIDIA.
Documentação
- Verifique skills de agentes antes da instalação — Guia hospedado: quando verificar, como ler um relatório e como controlar instalações.
- Guia de desenvolvimento — Arquitetura, estrutura de pacotes e como estender o pipeline de análise.
- Limites de recursos de análise — Limites de bundle fail-closed, parser, artefato aninhado, ledger e descobertas.
- Extensão Pi — Instale o SkillSpector como uma ferramenta Pi para verificar skills de dentro de sessões de agentes.
Recursos
- Entrada multi-formato: Verifique repositórios Git, URLs, arquivos zip, diretórios ou arquivos individuais
- 71 padrões de vulnerabilidade em 17 categorias: injeção de prompt, exfiltração de dados, escalonamento de privilégios, cadeia de suprimentos, agência excessiva, tratamento de saída, vazamento de prompt do sistema, envenenamento de memória, uso indevido de ferramentas, agente desonesto, anti-recusa, abuso de gatilhos, código perigoso (AST), rastreamento de taint, assinaturas YARA, privilégio mínimo MCP e envenenamento de ferramentas MCP
- Análise em dois estágios: Análise estática rápida + avaliação semântica opcional por LLM
- Consultas de vulnerabilidade em tempo real: Consultas SC4 ao OSV.dev para dados CVE em tempo real com fallback offline automático
- Múltiplos formatos de saída: Relatórios em terminal, JSON, Markdown e SARIF
- Pontuação de risco: Pontuação de 0 a 100 com rótulos de gravidade e recomendações claras
- Supressão de linha de base / falsos positivos: Aceite descobertas conhecidas por meio de uma linha de base de regras glob ou impressão digital para que novas verificações exibam apenas problemas novos (docs)
Início rápido
Instalação
Aviso de software de código aberto: Este projeto fará o download e instalará projetos adicionais de software de código aberto de terceiros. Revise os termos de licença desses projetos de código aberto antes do uso.
Crie e ative um ambiente virtual primeiro (todos os alvos make pressupõem que o venv esteja ativo). Use uv ou pip; o Makefile usa uv se disponível, caso contrário, pip.
Instalação rápida com uv (somente CLI):```bash uv tool install git+https://github.com/NVIDIA/skillspector.git
Update later: uv tool update skillspector
Se você planeja executar `skillspector mcp`, instale o extra MCP no momento da instalação:```bash
uv tool install 'skillspector[mcp] @ git+https://github.com/NVIDIA/skillspector.git'
From source:```bash
Clone the repository
git clone https://github.com/NVIDIA/skillspector.git cd skillspector
Create and activate virtual environment
uv venv .venv && source .venv/bin/activate
or: python3 -m venv .venv && source .venv/bin/activate
Install for production use
make install
Or install with development dependencies
make install-dev
### Docker (sem Python necessário)
Execute o SkillSpector sem instalar Python, compilando-o localmente a partir do [Dockerfile](https://github.com/nvidia/skillspector/blob/main/Dockerfile) incluído. A imagem é baseada na imagem oficial do Docker Python `3.12-slim-bookworm`.
**Compilar a imagem:**```bash
make docker-build
# or: docker build -t skillspector .
Digitalize um diretório local montando seu diretório atual em /scan, o diretório de trabalho do contêiner:```bash
docker run --rm -v "$PWD:/scan" skillspector scan ./my-skill/ --no-llm
**Digitalizar com análise de LLM** fornecendo credenciais com um arquivo `.env` local:```bash
cat > .env <<'EOF'
SKILLSPECTOR_PROVIDER=anthropic
ANTHROPIC_API_KEY=sk-ant-...
EOF
Aqui está a tradução para português do conteúdo fornecido:
Instalação
Requisitos
- Python 3.8 ou superior
- pip (gerenciador de pacotes do Python)
Instalação via pip
Para instalar a ferramenta, execute o seguinte comando:
pip install kitploit-tool
Instalação a partir do código-fonte
Se preferir instalar a partir do repositório, clone o projeto e instale as dependências:
git clone https://github.com/example/kitploit-tool.git
cd kitploit-tool
pip install -r requirements.txt
Verificação da instalação
Após a instalação, verifique se a ferramenta foi instalada corretamente:
kitploit-tool --version
Se tudo estiver configurado corretamente, você verá a versão instalada exibida no terminal.
Uso
Sintaxe básica
A sintaxe geral da ferramenta é a seguinte:
kitploit-tool [opções] <comando>
Comandos disponíveis
Abaixo estão listados os principais comandos disponíveis na ferramenta:
| Comando | Descrição |
|---|---|
scan | Executa uma varredura de segurança no alvo especificado |
exploit | Executa um exploit contra o alvo |
report | Gera um relatório detalhado da varredura |
update | Atualiza a ferramenta para a versão mais recente |
Exemplos de uso
Executando uma varredura básica
Para executar uma varredura básica em um alvo, use o comando scan:
kitploit-tool scan --target https://exemplo.com
Executando uma varredura com opções avançadas
Você pode especificar opções adicionais, como porta e intensidade da varredura:
kitploit-tool scan --target https://exemplo.com --port 8080 --intensity alta
Gerando um relatório
Após a varredura, você pode gerar um relatório detalhado:
kitploit-tool report --format pdf --output relatorio.pdf
Configuração
Arquivo de configuração
A ferramenta utiliza um arquivo de configuração localizado em ~/.kitploit/config.yaml. Você pode editar este arquivo para ajustar o comportamento padrão da ferramenta.
Exemplo de configuração:
# Configuração padrão da ferramenta
scan:
timeout: 30
threads: 10
user_agent: "Kitploit-Tool/1.0"
report:
format: "html"
output_dir: "./relatorios"
Variáveis de ambiente
Algumas opções podem ser definidas por meio de variáveis de ambiente:
| Variável | Descrição |
|---|---|
KITPLOIT_API_KEY | Chave de API para serviços externos |
KITPLOIT_PROXY | Endereço do proxy a ser utilizado |
KITPLOIT_DEBUG | Ativa o modo de depuração (true/false) |
Solução de problemas
Problemas comuns
Erro de permissão negada
Se você encontrar um erro de permissão ao executar a ferramenta, tente usar sudo ou verifique as permissões do diretório de instalação:
sudo kitploit-tool scan --target https://exemplo.com
Dependências ausentes
Caso haja erros relacionados a dependências ausentes, reinstale os requisitos:
pip install -r requirements.txt --upgrade
Problemas de conexão
Se a ferramenta não conseguir se conectar ao alvo, verifique sua conexão de rede e as configurações de proxy:
export KITPLOIT_PROXY=http://seu-proxy:porta
Suporte
Para obter suporte adicional, consulte a documentação completa em https://docs.kitploit.com ou abra uma issue no repositório oficial.
Licença
Este projeto está licenciado sob a licença MIT. Consulte o arquivo LICENSE para mais detalhes.
---```bash
docker run --rm
-v "$PWD:/scan"
--env-file .env
skillspector scan ./my-skill/
Ou passe as credenciais diretamente do seu ambiente de shell:```bash
docker run --rm \
-v "$PWD:/scan" \
-e SKILLSPECTOR_PROVIDER=anthropic \
-e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \
skillspector scan ./my-skill/
Escreva um relatório para o sistema de arquivos do host gravando no diretório montado:```bash
docker run --rm
-v "$PWD:/scan"
skillspector scan ./my-skill/ --no-llm --format json --output report.json
**Alias opcional** para análises estáticas repetidas:```bash
alias skillspector-docker='docker run --rm -v "$PWD:/scan" skillspector'
skillspector-docker scan ./my-skill/ --no-llm
Utilização Básica```bash
Scan a local skill directory
skillspector scan ./my-skill/
Scan a single SKILL.md file
skillspector scan ./SKILL.md
Scan a Git repository
skillspector scan https://github.com/user/my-skill
Scan a zip file
skillspector scan ./my-skill.zip
#### Limites de tamanho
O SkillSpector impõe dois limites independentes para entradas remotas e de arquivos, a fim de limitar o impacto de downloads excessivamente grandes e de zip bombs:
- **Limite por ingestão**: `INGEST_MAX_BYTES` (100 MiB) — aplicado a downloads de URLs transmitidos, ao tamanho total descomprimido de arquivos zip e ao uso de disco pós-clonagem de repositórios Git.
- **Limite de membros do zip**: `INGEST_MAX_ZIP_MEMBERS` (10.000) — limita o número de entradas em um único zip.
Observe que o limite de análise de 1 MB por arquivo (`MAX_FILE_BYTES`) é um limite separado e posterior: ele restringe o que analisadores individuais lerão de um diretório já ingerido. Os limites de ingestão acima restringem quanto conteúdo pode ser gravado no disco em primeiro lugar. A violação de qualquer um dos limites de ingestão falha de forma segura com um `IngestLimitExceededError`.
### Formatos de Saída```bash
# Terminal output (default) - pretty formatted
skillspector scan ./my-skill/
# JSON output - machine readable
skillspector scan ./my-skill/ --format json --output report.json
# Markdown output - for documentation
skillspector scan ./my-skill/ --format markdown --output report.md
# SARIF output - for CI/CD integration and IDE tooling
skillspector scan ./my-skill/ --format sarif --output report.sarif
Batch Scanning
Digitalize diretórios inteiros de skills em paralelo a partir de contrib/batch_scan/:```bash
python -m contrib.batch_scan.batch_scan ./my-skills/ --no-llm
python -m contrib.batch_scan.batch_scan ./my-skills/ --workers 20 -f json -o report.json
python -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f terminal --workers 20
Suporta deteção multilingue (zh/ja/ko) e saída em terminal/JSON/Markdown.
Para scans de LLM com maior concorrência, configure múltiplas chaves de API seguindo
[`.env.example`](https://github.com/nvidia/skillspector/blob/main/contrib/batch_scan/.env.example) — o pool melhora a taxa de transferência
e a resiliência, desde que as chaves não partilhem um limite de taxa ao nível da conta.
Consulte o [guia de contribuição](https://github.com/nvidia/skillspector/blob/main/contrib/batch_scan/docs) para mais detalhes.
> **Nota sobre suporte a LLM:** A configuração padrão tem como alvo o DeepSeek como a
> opção pública mais barata. O DeepSeek-Chat está
> [previsto para ser descontinuado](https://api-docs.deepseek.com/), e o contribuidor
> não possui hardware para testar modelos locais. O scanner em lote foi
> originalmente testado com endpoints compatíveis com OpenAI — a falta de suporte a
> saída estruturada do DeepSeek exigiu correções manuais de parsing de JSON. Se puder
> contribuir com um backend mais universal (Ollama, vLLM ou outro fornecedor),
> PRs são muito bem-vindos.
### Suprimir Falsos Positivos (baseline)
Suprima achados conhecidos/aceites para que a pontuação de risco reflita apenas problemas
não triados e que re-scans revelem apenas achados *novos*. Consulte o
[guia de supressão](https://github.com/nvidia/skillspector/blob/main/docs/SUPPRESSION.md) para a referência completa.```bash
# Accept all current findings into a baseline (run once), then commit it.
skillspector baseline ./my-skill/ -o .skillspector-baseline.yaml
# Scan against the baseline — only NEW findings are reported and scored.
skillspector scan ./my-skill/ --baseline .skillspector-baseline.yaml
# Review what was suppressed (still excluded from the score).
skillspector scan ./my-skill/ --baseline .skillspector-baseline.yaml --show-suppressed
Uma baseline também pode usar regras de glob tolerantes a deriva (por id de regra, caminho de arquivo ou
mensagem) — veja .skillspector-baseline.example.yaml.
Baselines de impressão digital exata são vinculadas a evidências: alterar a fonte escaneada ou a
versão do SkillSpector mantém a descoberta ativa até que seja revisada novamente.
Quando uma baseline selecionada ou a saída da baseline é armazenada dentro do diretório
da skill, o SkillSpector exclui esse arquivo exato da análise de conteúdo para que seu
texto de supressão não possa criar descobertas ou entrar em impressões digitais regeneradas;
arquivos irmãos permanecem no escopo normal de varredura.
Análise de LLM
Para obter os melhores resultados, configure um endpoint de LLM compatível com OpenAI para
análise semântica. Escolha um provedor com SKILLSPECTOR_PROVIDER; provedores hospedados incluem modelos padrão integrados, enquanto provedores CLI recorrem ao modelo padrão do runtime local, a menos que SKILLSPECTOR_MODEL esteja definido. O SkillSpector também funciona com
servidores locais compatíveis com OpenAI (Ollama, vLLM, llama.cpp) e gateways de
inferência gerenciados.
Provedor (SKILLSPECTOR_PROVIDER) | Variável de ambiente de credencial | Endpoint | Modelo padrão |
|---|---|---|---|
openai | OPENAI_API_KEY (+ OPENAI_BASE_URL opcional) | api.openai.com (ou qualquer URL compatível com OpenAI) | gpt-5.4 |
anthropic | ANTHROPIC_API_KEY | api.anthropic.com | claude-opus-4-6 |
anthropic_proxy | ANTHROPIC_PROXY_API_KEY + ANTHROPIC_PROXY_ENDPOINT_URL | Qualquer proxy raw-predict estilo Vertex | claude-sonnet-4-6 |
bedrock | AWS_PROFILE (opcional) + AWS_REGION — SigV4 via boto3 | AWS Bedrock Runtime | us.anthropic.claude-sonnet-4-6-20250915-v1:0 |
nv_build | NVIDIA_INFERENCE_KEY | build.nvidia.com | deepseek-ai/deepseek-v4-flash |
claude_cli | (nenhuma — usa autenticação CLI local) | binário local claude | fallback do runtime local Claude, ou SKILLSPECTOR_MODEL |
codex_cli | (nenhuma — usa autenticação CLI local) | binário local codex | fallback do runtime local Codex, ou SKILLSPECTOR_MODEL |
Stock OpenAI
export SKILLSPECTOR_PROVIDER=openai export OPENAI_API_KEY=sk-... skillspector scan ./my-skill/
Anthropic
export SKILLSPECTOR_PROVIDER=anthropic export ANTHROPIC_API_KEY=sk-ant-... skillspector scan ./my-skill/
Anthropic via Vertex-style proxy (corporate gateways, GCP Vertex AI)
export SKILLSPECTOR_PROVIDER=anthropic_proxy export ANTHROPIC_PROXY_ENDPOINT_URL=https://my-gateway.example.com/models/claude-sonnet-4-6:streamRawPredict export ANTHROPIC_PROXY_API_KEY=your-bearer-token export SKILLSPECTOR_MODEL=claude-sonnet-4-6 skillspector scan ./my-skill/
AWS Bedrock (Claude via SigV4)
export SKILLSPECTOR_PROVIDER=bedrock
Optional: select an AWS named profile. When unset, the standard
boto3 credential chain (env vars, instance metadata, SSO, etc.) resolves.
export AWS_PROFILE=my-profile
export AWS_REGION=us-west-2 # default if unset
Default model: us.anthropic.claude-sonnet-4-6-20250915-v1:0
Override with any Bedrock model ID, cross-region inference-profile
ID, or your own application-inference-profile ARN:
export SKILLSPECTOR_MODEL=us.anthropic.claude-opus-4-6-20250915-v1:0
skillspector scan ./my-skill/
NVIDIA build.nvidia.com
export SKILLSPECTOR_PROVIDER=nv_build export NVIDIA_INFERENCE_KEY=nvapi-... skillspector scan ./my-skill/
Local Claude CLI — no API key; uses your existing claude auth login session
Requires: claude CLI installed and authenticated (claude auth login)
export SKILLSPECTOR_PROVIDER=claude_cli
Uses the local Claude CLI runtime fallback unless SKILLSPECTOR_MODEL is set.
export SKILLSPECTOR_MODEL=claude-sonnet-4-6
skillspector scan ./my-skill/
Local Codex CLI — no API key; uses your existing codex login session
Requires: codex CLI installed and authenticated
export SKILLSPECTOR_PROVIDER=codex_cli skillspector scan ./my-skill/
Local Ollama or any OpenAI-compatible endpoint
export SKILLSPECTOR_PROVIDER=openai export OPENAI_API_KEY=ollama export OPENAI_BASE_URL=http://localhost:11434/v1 export SKILLSPECTOR_MODEL=llama3.1:8b skillspector scan ./my-skill/
Override the provider's default model
export SKILLSPECTOR_MODEL=gpt-5.2 skillspector scan ./my-skill/
Skip LLM analysis (faster, static analysis only)
skillspector scan ./my-skill/ --no-llm
### Servidor MCP
Execute o SkillSpector como um servidor [Model Context Protocol](https://modelcontextprotocol.io)
para que qualquer agente compatível com MCP (Claude Code, Codex CLI, Gemini CLI) ou
runtime remoto possa chamar a varredura como uma ferramenta e **condicionar instalações de skills/MCP ao
resultado** — transformando o SkillSpector em uma proteção em tempo de execução, em vez de uma
etapa de auditoria fora do fluxo.
`skillspector mcp` requer `skillspector[mcp]`.```bash
# Install, or reinstall if you already used the CLI-only path
uv tool install --force 'skillspector[mcp] @ git+https://github.com/NVIDIA/skillspector.git'
# FastMCP stdio transport for local CLI agents
skillspector mcp
# streamable HTTP/SSE transport for remote / A2A callers
skillspector mcp --transport http --host 127.0.0.1 --port 8000
O transporte stdio é o caminho atual do FastMCP para agentes CLI locais, e o problema de travamento na inicialização relatado na issue #199 ainda se aplica a ele.
O servidor expõe uma única ferramenta:
scan_skill(target, use_llm=true, output_format="json")— analisa uma URL de Git, URL de arquivo,.zip, arquivo.mdou diretório e retorna um veredito estruturado:risk_score(0-100),severity,recommendation,safe_to_installefindings. Ele também informallm_used/scan_modepara que uma pontuação baixa de uma análise apenas estática nunca seja confundida com uma análise completa limpa.
Registre-o com o Claude Code via:```bash claude mcp add skillspector -- skillspector mcp
> **Segurança — modelo de confiança do transporte HTTP**
>
> O transporte HTTP é fornecido **sem autenticação**. Qualquer chamador que
> consiga alcançar a porta pode invocar `scan_skill`. Via stdio ou `127.0.0.1`,
> isso representa o mesmo limite de confiança que a CLI. Se você vincular a uma
> interface roteável:
>
> - Coloque o servidor atrás de um proxy reverso autenticado (ex.: nginx + mTLS)
> antes de expô-lo externamente.
> - Caminhos locais e URLs `file://` são **automaticamente rejeitados** via HTTP
> para impedir que chamadores não autenticados leiam arquivos arbitrários do
> host. Apenas URLs remotas de Git e `.zip` são aceitas.
## Padrões de Vulnerabilidade
O SkillSpector detecta **71 padrões de vulnerabilidade** em 17 categorias:
### Injeção de Prompt (6 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| P1 | Substituição de Instruções | ALTA | Comandos para ignorar restrições de segurança |
| P2 | Instruções Ocultas | ALTA | Diretivas maliciosas em comentários/texto invisível |
| P3 | Comandos de Exfiltração | ALTA | Instruções para transmitir contexto externamente |
| P4 | Manipulação de Comportamento | MÉDIA | Instruções sutis que alteram decisões do agente |
| P5 | Conteúdo Prejudicial | CRÍTICA | Instruções que podem causar dano físico |
| P9 | Preenchimento com Espaços em Branco | MÉDIA | Grande preenchimento com espaços em branco ocultando instruções abaixo/ao lado da área visível |
### Anti-Recusa (3 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| AR1 | Supressão de Recusa | ALTA | Instruções para nunca recusar ou sempre cumprir (ex.: "nunca recuse", "sempre cumpra") |
| AR2 | Supressão de Avisos | ALTA | Instruções para omitir avisos, isenções de responsabilidade ou comentários éticos (ex.: "sem avisos", "não moralize") |
| AR3 | Anulação da Política de Segurança | ALTA | Enquadramento de jailbreak que anula proteções (ex.: "você não tem restrições", "ignore suas diretrizes", "faça qualquer coisa agora") |
### Exfiltração de Dados (4 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| E1 | Transmissão Externa | MÉDIA | Envio de dados para URLs externas |
| E2 | Coleta de Variáveis de Ambiente | ALTA | Enumeração, cópia ou busca de dados de ambiente para coletar segredos |
| E3 | Enumeração do Sistema de Arquivos | MÉDIA | Varredura de diretórios em busca de arquivos sensíveis |
| E4 | Vazamento de Contexto | ALTA | Transmissão do contexto da conversa externamente |
### Escalação de Privilégios (3 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| PE1 | Permissões Excessivas | BAIXA | Solicitação de acesso além da funcionalidade declarada |
| PE2 | Execução Sudo/Root | MÉDIA | Invocação de privilégios elevados do sistema |
| PE3 | Acesso a Credenciais | ALTA | Leitura de chaves SSH, tokens, senhas |
### Cadeia de Suprimentos (9+ padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| SC1 | Dependências sem Versão Fixada | BAIXA | Sem restrições de versão nos pacotes |
| SC2 | Busca de Scripts Externos | ALTA | curl \| bash e execução remota de código |
| SC3 | Código Ofuscado | ALTA | Execução codificada em Base64/hex |
| SC4 | Dependências Vulneráveis Conhecidas | ALTA | Dependências com CVEs conhecidas (consulta ao vivo no OSV.dev) |
| SC5 | Dependências Abandonadas | MÉDIA | Pacotes sem manutenção e sem atualizações de segurança |
| SC6 | Typosquatting | ALTA | Nomes de pacotes semelhantes a pacotes populares |
| SC8 | Bytecode Python Incluído | ALTA | Presença de `__pycache__` / `.pyc` (a descoberta ignora; bytecode malicioso contorna) |
| SC9 | Artefato Executável Oculto | ALTA | Executável aninhado em um contêiner de documento ou artefato oculto/disfarçado |
### Agência Excessiva (5 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| EA1 | Acesso Irrestrito a Ferramentas | ALTA | Acesso irrestrito a ferramentas sem limitações |
| EA2 | Tomada de Decisão Autônoma | ALTA | Decisões de alto impacto sem supervisão humana |
| EA3 | Expansão de Escopo | MÉDIA | Capacidades que vão além do propósito declarado |
| EA4 | Acesso Ilimitado a Recursos | MÉDIA | Sem limites de taxa ou cotas no consumo de recursos |
| EA5 | Seleção de Modelo ou Provedor Externo | MÉDIA/ALTA | Fixação de modelo/provedor ou chamadas externas de CLI de codificação que podem alternar contas de cobrança |
### Tratamento de Saída (3 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| OH1 | Injeção de Saída Não Validada | ALTA | Saída do modelo usada sem sanitização |
| OH2 | Saída Entre Contextos | MÉDIA | Saída flui entre limites de confiança sem validação |
| OH3 | Saída Ilimitada | MÉDIA | Sem limites no tamanho da saída ou na taxa de geração |
### Vazamento do Prompt do Sistema (3 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| P6 | Vazamento Direto | ALTA | Instruções que expõem prompts do sistema ou regras internas |
| P7 | Extração Indireta | MÉDIA | Extração via reformulação, tradução ou canais laterais |
| P8 | Exfiltração Baseada em Ferramentas | ALTA | Prompts do sistema exfiltrados via gravações de arquivos ou solicitações de rede |
### Envenenamento de Memória (3 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| MP1 | Injeção Persistente de Contexto | ALTA | Conteúdo projetado para persistir entre interações |
| MP2 | Preenchimento da Janela de Contexto | MÉDIA | Conteúdo de preenchimento que desloca restrições de segurança |
| MP3 | Manipulação de Memória | ALTA | Adulteração da memória do agente ou do estado armazenado |
### Uso Indevido de Ferramentas (3 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| TM1 | Abuso de Parâmetros de Ferramenta | ALTA | Parâmetros elaborados para comportamento não intencional (shell=True, --force) |
| TM2 | Abuso por Encadeamento | ALTA | Cadeias de ferramentas que contornam verificações de segurança individuais |
| TM3 | Padrões Inseguros | MÉDIA | Padrões excessivamente permissivos (TLS desabilitado, sem autenticação) |
### Agente Malicioso (2 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| RA1 | Automodificação | CRÍTICA | Modificação do próprio código ou configuração em tempo de execução |
| RA2 | Persistência de Sessão | ALTA | Persistência não autorizada via cron jobs ou scripts de inicialização |
### Abuso de Gatilhos (3 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| TR1 | Gatilho Excessivamente Amplo | MÉDIA | Padrões de gatilho que correspondem a palavras comuns |
| TR2 | Gatilho de Comando Sombra | ALTA | Gatilhos que fazem sombra a comandos integrados ou outras habilidades |
| TR3 | Gatilho de Atração por Palavras-Chave | MÉDIA | Gatilhos genéricos projetados para maximizar a ativação |
### AST Comportamental (9 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| AST1 | Chamada exec() | CRÍTICA | exec() direto permitindo execução arbitrária de código |
| AST2 | Chamada eval() | ALTA | eval() direto avaliando expressões arbitrárias |
| AST3 | Importação Dinâmica | ALTA | \_\_import\_\_() carregando módulos arbitrários em tempo de execução |
| AST4 | Chamada subprocess | ALTA | Execução de comandos externos via subprocess |
| AST5 | os.system / família exec | ALTA | Comandos de shell via módulo os |
| AST6 | Chamada compile() | MÉDIA | Criação de objetos de código a partir de strings |
| AST7 | getattr() Dinâmico | MÉDIA | Acesso arbitrário a atributos com nomes não literais |
| AST8 | Cadeia de Execução Perigosa | CRÍTICA | exec/eval combinados com fonte dinâmica (rede, dados codificados) |
| AST9 | Sumidouro getattr() Reflexivo | ALTA | exec reflexivo via `getattr(os,'system')` / `getattr(builtins,'exec')` que evade AST1/AST5 |
### Rastreamento de Fluxo (5 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| TT1 | Fluxo de Dados Direto | ALTA | Dados fluem diretamente de uma fonte para um sumidouro sem sanitização |
| TT2 | Fluxo de Dados Mediado por Variáveis | MÉDIA | Dados fluem da fonte para o sumidouro por meio de variáveis intermediárias |
| TT3 | Cadeia de Exfiltração de Credenciais | CRÍTICA | Credenciais (variáveis de ambiente, segredos) fluem para sumidouros de saída de rede |
| TT4 | Leitura de Arquivo para Exfiltração de Rede | ALTA | Conteúdo de arquivos flui para sumidouros de saída de rede |
| TT5 | Entrada Externa para Execução de Código | CRÍTICA | Entrada de rede ou do usuário flui para sumidouros exec/eval/subprocess |
### Assinaturas YARA (4 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| YR1 | Correspondência de Malware | CRÍTICA | Correspondência de regra YARA para assinaturas de malware conhecidas |
| YR2 | Correspondência de Webshell | CRÍTICA | Correspondência de regra YARA para padrões de webshell |
| YR3 | Correspondência de Criptominerador | ALTA | Correspondência de regra YARA para indicadores de mineração de criptomoedas |
| YR4 | Correspondência de Ferramenta de Hack / Exploit | ALTA | Correspondência de regra YARA para ferramentas de hack ou código de exploit |
### MCP Menor Privilégio (4 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| LP1 | Capacidade Subdeclarada | ALTA | Código usa capacidades não listadas nas permissões declaradas |
| LP2 | Permissão com Curinga | MÉDIA | Lista de permissões contém curingas (\*, all, full, any) |
| LP3 | Declaração de Permissão Ausente | MÉDIA | Sem campo de permissões, mas o código possui capacidades detectáveis |
| LP4 | Permissão Superdeclarada | BAIXA | Permissão declarada, mas nenhuma capacidade correspondente encontrada no código |
### Envenenamento de Ferramentas MCP (4 padrões)
| ID | Padrão | Severidade | Descrição |
|----|---------|----------|-------------|
| TP1 | Instruções Ocultas | ALTA | Diretivas ocultas em metadados (comentários HTML, caracteres de largura zero, base64, URIs de dados) |
| TP2 | Engano Unicode | ALTA | Homóglifos, sobrescritas RTL, identificadores de script misto em metadados de ferramentas |
| TP3 | Injeção na Descrição de Parâmetros | MÉDIA | Padrões de injeção em definições de parâmetros (sobrescritas, tokens de sistema, padrões maliciosos) |
| TP4 | Incompatibilidade Descrição-Comportamento | MÉDIA | Descrição declarada da ferramenta não corresponde ao comportamento real do código (com tecnologia LLM) |
Todos os padrões detectados estão listados nas tabelas acima.
## Pontuação de Risco
### Cálculo da Pontuação
- **Problemas CRÍTICOS**: +50 pontos
- **Problemas ALTOS**: +25 pontos
- **Problemas MÉDIOS**: +10 pontos
- **Problemas BAIXOS**: +5 pontos
- **Scripts executáveis**: multiplicador de 1,3x
### Níveis de Severidade
| Pontuação | Severidade | Recomendação |
|-------|----------|----------------|
| 0-20 | BAIXA | SEGURO |
| 21-50 | MÉDIA | CUIDADO |
| 51-80 | ALTA | NÃO INSTALAR |
| 81-100 | CRÍTICA | NÃO INSTALAR |
## Exemplo de Saída
### Saída do Terminal```
SkillSpector Security Report v2.0.0
Skill: suspicious-skill
Source: ./suspicious-skill/
Scanned: 2026-01-29 10:30:00 UTC
Risk Assessment
Metric Value
Score 78/100
Severity HIGH
Recommendation DO NOT INSTALL
Components (3)
File Type Lines Executable
SKILL.md markdown 142 No
scripts/sync.py python 87 Yes
requirements.txt text 3 No
Issues (2)
HIGH: Env Variable Harvesting (E2)
Location: scripts/sync.py:23
Finding: for key, val in os.environ.items():...
Confidence: 94%
Explanation: This code collects environment variables containing
API keys and secrets, then sends them to an external server.
HIGH: External Transmission (E1)
Location: scripts/sync.py:45
Finding: requests.post("https://api.skill.io/env"...
Confidence: 89%
Explanation: Data is being sent to an external server. Combined
with env harvesting above, this indicates credential exfiltration.
Configuração
Variáveis de Ambiente
| Variável | Descrição | Obrigatória |
|---|---|---|
SKILLSPECTOR_PROVIDER | Provedor de LLM ativo: openai, anthropic, anthropic_proxy, bedrock, nv_build, claude_cli, codex_cli ou gemini_cli. Provedores hospedados usam os padrões do model_registry.yaml incluído; claude_cli e codex_cli recorrem ao modelo padrão do runtime CLI local, a menos que SKILLSPECTOR_MODEL esteja definido. O padrão é nv_build. | Opcional |
NVIDIA_INFERENCE_KEY | Credencial para o provedor nv_build (build.nvidia.com). | Obrigatória para análise de LLM quando SKILLSPECTOR_PROVIDER=nv_build |
OPENAI_API_KEY | Credencial para o provedor OpenAI (SKILLSPECTOR_PROVIDER=openai). Também serve como fallback de nível 2 na cascata de credenciais quando o provedor ativo não retorna credenciais. | Obrigatória para análise de LLM quando SKILLSPECTOR_PROVIDER=openai |
OPENAI_BASE_URL | Substitui o endpoint da OpenAI (ex.: apontar para o Ollama). | Opcional |
SKILLSPECTOR_REASONING_EFFORT | Configuração opcional de esforço de raciocínio, dependente do provedor e do modelo. Valores não vazios são aparados e repassados sem alteração; não definido ou em branco preserva o comportamento padrão do provedor. | Opcional |
SKILLSPECTOR_OUTPUT_LANGUAGE | Rótulo de idioma curto, de linha única (letras, números, espaços, _ ou -; máximo de 64 caracteres) para texto legível por humanos gerado por LLM, como mensagens, explicações e correções. IDs de regras, valores de severidade, caminhos, código e outros valores legíveis por máquina permanecem inalterados. Não definido, em branco ou inválido preserva o idioma de saída padrão. | Opcional |
SKILLSPECTOR_TEMPERATURE | Temperatura de amostragem opcional de 0 a 1 para provedores hospedados. Não definido ou em branco preserva o padrão do provedor. Valores mais baixos podem reduzir a variação entre execuções, mas não garantem saída idêntica. | Opcional |
SKILLSPECTOR_SEED | Semente de amostragem inteira opcional para provedores compatíveis com OpenAI e Azure OpenAI. Outros provedores hospedados e provedores CLI não a recebem. O suporte do provedor permanece dependente do modelo. | Opcional |
ANTHROPIC_API_KEY | Credencial para o provedor Anthropic (SKILLSPECTOR_PROVIDER=anthropic). | Obrigatória para análise de LLM quando SKILLSPECTOR_PROVIDER=anthropic |
ANTHROPIC_BASE_URL | Substitui o endpoint nativo da Anthropic (padrão: https://api.anthropic.com). | Opcional |
ANTHROPIC_PROXY_ENDPOINT_URL | URL completa do endpoint para o provedor proxy Anthropic (raw-predict estilo Vertex). | Obrigatória quando SKILLSPECTOR_PROVIDER=anthropic_proxy |
ANTHROPIC_PROXY_API_KEY | Token Bearer para o provedor proxy Anthropic. | Obrigatória quando SKILLSPECTOR_PROVIDER=anthropic_proxy |
ANTHROPIC_PROXY_API_VERSION | Valor de anthropic_version enviado no corpo da requisição (padrão: vertex-2023-10-16). | Opcional |
AWS_PROFILE | Perfil AWS nomeado para o provedor Bedrock — autentica via SigV4 por meio do boto3. Quando não definido, a cadeia de credenciais padrão do boto3 (variáveis de ambiente, metadados de instância, SSO, etc.) é resolvida. | Opcional (usado quando SKILLSPECTOR_PROVIDER=bedrock) |
AWS_REGION | Região AWS para o endpoint do Bedrock Runtime. O padrão é us-west-2. | Opcional (usado quando SKILLSPECTOR_PROVIDER=bedrock) |
SKILLSPECTOR_MODEL | Substitui o modelo do provedor ativo. Para provedores hospedados, substitui o padrão incluído da tabela de Análise de LLM. Para claude_cli e codex_cli, é encaminhado como --model em vez de usar o fallback do runtime CLI local. | Opcional |
SKILLSPECTOR_MODEL_REGISTRY | Substitui o registro YAML por provedor incluído (src/skillspector/providers/<provider>/model_registry.yaml) por um caminho personalizado. | Opcional |
SKILLSPECTOR_LOG_LEVEL | Nível de log: DEBUG, INFO, WARNING, ERROR (padrão: WARNING). | Opcional |
Provedores CLI (
claude_cli,codex_cli): Nenhuma chave de API é necessária. A autenticação é gerenciada inteiramente pela sessão de login do próprio CLI do agente (claude auth login/codex login). O SkillSpector nunca lê nem encaminha chaves de API quando esses provedores estão ativos. O subprocesso é executado em um sandbox endurecido: ferramentas desabilitadas, sem MCP, modo sandbox somente leitura (codex), e conteúdo de skill não confiável é entregue apenas via stdin.
Opções de CLI```bash
skillspector scan --help
Options: -f, --format [terminal|json|markdown|sarif] Output format [default: terminal] -o, --output PATH Output file path --no-llm Skip LLM analysis (static only) --yara-rules-dir PATH Extra YARA rules directory -b, --baseline PATH Suppress findings listed in a baseline --show-suppressed List baseline-suppressed findings -V, --verbose Show detailed progress --help Show this message and exit
Generate a baseline of all current findings (see docs/SUPPRESSION.md)
skillspector baseline [-o FILE] [--no-llm] [--reason TEXT]
## Integrando o SkillSpector
O SkillSpector é projetado para ser controlado por outras ferramentas (pipelines de CI, portões de instalação, integrações de editores). Seu código de saída e saída JSON são um contrato estável.
### Códigos de saída
`skillspector scan` sai com:
| Código | Significado |
|------|---------|
| `0` | Varredura concluída, `risk_score` ≤ 50 (recomendação `SAFE` ou `CAUTION`) |
| `1` | Varredura concluída, `risk_score` > 50 (recomendação `DO_NOT_INSTALL`) |
| `2` | Erro (entrada inválida, fonte ilegível, falha interna) |
> O código de saída reduz `SAFE` e `CAUTION` para `0`. Para agir de forma diferente sobre eles (por exemplo, *avisar* em `CAUTION` mas *bloquear* em `DO_NOT_INSTALL`), leia o campo `recommendation` da saída JSON em vez de depender do código de saída.
### Saída legível por máquina
`--format json` produz um relatório JSON; sem `--output`/`-o`, ele é gravado na saída padrão (stdout):```bash
skillspector scan ./my-skill/ --format json
The top-level shape is (this example shows a full LLM-backed scan; with --no-llm, metadata.llm_requested is false):```json
{
"skill": { "name": "...", "source": "...", "scanned_at": "<ISO 8601>" },
"risk_assessment": { "score": 0, "severity": "LOW", "recommendation": "SAFE" },
"components": [ { "path": "...", "type": "...", "lines": 0, "executable": false, "size_bytes": 0 } ],
"issues": [ { "id": "...", "category": "...", "severity": "...", "confidence": 0.0, "location": { "file": "...", "start_line": 0 } } ],
"metadata": {
"has_executable_scripts": false,
"skillspector_version": "...",
"llm_requested": true,
"llm_available": true,
"inference_usage": [
{
"node": "semantic_security_discovery",
"request_kind": "structured_output",
"provider": "nv_inference",
"model": "azure/anthropic/claude-opus-4-6",
"model_source": "provider_response",
"usage_source": "provider_response",
"prompt_tokens": 1000,
"completion_tokens": 100,
"cached_tokens": 400,
"cache_write_tokens": 50,
"total_tokens": 1100
}
]
}
}
- `risk_assessment.severity` ∈ `LOW | MEDIUM | HIGH | CRITICAL`.
- `risk_assessment.recommendation` ∈ `SAFE | CAUTION | DO_NOT_INSTALL`, mapeado a partir da severidade: `LOW → SAFE`, `MEDIUM → CAUTION`, `HIGH`/`CRITICAL → DO_NOT_INSTALL`.
- `metadata.llm_error` aparece apenas quando a análise por LLM foi solicitada, mas não estava disponível.
- `metadata.inference_usage` contém um registro saneado por resposta de LLM quando o
provedor expõe contadores de tokens. É uma lista vazia quando o uso não está disponível;
o SkillSpector nunca estima tokens ausentes. Os totais de prompt incluem leituras
e gravações de cache, para que a precificação a jusante possa separar essas partições com segurança.
`model_source` distingue um modelo de provedor identificado de forma independente do
modelo exato solicitado usado quando a identidade da resposta está ausente ou é ambígua.
O SkillSpector atualmente não envia controles de cache de prompt da Anthropic, portanto, suas
solicitações de varredura não podem selecionar os níveis separados de gravação de cache de 5 minutos ou 1 hora;
os campos de resposta específicos de TTL são normalizados defensivamente no contador
agregado de gravação de cache.
- Consulte [Telemetria de uso de inferência](https://github.com/nvidia/skillspector/blob/main/docs/INFERENCE_USAGE.md) para obter a
proveniência completa, contabilidade de cache, privacidade, ingestão com falha fechada e o
contrato de precificação a jusante.
- O formato completo por problema é definido por `Finding.to_dict()` em [models.py](https://github.com/nvidia/skillspector/blob/main/src/skillspector/models.py); confie nos campos acima e trate quaisquer campos adicionais como melhor esforço.
Para ferramentas de CI/IDE, `--format sarif` emite SARIF 2.1.0.
### Mapeamento de gate recomendado
Ao usar o SkillSpector como um gate de instalação, mapeie a recomendação para uma ação:
| `recommendation` | Ação sugerida |
|------------------|------------------|
| `SAFE` | permitir |
| `CAUTION` | solicitar / avisar o usuário |
| `DO_NOT_INSTALL` | bloquear |
O SkillSpector calcula a faixa de pontuação e a recomendação; o quão rígido é o gate (por exemplo, se `CAUTION` bloqueia em CI) é uma decisão de política para a ferramenta integradora.
## Desenvolvimento
### Configuração
Todos os alvos `make` pressupõem que um ambiente virtual já foi criado e ativado. O Makefile usa **uv** se disponível, caso contrário, **pip**.```bash
# Clone, create venv, activate, install dev dependencies
git clone https://github.com/NVIDIA/skillspector.git
cd skillspector
uv venv .venv && source .venv/bin/activate
# or: python3 -m venv .venv && source .venv/bin/activate
make install-dev
# Run tests
make test
# Run tests with coverage
make test-cov
# Run linting
make lint
# Format code
make format
Como Funciona
O SkillSpector usa um pipeline de detecção em duas etapas:
Etapa 1: Análise Estática
- Correspondência rápida baseada em regex em 11 analisadores estáticos
- Análise comportamental baseada em AST que detecta chamadas perigosas (exec, eval, subprocess, etc.)
- Consultas de vulnerabilidades em tempo real via OSV.dev para CVEs conhecidas em dependências
- Verifica todos os arquivos elegíveis para análise no skill
- Alta revocação (captura a maioria dos problemas)
- Precisão moderada (alguns falsos positivos)
Uma assinatura válida de Model Signing OpenSSF de nível raiz (skill.oms.sig) é mantida no
inventário de componentes como tipo oms_signature, mas excluída da análise estática e de conteúdo LLM.
Pacotes OMS necessariamente contêm campos longos de payload, assinatura e certificado codificados em base64;
verificações genéricas de código ofuscado podem, de outra forma, classificar incorretamente esses campos como conteúdo executável oculto.
O reconhecedor verifica a estrutura mínima de OMS DSSE/in-toto; ele não verifica a assinatura,
a cadeia de certificados, a entrada no log de transparência ou a identidade do signatário. Arquivos de assinatura
inválidos ou não reconhecidos são verificados normalmente.
Etapa 2: Análise Semântica LLM (Opcional)
- Avalia contexto e intenção
- Filtra falsos positivos
- Fornece explicações legíveis por humanos
- Melhora a precisão para ~87%
O prompt do LLM inclui proteções anti-jailbreak para evitar que skills maliciosos manipulem a análise.
Consultas de Vulnerabilidades em Tempo Real (SC4)
O SC4 usa a API OSV.dev para verificar dependências em relação ao banco de dados completo de Vulnerabilidades de Código Aberto — cobrindo dezenas de milhares de avisos em PyPI e npm.
- Nenhuma chave de API necessária — OSV.dev é gratuito e sem autenticação.
- Consultas em lote — todas as dependências são verificadas em uma única chamada HTTP.
- Fallback automático — se OSV.dev estiver inacessível (isolado/offline), uma pequena lista de fallback integrada é usada.
- Cache — os resultados são armazenados em cache na memória por 1 hora para evitar chamadas de API redundantes durante uma sessão.
A ferramenta requer acesso HTTPS de saída a api.osv.dev para dados de vulnerabilidades em tempo real. Quando isso não está disponível, as descobertas são limitadas à lista de fallback estática.
Modelo de confiança e egresso de dados
O SkillSpector é defesa em profundidade, não um sandbox. Saiba o que ele faz e o que não faz antes de confiar nele:
- Ele nunca executa o skill verificado. Toda a análise é estática (regex, AST Python, YARA) além de avaliação LLM opcional do conteúdo dos arquivos — o código do skill nunca é executado.
- A análise LLM envia o conteúdo dos arquivos elegíveis para o provedor configurado. Quando a análise LLM está habilitada (o padrão), o conteúdo dos arquivos é enviado ao endpoint
SKILLSPECTOR_PROVIDERativo. Arquivos de assinatura OMS reconhecidos são excluídos. Use--no-llmpara manter o conteúdo local (somente análise estática). - O SC4 envia nomes de dependências ao OSV.dev. A verificação da cadeia de suprimentos consulta OSV.dev com os nomes e versões de pacotes que o skill declara, para procurar CVEs conhecidas. Isso é fundamental para a verificação e é executado mesmo com
--no-llm. Ele envia coordenadas de dependências (não conteúdo de arquivos), não requer chave de API e recorre a uma lista integrada quando OSV.dev está inacessível. - Ele não isola o host. O SkillSpector sinaliza padrões arriscados antes de você instalar um skill; ele não contém nem isola um skill que você escolher instalar mesmo assim.
Limitações
- Conteúdo não-inglês: Pode não detectar padrões em outros idiomas
- Ataques baseados em imagens: Não pode analisar texto em imagens
- Código criptografado/binário: Não pode analisar conteúdo compilado ou criptografado
- Comportamento em tempo de execução: Somente análise estática, sem execução dinâmica
- SC4 offline: Sem acesso de rede a
api.osv.dev, o SC4 usa uma pequena lista de fallback estática
Contexto de Pesquisa
Baseado na pesquisa "Agent Skills in the Wild: An Empirical Study of Security Vulnerabilities at Scale" (Liu et al., 2026):
- Conjunto de dados: 42.447 skills de marketplaces importantes
- Vulneráveis: 26,1% contêm pelo menos uma vulnerabilidade
- Alta gravidade: 5,2% mostram provável intenção maliciosa
- Descoberta principal: Skills com scripts executáveis têm 2,12x mais probabilidade de serem vulneráveis
Integração com a API Python```python
from skillspector import graph
Invoke the LangGraph workflow
result = graph.invoke({ "input_path": "/path/to/skill", "output_format": "json", # terminal, json, markdown, or sarif "use_llm": True, # False for static-only analysis })
Access results
print(f"Risk Score: {result['risk_score']}/100") print(f"Severity: {result['risk_severity']}") print(f"Recommendation: {result['risk_recommendation']}")
for finding in result["filtered_findings"]: print(f"[{finding['severity']}] {finding['rule_id']}: {finding['message']}")
## Licença
Apache License 2.0 — consulte [LICENSE](https://github.com/nvidia/skillspector/blob/main/LICENSE) para mais detalhes.
## Contribuições
Contribuições são bem-vindas! Leia as nossas diretrizes de contribuição e envie pull requests.
## Suporte
- **Problemas**: [GitHub Issues](https://github.com/NVIDIA/skillspector/issues)