O que sast-skills faz?
Transforme seu assistente de codificação LLM em um scanner SAST completo. Skills prontas para Claude Code, Codex, OpenCode, Cursor e qualquer assistente que carregue pastas de skills CLAUDE.md / AGENTS.md.
Claude Code com Opus é recomendado para qualidade; qualquer modelo capaz funciona.
Destaques
- 31 skills em 28 classes de vulnerabilidades — injeção, controle de acesso quebrado, criptografia fraca, manipulação de arquivos, cadeia de suprimentos, lógica de negócios e riscos específicos de LLM (injeção de prompt, tratamento inseguro de saída).
- Orquestração em quatro fases — reconhecimento → detecção paralela → relatório consolidado → triagem baseada em evidências, totalmente controlada a partir de
CLAUDE.md/AGENTS.md. - Idempotente e retomável — cada fase ignora trabalho cuja saída já existe; reexecute após corrigir problemas para atualizar apenas o que está desatualizado.
- Saída legível por máquina — cada skill emite JSON canônico;
sast-skills exportagrega para JSON, SARIF 2.1.0 ou HTML para GitHub Code Scanning e CI. - Multi-assistente — skills idênticas para Claude Code (
.claude/skills) e para cada assistente que usaAGENTS.md(.agents/skills). - CLI zero-config —
install/update/uninstall/doctor/export, publicado a partir de GitHub Actions com proveniência npm (atestação SLSA).
Fluxo
O orquestrador executa quatro fases — reconhecimento, detecção paralela, síntese e triagem:
flowchart TD
U(["Usuário: Executar varredura de vulnerabilidades"]) --> R{"Orquestrador CLAUDE.md / AGENTS.md"}
R --> S1["Passo 1 — sast-analysis<br/>mapeamento de código e arquitetura"]
S1 -->|sast/architecture.md| S2["Passo 2 — varredura de vulnerabilidades paralela<br/>28 skills: recon, verificação em lote, mesclagem"]
S2 -->|sast/*-results.md e *-results.json| S3["Passo 3 — sast-report<br/>consolidar e classificar"]
S3 -->|sast/final-report.md| S4["Passo 4 — sast-triage<br/>eliminação de falsos positivos,<br/>ajuste de gravidade com evidências"]
S4 -->|sast/final-report-triaged.md e triaged.json| EXP["npx sast-skills export<br/>JSON, SARIF, HTML"]
EXP --> CS(["GitHub Code Scanning, CI, dashboards"])
Cada passo é idempotente: se seu arquivo de saída já existir, o orquestrador o ignora. Reexecute a varredura após corrigir problemas para atualizar apenas o que está desatualizado.
O que detecta
Todas as skills seguem o mesmo padrão de três fases: recon → verificação em lote (subagentes paralelos, 3 por lote) → mesclagem. Cada uma escreve um relatório markdown legível por humanos e um arquivo JSON canônico de descobertas que sast-skills export agrega.
Reconhecimento e Síntese
| Skill | Função |
|---|---|
sast-analysis | Reconhecimento de código, mapeamento de arquitetura, modelo de ameaças |
sast-report | Consolidar descobertas por classe em um relatório classificado |
sast-triage | Remover falsos positivos e ajustar gravidades com evidências do código |
Injeção
| Skill | Classe de Vulnerabilidade |
|---|---|
sast-sqli | Injeção de SQL |
sast-nosql | Injeção NoSQL (Mongo, Firestore, DynamoDB) |
sast-ldap | Injeção em filtro / DN LDAP |
sast-graphql | Construção insegura de documento GraphQL |
sast-xss | Cross-Site Scripting |
sast-ssti | Injeção de Template no Lado do Servidor |
sast-rce | Execução Remota de Código (injeção de comando, eval, desserialização insegura) |
sast-xxe | Entidade Externa XML |
sast-ssrf | Falsificação de Solicitação no Lado do Servidor |
sast-openredirect | Redirecionamento aberto (phishing / roubo de token OAuth) |
Controle de Acesso e Autenticação
| Skill | Classe de Vulnerabilidade |
|---|---|
sast-idor | Referência Direta Insegura a Objetos |
sast-missingauth | Autenticação ausente / autorização em nível de função quebrada |
sast-jwt | Implementações inseguras de JWT |
sast-csrf | Falsificação de Solicitação entre Sites |
sast-cors | Configuração incorreta de CORS |
Arquivos, Criptografia e Runtime
| Skill | Classe de Vulnerabilidade |
|---|---|
sast-pathtraversal | Travessia de caminho / diretório |
sast-fileupload | Upload inseguro de arquivos |
sast-crypto | Primitivas fracas, modos ruins, reutilização de IV, PRNG fraco |
sast-prototype | Poluição de protótipo JavaScript |
sast-redos | DoS por regex com retrocesso catastrófico |
sast-race | Condições de corrida e TOCTOU |
Exposição de Dados e Cadeia de Suprimentos
| Skill | Classe de Vulnerabilidade |
|---|---|
sast-hardcodedsecrets | Chaves de API / tokens / credenciais em código voltado ao cliente |
sast-pii | Vazamento de PII e credenciais para logs / telemetria / páginas de erro |
sast-deps | Dependências com vulnerabilidades conhecidas (CVE em lockfiles) |
sast-iac | IaC inseguro (Dockerfile / Terraform / Kubernetes / GitHub Actions) |
Lógica de Negócios e Específicas de LLM
| Skill | Classe de Vulnerabilidade |
|---|---|
sast-businesslogic | Manipulação de preço, bypass de fluxo, abuso de recompensas |
sast-promptinjection | Texto não confiável atingindo um prompt LLM (OWASP LLM #1) |
sast-llmoutput | Saída LLM não validada atingindo sinks de código / HTML / SQL / shell (OWASP LLM #2) |
Instalação
npx sast-skills install
O instalador pergunta qual assistente deve ser alvo (claude / agents / all) e se deve instalar no projeto atual ou no diretório home do usuário (project / global). Para pular prompts:
npx sast-skills install --yes --assistant claude --scope project
Se seu projeto já contém um
CLAUDE.mdouAGENTS.md, o instalador se recusa a sobrescrevê-lo por padrão — faça um backup ou use--force.
Instalação manual (sem npx / npm)
Use este caminho se não puder executar npx (proxy corporativo, registro npm inacessível, ambiente offline) ou se quiser fixar a fonte deste fork em vez do pacote npm publicado. O instalador CLI faz apenas duas coisas — colocar o arquivo de entrada do orquestrador na raiz do projeto e espelhar cada SKILL.md no diretório oculto correto — portanto, um simples cp -R reproduz exatamente o mesmo resultado.
1. Obter os arquivos empacotados
git clone https://github.com/mstfknn/sast-skills.git
Tudo que você precisa está em sast-skills/sast-files/:
sast-files/
├── CLAUDE.md # Entrada do orquestrador para Claude Code
├── AGENTS.md # Entrada do orquestrador para Gemini CLI / Codex / OpenCode / Cursor
├── .claude/skills/sast-*/SKILL.md # 31 skills no formato Claude Code
└── .agents/skills/sast-*/SKILL.md # Mesmas 31 skills espelhadas para assistentes AGENTS.md
As duas árvores de skills são mantidas sincronizadas por npm run sync — o conteúdo é idêntico, apenas o nome do diretório difere.
2a. Instalar para Claude Code
Defina SAST_SRC para o caminho do clone para que os comandos abaixo sejam copiáveis:
export SAST_SRC=/absolute/path/to/sast-skills
cd /path/to/your-project
Escopo do projeto (recomendado — versionado junto com seu repositório):
cp "$SAST_SRC/sast-files/CLAUDE.md" ./CLAUDE.md
cp -R "$SAST_SRC/sast-files/.claude" ./
Se você já usa um
CLAUDE.mdno nível do projeto, não o sobrescreva — Claude Code lê apenas umCLAUDE.mdpor projeto. Mescle o conteúdo do orquestrador (o fluxo de quatro fases) em seu arquivo existente.
Escopo global (skills disponíveis em todos os projetos; orquestrador ainda copiado por projeto):
mkdir -p ~/.claude/skills
cp -R "$SAST_SRC/sast-files/.claude/skills/." ~/.claude/skills/
# Em seguida, em qualquer projeto onde desejar o fluxo de varredura:
cp "$SAST_SRC/sast-files/CLAUDE.md" /path/to/your-project/CLAUDE.md
2b. Instalar para Gemini CLI (e outros assistentes AGENTS.md)
export SAST_SRC=/absolute/path/to/sast-skills
cd /path/to/your-project
cp "$SAST_SRC/sast-files/AGENTS.md" ./AGENTS.md
cp -R "$SAST_SRC/sast-files/.agents" ./
AGENTS.md é a convenção multiassistente adotada por Gemini CLI, Codex CLI, OpenCode e Cursor. Se sua versão do Gemini CLI procura por GEMINI.md em vez disso, renomeie-o — o conteúdo permanece inalterado:
mv AGENTS.md GEMINI.md
3. Verificar a instalação
# Escopo do projeto (Claude Code)
ls CLAUDE.md && ls .claude/skills/ | head
# Escopo do projeto (Gemini / AGENTS.md)
ls AGENTS.md && ls .agents/skills/ | head
# Escopo global (Claude Code)
ls ~/.claude/skills/ | head
Você deve ver todos os 31 diretórios de skill sast-*. Abra o projeto em seu assistente e solicite "Executar varredura de vulnerabilidades" — o orquestrador dentro de CLAUDE.md / AGENTS.md conduz as quatro fases a partir daí.
4. Manter uma instalação manual atualizada
cd "$SAST_SRC" && git pull
# Reexecute os comandos cp do Passo 2a / 2b para atualizar — eles são idempotentes.
Se você mantiver o clone por perto, cd "$SAST_SRC" && git pull && <reexecutar cp> é o equivalente manual de npx sast-skills update.
Comandos CLI
| Comando | O que faz |
|---|---|
npx sast-skills install | Copia CLAUDE.md / AGENTS.md e a árvore de skills para seu projeto ou $HOME |
npx sast-skills update | Atualiza uma instalação existente com os arquivos de skill atualmente empacotados |
npx sast-skills uninstall | Remove skills instaladas; recusa-se a remover um CLAUDE.md modificado sem --force |
npx sast-skills doctor | Verifica uma instalação e relata OK / AUSENTE / MODIFICADO por arquivo; sai com código diferente de zero em caso de problemas |
npx sast-skills export --input sast/ --format sarif --output report.sarif | Agrega sast/*-results.json em JSON, SARIF 2.1.0 ou HTML |
npx sast-skills export --input sast/ --triaged --format sarif | Prefere o sast/triaged.json triado em vez dos resultados brutos por skill |
npx sast-skills --version | Imprime a versão do CLI instalado |
Flags de instalação
| Flag | Propósito |
|---|---|
--yes | Não interativo; necessário quando stdin não é um TTY |
| `--assistant <claude | agents |
| `--scope <project | global>` |
--target <path> | Alvo de instalação explícito (sobrescreve --scope) |
--force | Sobrescrever um CLAUDE.md / AGENTS.md pré-existente |
--dry-run | Imprimir o plano de arquivos sem escrever |
Executando uma varredura
Após a instalação, abra o projeto em seu assistente de IA e peça:
Executar varredura de vulnerabilidades
ou
Encontrar vulnerabilidades neste código
O orquestrador assume o controle. Ele executa todas as quatro fases automaticamente, respeita a idempotência (reexecuções capturam apenas o que está faltando) e escreve tudo em sast/ na raiz do seu projeto.
Arquivos de saída
| Arquivo | Descrição |
|---|---|
sast/architecture.md | Stack de tecnologia, arquitetura, pontos de entrada, fluxos de dados |
sast/*-results.md | Descobertas por classe de vulnerabilidade (legível por humanos) |
sast/*-results.json | Descobertas canônicas legíveis por máquina (alimentam sast-skills export) |
sast/final-report.md | Relatório bruto consolidado classificado por gravidade |
sast/final-report-triaged.md | Relatório triado — falsos positivos removidos, gravidades ajustadas com evidências |
sast/triaged.json | Descobertas canônicas triadas (preferido por sast-skills export --triaged) |
Esquema de descobertas
Cada skill escreve sast/<skill>-results.json como uma lista simples de descobertas:
{
"findings": [
{
"id": "sast-sqli-0001",
"skill": "sast-sqli",
"severity": "critical|high|medium|low|info",
"title": "Injeção de SQL em /api/user",
"description": "…",
"location": { "file": "src/api/user.js", "line": 42, "column": 10 },
"remediation": "…"
}
]
}
sast-skills export agrega esses arquivos em um documento envolto em um envelope run — { "run": { "tool": "sast-skills", "version": "<cli-version>" }, "findings": [...] } — estampando a versão do CLI que produziu o relatório. A etapa de triagem escreve sast/triaged.json nessa mesma forma envelopada.
Descobertas triadas adicionam triage_status (confirmed|upgraded|downgraded|false_positive), triage_original_severity (quando a gravidade mudou) e triage_evidence com citações concretas do código.
Integrações com CI
GitHub Code Scanning (SARIF)
Ação composta em .github/actions/scan/action.yml:
- uses: mstfknn/sast-skills/.github/actions/scan@main
with:
input: sast/
output: sast-skills.sarif
Isso executa sast-skills export --format sarif e envia o resultado para Code Scanning via github/codeql-action/upload-sarif@v3.
Gancho pre-commit
Copie hooks/pre-commit para .git/hooks/pre-commit para fazer com que sast-skills doctor proteja cada commit.
Docker
docker build -t sast-skills .
docker run --rm -v "$PWD:/work" sast-skills export --input sast/ --format sarif --output report.sarif
O Dockerfile empacotado é baseado em node:20-alpine com sast-skills definido como ponto de entrada.
Verificar e solucionar problemas
# A instalação está no formato esperado?
npx sast-skills doctor --target . --assistant claude
# Verificação de versão
npx sast-skills --version
npm view sast-skills version # mais recente no registro
# Atualização
npx sast-skills update
doctor sai com 0 se cada arquivo empacotado no alvo corresponder à cópia da versão instalada, e 1 se algum arquivo estiver AUSENTE ou MODIFICADO. MODIFICADO significa que o arquivo divergiu da cópia empacotada — esperado se você editar o arquivo de entrada, caso contrário, um sinal para executar update.
Contribuindo
Veja CONTRIBUTING.md. Loop do desenvolvedor:
npm install
npm test # suíte vitest (com proteção TDD-guard ativada)
npm run sync # espelhar .claude/skills → .agents/skills
node scripts/scaffold-skill.js sast-foo # esboçar uma nova skill em ambas as árvores
node scripts/register-skill.js sast-foo foo "Foo" "Descrição de injeção Foo"
npm run lint:md # markdownlint
…
[truncado para tradução]