Opengrep - Foglio di aiuto per l’analisi del codice statica open-source
Opengrep è un fork della community del motore Semgrep, creato dopo che le funzionalità erano passate dietro una licenza commerciale. Esegue test di sicurezza delle applicazioni statiche (SAST) veloce e basato su pattern in oltre 30 linguaggi, utilizzando regole scritte in una sintassi che assomiglia al codice corrispondente — non è richiesta alcuna esperienza AST. La premessa del fork è che la capacità di scansione principale (incluse funzionalità come il flusso di dati tra file) dovrebbe rimanere completamente open-source.
Installazione
Scansione
| Comando | Descrizione |
|---|
opengrep scan . | Scansiona la directory attuale con le regole predefinite |
opengrep scan --config auto . | Seleziona automaticamente le regole per i linguaggi rilevati |
opengrep scan --config rules/ . | Utilizza una directory di regole locale |
opengrep scan --config p/security-audit . | Utilizza un pacchetto di regole |
opengrep scan --json -o out.json . | Output JSON |
opengrep scan --sarif -o out.sarif . | SARIF per le piattaforme di code scanning |
Scrittura delle regole
Le regole sono YAML; il pattern assomiglia al codice che vuoi trovare.
rules:
- id: hardcoded-aws-key
patterns:
- pattern: $KEY = "AKIA..."
message: Possible hardcoded AWS access key
languages: [python, javascript]
severity: ERROR
| Chiave | Scopo |
|---|
pattern | Forma di codice da abbinare ($X = metavariabile) |
patterns | AND di diverse condizioni |
pattern-either | OR di alternative |
pattern-not | Escludere una forma (elimina i falsi positivi) |
pattern-inside | Corrisponde solo all’interno di un contesto |
metavariable-regex | Vincola una metavariabile |
severity | INFO / WARNING / ERROR |
Essenziali della sintassi del pattern
| Sintassi | Corrisponde a |
|---|
$X | Qualsiasi singola espressione (metavariabile) |
... | Qualsiasi sequenza (arg, statement) |
foo(...) | Qualsiasi chiamata a foo |
$OBJ.method(...) | Chiamata al metodo su qualsiasi cosa |
"..." | Qualsiasi stringa letterale |
# Trova eval() su qualsiasi input non letterale
- pattern: eval($X)
pattern-not: eval("...")
Regole 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
La modalità taint traccia i dati dalle sources (input non attendibile) alle sinks (operazioni pericolose), in modo da trovare i veri bug di iniezione piuttosto che somiglianze sintattiche.
Integrazione CI
# Non riuscire nella build sui risultati di severità ERROR
opengrep scan --config auto --error .
# Scansiona solo i file modificati in questo PR
opengrep scan --config auto --baseline-commit origin/main .
| Flag | Effetto |
|---|
--error | Uscita diversa da zero quando i risultati esistono |
--baseline-commit | Scansione consapevole del diff (solo nuovi risultati) |
--severity ERROR | Filtra per severità |
--exclude | Salta i percorsi (vendor, test) |
--sarif | Carica su GitHub code scanning |
Test delle regole
# Le regole sono fornite con file di test annotati con i risultati previsti
opengrep test rules/
Annota un file di test con # ruleid: my-rule sopra una linea che dovrebbe corrispondere e # ok: my-rule dove non dovrebbe — poi opengrep test verifica il comportamento della regola.
Opengrep vs Strumenti correlati
| Aspetto | Opengrep | Semgrep | CodeQL |
|---|
| Licenza | Completamente open-source | Core aperto + commerciale | Gratuito per OSS, commerciale ristretto |
| Sintassi delle regole | Pattern simili al codice | Stessa linea | Linguaggio di query QL |
| Curva di apprendimento | Bassa | Bassa | Alta |
| Migliore per | SAST aperto senza gating delle funzionalità | Piattaforma gestita + regole | Query semantiche profonde |
Abbinato alla conoscenza di Semgrep (le regole sono in gran parte compatibili) e complementare a Bandit per i controlli specifici di Python.
Risorse