Salta ai contenuti

Opengrep - Foglio di aiuto per l'analisi del codice statica open-source

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

MetodoComando
Script di installazione`curl -fsSL https://raw.githubusercontent.com/opengrep/opengrep/main/install.sh
Dockerdocker run --rm -v "$PWD:/src" opengrep/opengrep opengrep scan /src
Binarioscarica da GitHub Releases
Verificaopengrep --version

Scansione

ComandoDescrizione
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
ChiaveScopo
patternForma di codice da abbinare ($X = metavariabile)
patternsAND di diverse condizioni
pattern-eitherOR di alternative
pattern-notEscludere una forma (elimina i falsi positivi)
pattern-insideCorrisponde solo all’interno di un contesto
metavariable-regexVincola una metavariabile
severityINFO / WARNING / ERROR

Essenziali della sintassi del pattern

SintassiCorrisponde a
$XQualsiasi 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 .
FlagEffetto
--errorUscita diversa da zero quando i risultati esistono
--baseline-commitScansione consapevole del diff (solo nuovi risultati)
--severity ERRORFiltra per severità
--excludeSalta i percorsi (vendor, test)
--sarifCarica 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

AspettoOpengrepSemgrepCodeQL
LicenzaCompletamente open-sourceCore aperto + commercialeGratuito per OSS, commerciale ristretto
Sintassi delle regolePattern simili al codiceStessa lineaLinguaggio di query QL
Curva di apprendimentoBassaBassaAlta
Migliore perSAST aperto senza gating delle funzionalitàPiattaforma gestita + regoleQuery 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