Pular para o conteúdo

Opengrep - Análise Estática de Código de Código Aberto - Guia de Referência

Opengrep - Análise Estática de Código de Código Aberto - Guia de Referência

Opengrep é um fork comunitário governado do mecanismo Semgrep, criado após recursos serem movidos para trás de uma licença comercial. Ele realiza rápido, teste de segurança de aplicação estática (SAST) baseado em padrões em 30+ idiomas, usando regras escritas em uma sintaxe que se parece com o código sendo correspondido — nenhuma experiência em AST necessária. A premissa do fork é que a capacidade de scanning central (incluindo recursos como fluxo de dados entre arquivos) deve permanecer totalmente de código aberto.

Instalação

MétodoComando
Script de instalação`curl -fsSL https://raw.githubusercontent.com/opengrep/opengrep/main/install.sh
Dockerdocker run --rm -v "$PWD:/src" opengrep/opengrep opengrep scan /src
Bináriobaixar de GitHub Releases
Verificaropengrep --version

Scanning

ComandoDescrição
opengrep scan .Escanear o diretório atual com regras padrão
opengrep scan --config auto .Auto-selecionar regras para idiomas detectados
opengrep scan --config rules/ .Usar um diretório de regras local
opengrep scan --config p/security-audit .Usar um pacote de regras
opengrep scan --json -o out.json .Saída JSON
opengrep scan --sarif -o out.sarif .SARIF para plataformas de code-scanning

Escrevendo Regras

As regras são YAML; o pattern se parece com o código que você quer encontrar.

rules:
  - id: hardcoded-aws-key
    patterns:
      - pattern: $KEY = "AKIA..."
    message: Possible hardcoded AWS access key
    languages: [python, javascript]
    severity: ERROR
ChavePropósito
patternForma de código para correspondência ($X = metavariável)
patternsE de várias condições
pattern-eitherOU de alternativas
pattern-notExcluir uma forma (eliminar falsos positivos)
pattern-insideApenas correspondência dentro de um contexto
metavariable-regexRestringir uma metavariável
severityINFO / WARNING / ERROR

Essenciais de Sintaxe de Padrão

SintaxeCorrespondências
$XQualquer expressão única (metavariável)
...Qualquer sequência (args, statements)
foo(...)Qualquer chamada para foo
$OBJ.method(...)Chamada de método em qualquer coisa
"..."Qualquer literal de string
# Encontrar eval() em qualquer entrada não-literal
- pattern: eval($X)
  pattern-not: eval("...")

Regras de Taint / Dataflow

rules:
  - id: sqli-taint
    mode: taint
    pattern-sources:
      - pattern: request.args.get(...)
    pattern-sinks:
      - pattern: cursor.execute($Q)
    message: Untrusted input reaches SQL execution
    languages: [python]
    severity: ERROR

Modo taint rastreia dados de fontes (entrada não confiável) para sinks (operações perigosas), que é como você encontra bugs de injeção reais em vez de falsos positivos sintáticos.

Integração de CI

# Falhar a compilação em descobertas de severidade ERROR
opengrep scan --config auto --error .

# Escanear apenas arquivos alterados neste PR
opengrep scan --config auto --baseline-commit origin/main .
FlagEfeito
--errorExit diferente de zero quando descobertas existem
--baseline-commitScanning ciente de diff (apenas novas descobertas)
--severity ERRORFiltrar por severidade
--excludePular caminhos (vendor, tests)
--sarifFazer upload para GitHub code scanning

Testando Regras

# Regras vêm com arquivos de teste anotados com descobertas esperadas
opengrep test rules/

Anote um arquivo de teste com # ruleid: my-rule acima de uma linha que deve corresponder e # ok: my-rule onde não deve — então opengrep test verifica o comportamento da regra.

Opengrep vs Ferramentas Relacionadas

AspectoOpengrepSemgrepCodeQL
LicençaTotalmente de código abertoOpen core + comercialGrátis para OSS, comercial restrito
Sintaxe de regraPadrões similares a códigoMesma linhagemLinguagem de consulta QL
Curva de aprendizadoBaixaBaixaAlta
Melhor paraSAST aberto sem portão de recursoPlataforma gerenciada + regrasConsultas semânticas profundas

Funciona bem com conhecimento de Semgrep (as regras são amplamente compatíveis) e complementa Bandit para verificações específicas de Python.

Recursos