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.

npm version CI tests License: MIT Node.js

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

  • 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 export agrega 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 um plan-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 assistentes AGENTS.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

SkillFunção
sast-analysisReconhecimento do código, mapeamento de arquitetura, modelo de ameaças
sast-stackRoteador de stack tecnológico — escolhe quais skills de detecção executar por projeto
sast-reportConsolida achados por classe em um relatório classificado
sast-triageRemove falsos positivos e ajusta severidades com evidências do código

Injeção

SkillClasse de Vulnerabilidade
sast-sqliInjeção de SQL
sast-nosqlInjeção de NoSQL (Mongo, Firestore, DynamoDB)
sast-ldapInjeção de filtro LDAP / DN
sast-graphqlConstrução insegura de documentos GraphQL
sast-xssCross-Site Scripting
sast-sstiInjeção de template no servidor
sast-rceExecução remota de código (injeção de comando, eval, desserialização insegura)
sast-xxeXML External Entity
sast-ssrfServer-Side Request Forgery
sast-openredirectRedirecionamento aberto (phishing / roubo de token OAuth)
sast-crlfCRLF / divisão de resposta HTTP (injeção de cabeçalho)
sast-ssrfimdsSSRF de metadados de nuvem (roubo de credenciais IMDSv1)
sast-unsafeconsumptionResposta não validada de API de terceiros em um sink (injeção de segunda ordem)
sast-xpathInjeção de XPath (entrada do usuário em uma expressão XPath)
sast-csvinjInjeção de fórmula / CSV em exportações de planilhas
sast-elinjInjeção de expression-language (OGNL / SpEL / MVEL / JEXL)

Controle de acesso e Autenticação

SkillClasse de Vulnerabilidade
sast-idorReferência direta insegura a objetos
sast-missingauthAutenticação ausente / autorização de nível de função quebrada
sast-jwtImplementações inseguras de JWT
sast-csrfCross-Site Request Forgery
sast-corsConfiguração incorreta de CORS
sast-cookieflagsAusência de HttpOnly / Secure / SameSite em cookies de sessão
sast-massassignMass assignment / overposting (escalonamento de privilégios)
sast-secheadersCabeçalhos de segurança ausentes (CSP, HSTS, X-Frame-Options, SRI)
sast-ratelimitAusência de rate limit em endpoints de autenticação / caros
sast-sessionFixação de sessão + IDs de sessão de baixa entropia
sast-oauthConfiguração incorreta de OAuth / OIDC (redirect_uri, state, PKCE)
sast-routeinventoryRotas shadow / debug / admin deixadas registradas
sast-postmessageConfiança de origem em postMessage / CSWSH / reverse-tabnabbing

Arquivos, criptografia e runtime

SkillClasse de Vulnerabilidade
sast-pathtraversalPath / directory traversal
sast-fileuploadUpload de arquivo inseguro
sast-cryptoPrimitivas fracas, modos ruins, reutilização de IV, PRNG fraco
sast-prototypePoluição de protótipo em JavaScript
sast-redosDoS por regex com backtracking catastrófico
sast-raceCondições de corrida e TOCTOU
sast-deserDesserialização insegura (gadget chains, pickle, unserialize)
sast-tlsVerificação de certificado / hostname TLS desabilitada
sast-zipslipZip Slip — path traversal na extração de arquivos
sast-dangerousapiSinks de API perigosos (eval / exec / reflection / bridges nativas)
sast-xmlbombDoS por expansão de entidades XML (billion laughs / blowup quadrático)

Exposição de dados e supply chain

SkillClasse de Vulnerabilidade
sast-hardcodedsecretsChaves de API / tokens / credenciais em código voltado ao cliente
sast-piiVazamento de PII e credenciais para logs / telemetria / páginas de erro
sast-depsDependências com vulnerabilidades conhecidas (CVE em lockfiles)
sast-iacIaC inseguro (Dockerfile / Terraform / Kubernetes / GitHub Actions)
sast-errorhandlingLógica fail-open, vazamento de stack-trace / segredos, modo debug
sast-excessivedataExposição excessiva de dados em respostas de API
sast-pipelineinjInjeção em pipeline CI/CD (payloads de eventos não confiáveis)
sast-depconfusionDependency confusion + execução de scripts em tempo de instalação
sast-lockfileAusência de lockfile / hashes de dependência não fixados
sast-cloudsdkUso incorreto de SDK de nuvem (bucket público, chave hardcoded, IAM amplo)

Lógica de negócios e específicas de LLM

SkillClasse de Vulnerabilidade
sast-businesslogicManipulação de preço, bypass de fluxo de trabalho, abuso de recompensas
sast-paymentlogicAbuso de pagamento em e-commerce (corrida de preço / cupom / reembolso / saldo)
sast-promptinjectionTexto não confiável alcançando um prompt de LLM (OWASP LLM #1)
sast-llmoutputSaí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.

SkillClasse de Vulnerabilidade
sast-skillauditInstrução oculta / shell-sink em skill ou configuração de agente não confiável
sast-mcpsecEnvenenamento de ferramentas de servidor MCP + ausência de tool-auth
sast-configrceConfiguração de repositório que executa shell automaticamente ao abrir / fazer checkout do projeto
sast-agentidentityIdentidade 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.

SkillClasse de Vulnerabilidade
sast-excessiveagencyAutoridade excessiva de agente (ferramentas que alteram estado, sem human-in-the-loop)
sast-toolcallingDespacho de ferramentas LLM sem allow-list / validação de argumentos
sast-ragleakVazamento entre tenants em RAG + injeção indireta (ausência de filtro ACL na recuperação)
sast-systempromptleakSegredos em prompts de sistema; prompt registrado em log ou ecoado para chamadores
sast-memorypoisonDados não confiáveis persistidos na memória do agente e posteriormente confiados
sast-llmdosTokens 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.md ou AGENTS.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.md em nível de projeto, não o sobrescreva — Claude Code lê apenas um CLAUDE.md por 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

ComandoO que faz
npx sast-skills installCopia CLAUDE.md / AGENTS.md e a árvore de habilidades para o seu projeto ou $HOME
npx sast-skills updateAtualiza uma instalação existente com os arquivos de habilidade atualmente empacotados
npx sast-skills uninstallRemove habilidades instaladas; recusa-se a descartar um CLAUDE.md modificado sem --force
npx sast-skills doctorVerifica 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.sarifAgrega sast/*-results.json em JSON, SARIF 2.1.0 ou HTML
npx sast-skills export --input sast/ --format oscal --output sar.jsonEmite um documento assessment-results NIST OSCAL 1.2.3
npx sast-skills export --input sast/ --format oscal-poam --output poam.jsonEmite um plan-of-action-and-milestones NIST OSCAL 1.2.3
npx sast-skills export --input sast/ --triaged --format sarifPrefere o sast/triaged.json triado em vez dos resultados brutos por habilidade
npx sast-skills --versionImprime a versão da CLI instalada

Flags de instalação

FlagFinalidade
--yesNã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)
--forceSobrescreve um CLAUDE.md / AGENTS.md pré-existente
--dry-runImprime 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

ArquivoDescrição
sast/architecture.mdPilha de tecnologia, arquitetura, pontos de entrada, fluxos de dados
sast/*-results.mdDescobertas por classe de vulnerabilidade (legível para humanos)
sast/*-results.jsonDescobertas canônicas legíveis por máquina (alimentam sast-skills export)
sast/final-report.mdRelatório bruto consolidado classificado por severidade
sast/final-report-triaged.mdRelatório triado — falsos positivos removidos, severidades ajustadas com evidências
sast/triaged.jsonDescobertas 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-skillsOSCALNotas
title, description, locationobservationmethods: ["TEST"], href de evidência path/to/file.js#L42
severityrisk.characterizations[].facets[]faceta severity
exploitabilityfaceta likelihoodomitida quando a descoberta não a carrega
confidencefaceta confidenceomitida quando a descoberta não a carrega
remediationrisk.remediations[]lifecycle: "recommendation"
chain_id, skill, triage_statusrisk.props[]campos para os quais OSCAL não tem um slot de primeira classe
skill → controlesfinding.targetstatement-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.


📄 Licença

MIT — veja LICENSE.