sast-skills
Coleção de habilidades de agente que transformam seu codificador de IA em um scanner SAST.
Documentação
🛡️ sast-skills
Transforme seu assistente de codificação com LLM em um scanner SAST completo.
Skills de agente prontas para uso em 14 assistentes de IA — Claude Code, OpenAI Codex CLI, Gemini CLI, GitHub Copilot, Cursor, Windsurf, OpenCode, Cline, Antigravity, Aider, Kilo Code, Augment Code, Hermes Agent e Mistral Vibe.
Claude Code com Opus é recomendado para qualidade; qualquer modelo capaz funciona.
⚡ Início rápido
npx sast-skills install # pick your assistant(s) — ones found on your PATH are pre-enabled
Em seguida, abra o projeto no seu assistente e solicite:
Executar varredura de vulnerabilidades
Ele executa todas as quatro fases e grava os achados em sast/. Agregue-os com npx sast-skills export --format sarif para GitHub Code Scanning, ou --format oscal para evidências de conformidade com NIST OSCAL.
📑 Sumário
- ✨ Destaques
- 🔄 Fluxo
- 🔍 O que ele detecta
- 📦 Instalação
- 🚀 Executando uma varredura
- 🔌 Integrações com CI
- 🩺 Verificação e solução de problemas
- 🤝 Contribuindo
- 📄 Licença
✨ Destaques
- 68 skills em 64 classes de vulnerabilidades — injeção (incl. variantes XPath, expression-language, CSV-formula, XML-bomb), controle de acesso quebrado, profundidade de API e sessão (rate-limiting, OAuth/OIDC, fixação de sessão, rotas ocultas), criptografia fraca, manipulação de arquivos, supply chain, riscos de CI/CD e metadados de nuvem, lógica de negócios e abuso de pagamento, segurança agêntica/MCP (envenenamento de configuração de skill, envenenamento de ferramentas MCP, config-as-execution, identidade de agente com privilégios excessivos) e runtime de LLM/agente (agência excessiva, isolamento de RAG, chamada insegura de ferramentas, envenenamento de memória, denial-of-wallet), além de um roteador de stack tecnológico.
- Orquestração em quatro fases — reconhecimento → detecção paralela → relatório consolidado → triagem baseada em evidências, totalmente conduzida 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. - Saída pronta para conformidade — os mesmos achados são exportados como NIST OSCAL 1.2.3: um documento
assessment-results(SAR) ou umplan-of-action-and-milestones(POA&M), com cada achado mapeado para os controles do NIST SP 800-53 Rev 5 que ele coloca em dúvida. - Multi-assistente — skills idênticas são fornecidas para Claude Code (
.claude/skills) e para todos os assistentesAGENTS.md(.agents/skills). - CLI sem configuração —
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(["User: Run vulnerability scan"]) --> R{"CLAUDE.md / AGENTS.md orchestrator"}
R --> S1["Step 1 — sast-analysis<br/>codebase and architecture map"]
S1 -->|sast/architecture.md| S2["Step 2 — parallel vulnerability scan<br/>64 skills: recon, batched verify, merge"]
S2 -->|sast/*-results.md and *-results.json| S3["Step 3 — sast-report<br/>consolidate and rank"]
S3 -->|sast/final-report.md| S4["Step 4 — sast-triage<br/>false-positive elimination,<br/>severity adjustment with evidence"]
S4 -->|sast/final-report-triaged.md and triaged.json| EXP["npx sast-skills export<br/>JSON, SARIF, HTML, OSCAL"]
EXP --> CS(["GitHub Code Scanning, CI, dashboards"])
EXP --> GRC(["OSCAL SAR / POA&M for GRC"])
Cada etapa é idempotente: se o arquivo de saída já existir, o orquestrador a ignora. Reexecute a varredura após corrigir problemas para atualizar apenas o que está desatualizado.
🔍 O que ele detecta
Todas as skills seguem o mesmo padrão de três fases: reconhecimento → verificação em lote (subagentes paralelos, 3 por lote) → mesclagem. Cada uma grava um relatório markdown legível por humanos e um arquivo JSON canônico de achados que sast-skills export agrega.
Reconhecimento e Síntese
| Skill | Função |
|---|---|
sast-analysis | Reconhecimento do código, mapeamento de arquitetura, modelo de ameaças |
sast-stack | Roteador de stack tecnológico — escolhe quais skills de detecção executar por projeto |
sast-report | Consolida achados por classe em um relatório classificado |
sast-triage | Remove falsos positivos e ajusta severidades com evidências do código |
Injeção
| Skill | Classe de Vulnerabilidade |
|---|---|
sast-sqli | Injeção de SQL |
sast-nosql | Injeção de NoSQL (Mongo, Firestore, DynamoDB) |
sast-ldap | Injeção de filtro LDAP / DN |
sast-graphql | Construção insegura de documentos GraphQL |
sast-xss | Cross-Site Scripting |
sast-ssti | Injeção de template no servidor |
sast-rce | Execução remota de código (injeção de comando, eval, desserialização insegura) |
sast-xxe | XML External Entity |
sast-ssrf | Server-Side Request Forgery |
sast-openredirect | Redirecionamento aberto (phishing / roubo de token OAuth) |
sast-crlf | CRLF / divisão de resposta HTTP (injeção de cabeçalho) |
sast-ssrfimds | SSRF de metadados de nuvem (roubo de credenciais IMDSv1) |
sast-unsafeconsumption | Resposta não validada de API de terceiros em um sink (injeção de segunda ordem) |
sast-xpath | Injeção de XPath (entrada do usuário em uma expressão XPath) |
sast-csvinj | Injeção de fórmula / CSV em exportações de planilhas |
sast-elinj | Injeção de expression-language (OGNL / SpEL / MVEL / JEXL) |
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 de nível de função quebrada |
sast-jwt | Implementações inseguras de JWT |
sast-csrf | Cross-Site Request Forgery |
sast-cors | Configuração incorreta de CORS |
sast-cookieflags | Ausência de HttpOnly / Secure / SameSite em cookies de sessão |
sast-massassign | Mass assignment / overposting (escalonamento de privilégios) |
sast-secheaders | Cabeçalhos de segurança ausentes (CSP, HSTS, X-Frame-Options, SRI) |
sast-ratelimit | Ausência de rate limit em endpoints de autenticação / caros |
sast-session | Fixação de sessão + IDs de sessão de baixa entropia |
sast-oauth | Configuração incorreta de OAuth / OIDC (redirect_uri, state, PKCE) |
sast-routeinventory | Rotas shadow / debug / admin deixadas registradas |
sast-postmessage | Confiança de origem em postMessage / CSWSH / reverse-tabnabbing |
Arquivos, criptografia e runtime
| Skill | Classe de Vulnerabilidade |
|---|---|
sast-pathtraversal | Path / directory traversal |
sast-fileupload | Upload de arquivo inseguro |
sast-crypto | Primitivas fracas, modos ruins, reutilização de IV, PRNG fraco |
sast-prototype | Poluição de protótipo em JavaScript |
sast-redos | DoS por regex com backtracking catastrófico |
sast-race | Condições de corrida e TOCTOU |
sast-deser | Desserialização insegura (gadget chains, pickle, unserialize) |
sast-tls | Verificação de certificado / hostname TLS desabilitada |
sast-zipslip | Zip Slip — path traversal na extração de arquivos |
sast-dangerousapi | Sinks de API perigosos (eval / exec / reflection / bridges nativas) |
sast-xmlbomb | DoS por expansão de entidades XML (billion laughs / blowup quadrático) |
Exposição de dados e supply chain
| 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) |
sast-errorhandling | Lógica fail-open, vazamento de stack-trace / segredos, modo debug |
sast-excessivedata | Exposição excessiva de dados em respostas de API |
sast-pipelineinj | Injeção em pipeline CI/CD (payloads de eventos não confiáveis) |
sast-depconfusion | Dependency confusion + execução de scripts em tempo de instalação |
sast-lockfile | Ausência de lockfile / hashes de dependência não fixados |
sast-cloudsdk | Uso incorreto de SDK de nuvem (bucket público, chave hardcoded, IAM amplo) |
Lógica de negócios e específicas de LLM
| Skill | Classe de Vulnerabilidade |
|---|---|
sast-businesslogic | Manipulação de preço, bypass de fluxo de trabalho, abuso de recompensas |
sast-paymentlogic | Abuso de pagamento em e-commerce (corrida de preço / cupom / reembolso / saldo) |
sast-promptinjection | Texto não confiável alcançando um prompt de LLM (OWASP LLM #1) |
sast-llmoutput | Saída de LLM não validada alcançando sinks de código / HTML / SQL / shell (OWASP LLM #2) |
Segurança agêntica e MCP
A superfície de ataque da era 2026 que a maioria dos scanners de assinatura não detecta — manipulação em linguagem natural, envenenamento de ferramentas MCP, config-as-execution e identidades de agente com privilégios excessivos. Estas skills usam uma etapa de verificação orientada por LLM, não correspondência de regex.
| Skill | Classe de Vulnerabilidade |
|---|---|
sast-skillaudit | Instrução oculta / shell-sink em skill ou configuração de agente não confiável |
sast-mcpsec | Envenenamento de ferramentas de servidor MCP + ausência de tool-auth |
sast-configrce | Configuração de repositório que executa shell automaticamente ao abrir / fazer checkout do projeto |
sast-agentidentity | Identidade não humana (agente / CI) com privilégios excessivos |
Runtime de LLM e agente
Comportamento em runtime de aplicações de LLM e agente — autoridade de ferramentas, isolamento de recuperação, higiene de segredos em prompts, confiança em memória e limites de custo. O roteador de stack tecnológico controla estas skills para que nunca sejam executadas em codebases sem dependências de LLM/agente.
| Skill | Classe de Vulnerabilidade |
|---|---|
sast-excessiveagency | Autoridade excessiva de agente (ferramentas que alteram estado, sem human-in-the-loop) |
sast-toolcalling | Despacho de ferramentas LLM sem allow-list / validação de argumentos |
sast-ragleak | Vazamento entre tenants em RAG + injeção indireta (ausência de filtro ACL na recuperação) |
sast-systempromptleak | Segredos em prompts de sistema; prompt registrado em log ou ecoado para chamadores |
sast-memorypoison | Dados não confiáveis persistidos na memória do agente e posteriormente confiados |
sast-llmdos | Tokens de LLM / loops de agente sem limites (denial-of-wallet) |
📦 Instalação
npx sast-skills install
O instalador mostra uma seleção múltipla de todos os 14 assistentes suportados (mais Todos os acima) e pergunta se deseja instalar no projeto atual ou no diretório home do usuário (project / global). Para pular os prompts, passe uma lista separada por vírgulas de IDs de assistentes (ou all):
npx sast-skills install --yes --assistant claude,cursor,copilot --scope project
Se o seu projeto já contém um
CLAUDE.mdouAGENTS.md, o instalador se recusa a sobrescrevê-lo por padrão — faça backup ou passe--force.
Instalação manual (sem npx / npm) — clique para expandir
Use este caminho se você não puder executar npx (proxy corporativo, registro npm inacessível, ambiente offline) ou se quiser fixar na fonte deste fork em vez do pacote npm publicado. O instalador CLI faz apenas duas coisas — coloca o arquivo de entrada do orquestrador na raiz do projeto e espelha cada SKILL.md da skill no diretório oculto correto — então um simples cp -R reproduz exatamente isso.
1. Obtenha os arquivos empacotados
git clone https://github.com/mstfknn/sast-skills.git
Tudo o que você precisa está em sast-skills/sast-files/:
sast-files/
├── CLAUDE.md # Orchestrator entry for Claude Code
├── AGENTS.md # Orchestrator entry for Gemini CLI / Codex / OpenCode / Cursor
├── .claude/skills/sast-*/SKILL.md # 68 skills in Claude Code format
└── .agents/skills/sast-*/SKILL.md # Same 68 skills mirrored for AGENTS.md assistants
As duas árvores de skills são mantidas em sincronia por npm run sync — o conteúdo é idêntico, apenas o nome do diretório difere.
2a. Instalação para Claude Code
Defina SAST_SRC para o caminho do clone para que os comandos abaixo permaneçam 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.mdem nível de projeto, não o sobrescreva — Claude Code lê apenas umCLAUDE.mdpor projeto. Mescle o conteúdo do orquestrador (o fluxo de quatro fases) no 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/
# Then in any project where you want the scan flow:
cp "$SAST_SRC/sast-files/CLAUDE.md" /path/to/your-project/CLAUDE.md
2b. Instalação 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" ./
Gemini CLI lê GEMINI.md; o instalador o grava para você quando você escolhe Gemini.
3. Verifique a instalação
# Project scope (Claude Code)
ls CLAUDE.md && ls .claude/skills/ | head
# Project scope (Gemini / AGENTS.md)
ls AGENTS.md && ls .agents/skills/ | head
# Global scope (Claude Code)
ls ~/.claude/skills/ | head
Você deve ver todos os 31 diretórios de skills sast-*. Abra o projeto no seu assistente e solicite "Executar varredura de vulnerabilidades" — o orquestrador dentro de CLAUDE.md / AGENTS.md conduz as quatro fases a partir daí.
4. Mantendo uma instalação manual atualizada
cd "$SAST_SRC" && git pull
# Re-run the cp commands from Step 2a / 2b to refresh — they're idempotent.
Se você mantiver o clone por perto, cd "$SAST_SRC" && git pull && <rerun cp> é o equivalente manual de npx sast-skills update.
Comandos da CLI
| Comando | O que faz |
|---|---|
npx sast-skills install | Copia CLAUDE.md / AGENTS.md e a árvore de habilidades para o seu projeto ou $HOME |
npx sast-skills update | Atualiza uma instalação existente com os arquivos de habilidade atualmente empacotados |
npx sast-skills uninstall | Remove habilidades instaladas; recusa-se a descartar um CLAUDE.md modificado sem --force |
npx sast-skills doctor | Verifica uma instalação e relata OK / MISSING / MODIFIED por arquivo; sai com código não 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/ --format oscal --output sar.json | Emite um documento assessment-results NIST OSCAL 1.2.3 |
npx sast-skills export --input sast/ --format oscal-poam --output poam.json | Emite um plan-of-action-and-milestones NIST OSCAL 1.2.3 |
npx sast-skills export --input sast/ --triaged --format sarif | Prefere o sast/triaged.json triado em vez dos resultados brutos por habilidade |
npx sast-skills --version | Imprime a versão da CLI instalada |
Flags de instalação
| Flag | Finalidade |
|---|---|
--yes | Não interativo; obrigatório quando a entrada padrão não é um TTY |
--assistant <ids> | IDs de assistente separados por vírgula (ex.: claude,cursor,copilot) ou all |
--scope <project|global> | Instala em ./.claude/skills/ ou $HOME/.claude/skills/ |
--target <path> | Alvo de instalação explícito (substitui --scope) |
--force | Sobrescreve um CLAUDE.md / AGENTS.md pré-existente |
--dry-run | Imprime o plano de arquivos sem gravar |
🚀 Executando uma varredura
Após a instalação, abra o projeto no seu assistente de IA e peça:
Execute a varredura de vulnerabilidades
ou
Encontre vulnerabilidades neste código
O orquestrador assume o controle. Ele executa todas as quatro fases automaticamente, respeita a idempotência (re-execuções capturam apenas o que está faltando) e grava tudo em sast/ na raiz do seu projeto.
Arquivos de saída
| Arquivo | Descrição |
|---|---|
sast/architecture.md | Pilha de tecnologia, arquitetura, pontos de entrada, fluxos de dados |
sast/*-results.md | Descobertas por classe de vulnerabilidade (legível para 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 severidade |
sast/final-report-triaged.md | Relatório triado — falsos positivos removidos, severidades ajustadas com evidências |
sast/triaged.json | Descobertas triadas canônicas (preferidas por sast-skills export --triaged) |
Esquema de descobertas
Cada habilidade grava 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": "SQL injection in /api/user",
"description": "…",
"location": { "file": "src/api/user.js", "line": 42, "column": 10 },
"remediation": "…"
}
]
}
sast-skills export agrega esses arquivos em um único documento envolvido em um envelope run — { "run": { "tool": "sast-skills", "version": "<cli-version>" }, "findings": [...] } — carimbando a versão da CLI que produziu o relatório. A etapa de triagem grava sast/triaged.json nesse mesmo formato de envelope.
Descobertas triadas adicionam triage_status (confirmed|upgraded|downgraded|false_positive), triage_original_severity (quando a severidade mudou) e triage_evidence com citações concretas do código.
Cada campo acima é transportado para a exportação OSCAL — veja NIST OSCAL para o mapeamento campo a campo.
🔌 Integrações de 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.
NIST OSCAL (evidência de conformidade)
Para plataformas de GRC, evidências de auditoria e relatórios de linha de base de controle, exporte as mesmas descobertas como OSCAL — a NIST Open Security Controls Assessment Language. Os documentos declaram oscal-version 1.2.3 e validam contra os esquemas JSON publicados pela NIST no CI.
# Security Assessment Results (SAR) — a point-in-time record of what was found
npx sast-skills export --input sast/ --triaged --format oscal --output sast-skills-sar.json
# Plan of Action and Milestones (POA&M) — the remediation backlog
npx sast-skills export --input sast/ --triaged --format oscal-poam --output sast-skills-poam.json
No GitHub Actions, os documentos OSCAL são artefatos de fluxo de trabalho em vez de uploads de Code Scanning — Code Scanning fala SARIF, plataformas de GRC falam OSCAL, então os dois rodam lado a lado:
- uses: mstfknn/sast-skills/.github/actions/scan@main # SARIF → Code Scanning
with:
input: sast/
output: sast-skills.sarif
- name: Export OSCAL
run: |
npx sast-skills@latest export --input sast/ --triaged --format oscal --output sast-skills-sar.json
npx sast-skills@latest export --input sast/ --triaged --format oscal-poam --output sast-skills-poam.json
- uses: actions/upload-artifact@v4
with:
name: oscal
path: sast-skills-*.json
Como uma descoberta é mapeada. OSCAL separa evidência de risco de veredito de conformidade, então cada descoberta do sast-skills se ramifica em três objetos vinculados:
| sast-skills | OSCAL | Notas |
|---|---|---|
title, description, location | observation | methods: ["TEST"], href de evidência path/to/file.js#L42 |
severity | risk.characterizations[].facets[] | faceta severity |
exploitability | faceta likelihood | omitida quando a descoberta não a carrega |
confidence | faceta confidence | omitida quando a descoberta não a carrega |
remediation | risk.remediations[] | lifecycle: "recommendation" |
chain_id, skill, triage_status | risk.props[] | campos para os quais OSCAL não tem um slot de primeira classe |
skill → controles | finding.target | statement-id si-10_smt, status not-satisfied |
Mapeamento de controles. Cada habilidade de detecção mapeia para os controles NIST SP 800-53 Rev 5 cujo objetivo suas descobertas colocam em dúvida — sast-sqli → si-10, sast-crypto → sc-13/sc-28, sast-missingauth → ac-3/ac-6/ia-2, e assim por diante. Esses IDs preenchem reviewed-controls e o target-id de cada descoberta. A tabela completa está em src/oscal-controls.js; uma habilidade não mapeada recai em ra-5 (Monitoramento e Varredura de Vulnerabilidades) em vez de ser descartada.
A semântica de triagem difere por modelo. No SAR, uma descoberta triada como falso positivo permanece no documento como um risco fechado — evidência de que o scanner considerou e descartou. No POA&M, ela é omitida por completo, porque um POA&M é uma lista de trabalho ainda pendente.
Identificadores estáveis. Todos os UUIDs são RFC 4122 v5, derivados do próprio conteúdo da descoberta (habilidade, arquivo, linha, título). Reexportar um diretório sast/ inalterado produz um documento byte idêntico, exceto pelos carimbos de tempo de execução, então a saída OSCAL é segura para commit e diff entre varreduras.
Hook de pré-commit
Copie hooks/pre-commit para .git/hooks/pre-commit para fazer sast-skills doctor bloquear 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.
🩺 Verificação e solução de problemas
# Is the install in the expected shape?
npx sast-skills doctor --target . --assistant claude
# Version check
npx sast-skills --version
npm view sast-skills version # latest on the registry
# Upgrade
npx sast-skills update
doctor sai com 0 se cada arquivo empacotado no alvo corresponder à cópia da versão instalada, e 1 se qualquer arquivo estiver MISSING ou MODIFIED. MODIFIED 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 de desenvolvimento:
npm install
npm test # vitest suite (TDD-guard enabled; count shown in the tests badge)
npm run sync # mirror .claude/skills → .agents/skills
node scripts/scaffold-skill.js sast-foo # stub a new skill in both trees
node scripts/register-skill.js sast-foo foo "Foo" "Foo injection description"
npm run lint:md # markdownlint
prepublishOnly executa npm run sync && npm test — um espelho sujo ou um teste vermelho aborta npm publish.
- Padrões da comunidade: CODE_OF_CONDUCT.md
- Histórico de versões: CHANGELOG.md
📄 Licença
MIT — veja LICENSE.