Ir al contenido

Opengrep - Análisis estático de código abierto

Opengrep - Análisis estático de código abierto

Opengrep es un fork regido por la comunidad del motor Semgrep, creado después que las características se movieron detrás de una licencia comercial. Realiza pruebas rápidas y basadas en patrones de seguridad de aplicaciones estáticas (SAST) en más de 30 idiomas, usando reglas escritas en una sintaxis que se parece al código siendo analizado — no se requiere experiencia con AST. La premisa del fork es que la capacidad de escaneo principal (incluyendo características como flujo de datos entre archivos) debe permanecer completamente de código abierto.

Instalación

MétodoComando
Script de instalación`curl -fsSL https://raw.githubusercontent.com/opengrep/opengrep/main/install.sh
Dockerdocker run --rm -v "$PWD:/src" opengrep/opengrep opengrep scan /src
Binariodescarga desde GitHub Releases
Verificaropengrep --version

Escaneo

ComandoDescripción
opengrep scan .Escanea el directorio actual con reglas por defecto
opengrep scan --config auto .Auto-selecciona reglas para idiomas detectados
opengrep scan --config rules/ .Usa un directorio local de reglas
opengrep scan --config p/security-audit .Usa un paquete de reglas
opengrep scan --json -o out.json .Salida JSON
opengrep scan --sarif -o out.sarif .SARIF para plataformas de escaneo de código

Escritura de reglas

Las reglas son YAML; el pattern se parece al código que quieres encontrar.

rules:
  - id: hardcoded-aws-key
    patterns:
      - pattern: $KEY = "AKIA..."
    message: Possible hardcoded AWS access key
    languages: [python, javascript]
    severity: ERROR
ClavePropósito
patternForma del código a coincidir ($X = metavariable)
patternsAND de varias condiciones
pattern-eitherOR de alternativas
pattern-notExcluye una forma (elimina falsos positivos)
pattern-insideSolo coincide dentro de un contexto
metavariable-regexRestringe una metavariable
severityINFO / WARNING / ERROR

Lo esencial de la sintaxis de patrones

SintaxisCoincide
$XCualquier expresión única (metavariable)
...Cualquier secuencia (argumentos, declaraciones)
foo(...)Cualquier llamada a foo
$OBJ.method(...)Llamada a método en cualquier cosa
"..."Cualquier literal de cadena
# Encuentra eval() en cualquier entrada no literal
- pattern: eval($X)
  pattern-not: eval("...")

Reglas de Taint / Flujo de datos

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

El modo Taint rastrea datos desde fuentes (entrada no confiable) hasta sumideros (operaciones peligrosas), que es cómo encuentras errores de inyección reales en lugar de coincidencias sintácticas.

Integración en CI

# Falla la compilación en hallazgos de severidad ERROR
opengrep scan --config auto --error .

# Solo escanea archivos cambiados en este PR
opengrep scan --config auto --baseline-commit origin/main .
BanderaEfecto
--errorSalida diferente de cero cuando existen hallazgos
--baseline-commitEscaneo consciente de diff (solo hallazgos nuevos)
--severity ERRORFiltra por severidad
--excludeSalta rutas (vendor, tests)
--sarifCarga a escaneo de código de GitHub

Prueba de reglas

# Las reglas se envían con archivos de prueba anotados con hallazgos esperados
opengrep test rules/

Anota un archivo de prueba con # ruleid: my-rule encima de una línea que debe coincidir y # ok: my-rule donde no debe — luego opengrep test verifica que la regla se comporta correctamente.

Opengrep vs herramientas relacionadas

AspectoOpengrepSemgrepCodeQL
LicenciaCompletamente de código abiertoNúcleo abierto + comercialGratis para OSS, comercial restringido
Sintaxis de reglasPatrones parecidos a códigoMismo linajeLenguaje de consulta QL
Curva de aprendizajeBajaBajaAlta
Mejor paraSAST abierto sin cierre de característicasPlataforma gestionada + reglasConsultas semánticas profundas

Se empareja bien con conocimiento de Semgrep (las reglas son ampliamente compatibles) y complementa Bandit para verificaciones específicas de Python.

Recursos