Zum Inhalt springen

Opengrep – Open-Source Static Code Analysis Cheatsheet

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

MethodeBefehl
Installationsskript`curl -fsSL https://raw.githubusercontent.com/opengrep/opengrep/main/install.sh
Dockerdocker run --rm -v "$PWD:/src" opengrep/opengrep opengrep scan /src
BinärDownload von GitHub Releases
Überprüfenopengrep --version

Scanning

BefehlBeschreibung
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üsselZweck
patternCode-Form zum Abgleichen ($X = Metavariable)
patternsUND mehrerer Bedingungen
pattern-eitherODER von Alternativen
pattern-notSchließen Sie eine Form aus (töten Sie False Positives)
pattern-insideNur innerhalb eines Kontexts abgleichen
metavariable-regexBeschränken Sie eine Metavariable
severityINFO / WARNING / ERROR

Pattern-Syntax Essentials

SyntaxPasst
$XJeder 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 .
FlagEffekt
--errorNon-zero Exit, wenn Erkenntnisse existieren
--baseline-commitDiff-bewusste Scans (nur neue Erkenntnisse)
--severity ERRORNach Schweregrad filtern
--excludePfade überspringen (vendor, tests)
--sarifUpload 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.

Opengrep vs verwandte Tools

AspektOpengrepSemgrepCodeQL
LizenzVollständig Open-SourceOpen Core + kommerziellKostenlos für OSS, begrenzt kommerziell
Regel-SyntaxCode-ähnliche MusterGleicher LineageQL Query-Sprache
LernkurveNiedrigNiedrigHoch
Am besten fürOpen SAST ohne Feature-GatingVerwaltete Plattform + RegelnTiefe semantische Abfragen

Paares mit Semgrep Wissen (Regeln sind weitgehend kompatibel) und ergänzt Bandit für Python-spezifische Überprüfungen.

Ressourcen