From dev-team-kit-fv
Scans code for vulnerabilities, bugs, and code smells using Semgrep and CodeQL. Run before releases, large PRs, or when suspecting recurrent bug classes.
npx claudepluginhub felvieira/claude-skills-fvThis skill is limited to using the following tools:
Eleva a Security Review (skill 06) de "review manual" para "scan + triagem". Semgrep para velocidade e cobertura ampla, CodeQL para taint tracking interprocedural quando o caso exige.
Runs parallel Semgrep scans on multi-language codebases with full or security-focused modes. Auto-uses Pro for taint analysis; merges SARIF output.
Runs Semgrep for static analysis, security scanning, and pattern matching. Scans code, writes custom YAML rules, detects vulnerabilities, uses taint mode, sets up CI/CD pipelines.
Orchestrates repo security scans (SAST, SCA, secrets, config) with adaptive agent swarms: subagents for small repos, teams for large. Verifies findings, compiles reports.
Share bugs, ideas, or general feedback.
Eleva a Security Review (skill 06) de "review manual" para "scan + triagem". Semgrep para velocidade e cobertura ampla, CodeQL para taint tracking interprocedural quando o caso exige.
Esta skill segue GLOBAL.md, policies/execution.md, policies/tool-safety.md, policies/quality-gates.md, policies/writing-clarity.md.
Consultar docs/skill-guides/static-analysis.md para rulesets avancados, custom rules e integracao em CI.
.sarif) ou markdown estruturado--config=auto + ruleset OWASP)Detalhes operacionais nas sub-secoes a seguir.
Instalar:
pip install semgrep
# ou via Docker
docker run --rm -v "$PWD:/src" returntocorp/semgrep semgrep --config=auto
Rodar:
# Auto: detecta linguagens, aplica rulesets oficiais
semgrep --config=auto --sarif --output=semgrep.sarif
# Ruleset especifico
semgrep --config=p/owasp-top-ten --sarif --output=owasp.sarif
semgrep --config=p/security-audit
semgrep --config=p/typescript
# Custom rule
semgrep --config=./my-rule.yml src/
Rulesets recomendados por linguagem:
p/typescript, p/javascript, p/react, p/nextjs, p/owasp-top-tenp/python, p/django, p/flask, p/owasp-top-tenp/golang, p/gosecp/java, p/springp/security-audit, p/secrets, p/ciInstalar:
# Download CodeQL CLI
# https://github.com/github/codeql-cli-binaries/releases
Rodar:
# Build database
codeql database create db --language=javascript --source-root=.
# Run query suite
codeql database analyze db --format=sarif-latest --output=results.sarif \
codeql/javascript-queries
# Custom query
codeql query run --database=db my-query.ql
Quando usar CodeQL em vez de Semgrep:
Para escala (multi-linguagem, >20 findings, variant analysis), despachar via Task:
semgrep-scanner — executa scans em paralelo por categoria de linguagem, agrega SARIF. Use quando repo tem 2+ linguagens primarias.semgrep-triager — classifica findings em TP/FP/needs-investigation lendo contexto fonte. Use quando ha >20 findings.codeql-runner — orquestra build de database CodeQL + queries com taint tracking interprocedural. Use quando bug envolve data flow entre arquivos/funcoes.sarif-parsing — parse, dedup, agregacao de SARIF de multiplas fontes. Use quando consolidar Semgrep + CodeQL ou multiplos scans.variant-analysis — caca variantes do mesmo padrao apos achar bug inicial, gera custom rule reusavel. Use apos confirmar bug que pertence a classe (SQLi, XSS, missing auth, etc).Cada subagent tem definicao em .claude/agents/<name>.md com protocolo, inputs, outputs e guardrails proprios. Para uso simples (1 linguagem, scan rapido, poucos findings), rodar inline conforme blocos abaixo.
1. Semgrep --config=auto (5-30s, cobertura ampla)
→ triage via `semgrep-triager` subagent (ou inline se <20 findings)
→ fix critical/high
2. Se finding for bug de fluxo: CodeQL com query especifica
→ variant analysis para achar similares
3. SARIF → markdown report → handoff para skill 06
4. Skill 06 valida findings + adiciona contexto OWASP
5. Reviewer (skill 11) bloqueia merge se Critical/High aberto
Para cada finding, classificar:
Suprimir FP corretamente:
// nosemgrep: rule-id // motivo: contexto valida input acima na linha 42
const sql = `SELECT * FROM users WHERE id = ${id}`;
Nao suprimir sem comentario explicando porque.
| Nivel | Critério | Acao |
|---|---|---|
| Critical | RCE, SQLi, XSS confirmado, secret hardcoded | bloqueia merge, fix imediato |
| High | Auth bypass possivel, SSRF, deps com CVE high | bloqueia merge, fix antes da release |
| Medium | Validacao fraca, missing rate limit, dep com CVE medium | fix no proximo sprint |
| Low | Code smell, deprecated API, missing header opcional | backlog |
| Info | Sugestao de hardening | opcional |
Triagem de findings tem viesses recorrentes. Pensamentos que significam STOP:
| Pensamento | Realidade |
|---|---|
| "Isso parece falso positivo" | Validacao em outro arquivo nao garante. Verificar fluxo real. |
| "Eu sei que esse codigo e seguro" | Sem evidencia (validacao explicita ou teste), e suposicao. |
| "Esse modulo e legado, nao toca" | Legado e onde CVE mora. Tratar igual. |
| "Suprimir e mais rapido" | FP nao validado vira buraco de seguranca em 6 meses. |
| "A regra e generica, nao se aplica" | Genericas pegam padroes reais. Investigar antes de descartar. |
| "Tem outros bugs maiores agora" | Critical/High nao espera. Triagem e pre-deploy gate. |
| "Funcionava antes do scan" | Bug existia antes — scan so revelou. |
| "Vamos abrir issue e seguir" | Critical aberto = no merge. Issue nao substitui fix. |
Toda supressao precisa de comentario explicando por que o codigo e seguro naquele contexto.
internalApi.X sem auditLog)Exemplo Semgrep:
rules:
- id: missing-audit-log
pattern: |
internalApi.$X(...)
pattern-not: |
auditLog($Y)
...
internalApi.$X(...)
message: chamada a internalApi sem auditLog precedente
severity: ERROR
languages: [typescript]
Custom rules vivem em tools/semgrep/ ou .semgrep/ no repo.
Markdown estruturado para handoff:
# Static Analysis Report — <YYYY-MM-DD>
**Tool:** semgrep --config=auto + p/owasp-top-ten
**Scope:** src/
**Duration:** 23s
**Files scanned:** 247
## Summary
- Critical: 1
- High: 3
- Medium: 8
- Low: 14
- Info: 22
## Critical Findings
### F-001: SQL Injection em src/db/users.ts:42
**Rule:** javascript.lang.security.sql-injection
**Confidence:** high (TP confirmed)
**Evidence:**
```ts
const query = `SELECT * FROM users WHERE id = ${userId}`;
Fix: usar prepared statement
const query = `SELECT * FROM users WHERE id = $1`;
db.query(query, [userId]);
Owner: skill 03 (Backend)
...
weak-crypto: hash usado para deduplicacao, nao seguranca
## Integracao com CI
Adicionar a `.github/workflows/`:
```yaml
- name: Semgrep scan
run: semgrep --config=auto --error --severity=ERROR
--error faz CI quebrar em finding Critical/High.
Output deve seguir policies/writing-clarity.md. Sem narrativa, sem hedging, sem prosa decorativa. Tabela de findings + acao concreta por linha.
Apos conclusao, entregar:
.sarif + .md