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
Escaneo
| Comando | Descripció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
| Clave | Propósito |
|---|
pattern | Forma del código a coincidir ($X = metavariable) |
patterns | AND de varias condiciones |
pattern-either | OR de alternativas |
pattern-not | Excluye una forma (elimina falsos positivos) |
pattern-inside | Solo coincide dentro de un contexto |
metavariable-regex | Restringe una metavariable |
severity | INFO / WARNING / ERROR |
Lo esencial de la sintaxis de patrones
| Sintaxis | Coincide |
|---|
$X | Cualquier 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 .
| Bandera | Efecto |
|---|
--error | Salida diferente de cero cuando existen hallazgos |
--baseline-commit | Escaneo consciente de diff (solo hallazgos nuevos) |
--severity ERROR | Filtra por severidad |
--exclude | Salta rutas (vendor, tests) |
--sarif | Carga 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
| Aspecto | Opengrep | Semgrep | CodeQL |
|---|
| Licencia | Completamente de código abierto | Núcleo abierto + comercial | Gratis para OSS, comercial restringido |
| Sintaxis de reglas | Patrones parecidos a código | Mismo linaje | Lenguaje de consulta QL |
| Curva de aprendizaje | Baja | Baja | Alta |
| Mejor para | SAST abierto sin cierre de características | Plataforma gestionada + reglas | Consultas 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