Opengrep – Open-Source Static Code Analysis Cheatsheet
Opengrep ist ein Community-regierter Fork der Semgrep-Engine, der nach der Verschiebung von Features hinter eine kommerzielle Lizenz erstellt wurde. Es führt schnelle, musterbasierte Static Application Security Testing (SAST) über 30+ Sprachen durch, wobei Regeln in einer Syntax geschrieben werden, die wie der Code aussieht, der abgeglichen wird – keine AST-Expertise erforderlich. Die Prämisse des Forks ist, dass Kern-Scan-Funktion (einschließlich Features wie Cross-File-Dataflow) vollständig Open-Source bleiben sollte.
Installation
Scanning
| Befehl | Beschreibung |
|---|
opengrep scan . | Scannen Sie das aktuelle Verzeichnis mit Standardregeln |
opengrep scan --config auto . | Auto-select Regeln für erkannte Sprachen |
opengrep scan --config rules/ . | Verwenden Sie ein lokales Regel-Verzeichnis |
opengrep scan --config p/security-audit . | Verwenden Sie ein Regelpaket |
opengrep scan --json -o out.json . | JSON-Ausgabe |
opengrep scan --sarif -o out.sarif . | SARIF für Code-Scanning-Plattformen |
Regeln schreiben
Regeln sind YAML; das pattern sieht wie der Code aus, den Sie finden möchten.
rules:
- id: hardcoded-aws-key
patterns:
- pattern: $KEY = "AKIA..."
message: Possible hardcoded AWS access key
languages: [python, javascript]
severity: ERROR
| Schlüssel | Zweck |
|---|
pattern | Code-Form zum Abgleichen ($X = Metavariable) |
patterns | UND mehrerer Bedingungen |
pattern-either | ODER von Alternativen |
pattern-not | Schließen Sie eine Form aus (töten Sie False Positives) |
pattern-inside | Nur innerhalb eines Kontexts abgleichen |
metavariable-regex | Beschränken Sie eine Metavariable |
severity | INFO / WARNING / ERROR |
Pattern-Syntax Essentials
| Syntax | Passt |
|---|
$X | Jeder einzelne Ausdruck (Metavariable) |
... | Jede Sequenz (Args, Statements) |
foo(...) | Jeder Aufruf zu foo |
$OBJ.method(...) | Methodenaufruf auf irgendetwas |
"..." | Jedes Stringliteral |
# Finden Sie eval() bei jeder nicht-literalen Eingabe
- pattern: eval($X)
pattern-not: eval("...")
Taint / Dataflow-Regeln
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
Taint-Modus verfolgt Daten von Quellen (nicht vertrauenswürdige Eingaben) zu Senken (gefährliche Operationen), was ist wie Sie echte Injection-Bugs finden statt syntaktische Lookalikes.
CI-Integration
# Fail der Build bei ERROR-Schweregrad-Erkenntnissen
opengrep scan --config auto --error .
# Scannen Sie nur Dateien, die in diesem PR geändert wurden
opengrep scan --config auto --baseline-commit origin/main .
| Flag | Effekt |
|---|
--error | Non-zero Exit, wenn Erkenntnisse existieren |
--baseline-commit | Diff-bewusste Scans (nur neue Erkenntnisse) |
--severity ERROR | Nach Schweregrad filtern |
--exclude | Pfade überspringen (vendor, tests) |
--sarif | Upload zu GitHub Code-Scanning |
Regeln testen
# Regeln werden mit Test-Dateien ausgeliefert, die mit erwarteten Erkenntnissen annotiert sind
opengrep test rules/
Annotieren Sie eine Test-Datei mit # ruleid: my-rule über einer Zeile, die passen sollte, und # ok: my-rule wo sie nicht sollte – dann verifiziert opengrep test, dass sich die Regel verhält.
| Aspekt | Opengrep | Semgrep | CodeQL |
|---|
| Lizenz | Vollständig Open-Source | Open Core + kommerziell | Kostenlos für OSS, begrenzt kommerziell |
| Regel-Syntax | Code-ähnliche Muster | Gleicher Lineage | QL Query-Sprache |
| Lernkurve | Niedrig | Niedrig | Hoch |
| Am besten für | Open SAST ohne Feature-Gating | Verwaltete Plattform + Regeln | Tiefe semantische Abfragen |
Paares mit Semgrep Wissen (Regeln sind weitgehend kompatibel) und ergänzt Bandit für Python-spezifische Überprüfungen.
Ressourcen