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
Scanning
| Comando | Descriçã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
| Chave | Propósito |
|---|
pattern | Forma de código para correspondência ($X = metavariável) |
patterns | E de várias condições |
pattern-either | OU de alternativas |
pattern-not | Excluir uma forma (eliminar falsos positivos) |
pattern-inside | Apenas correspondência dentro de um contexto |
metavariable-regex | Restringir uma metavariável |
severity | INFO / WARNING / ERROR |
Essenciais de Sintaxe de Padrão
| Sintaxe | Correspondências |
|---|
$X | Qualquer 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 .
| Flag | Efeito |
|---|
--error | Exit diferente de zero quando descobertas existem |
--baseline-commit | Scanning ciente de diff (apenas novas descobertas) |
--severity ERROR | Filtrar por severidade |
--exclude | Pular caminhos (vendor, tests) |
--sarif | Fazer 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
| Aspecto | Opengrep | Semgrep | CodeQL |
|---|
| Licença | Totalmente de código aberto | Open core + comercial | Grátis para OSS, comercial restrito |
| Sintaxe de regra | Padrões similares a código | Mesma linhagem | Linguagem de consulta QL |
| Curva de aprendizado | Baixa | Baixa | Alta |
| Melhor para | SAST aberto sem portão de recurso | Plataforma gerenciada + regras | Consultas 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