Reglas Semgrep
Las reglas Semgrep proporcionan capacidades avanzadas de coincidencia de patrones, soportando combinaciones complejas y análisis semántico.
Estructura Básica
yaml
rules:
- id: "rule-id"
message: "Mensaje de la regla"
severity: "WARNING"
languages: [rust]
pattern-either:
- pattern: "patron1"
- pattern: "patron2"
metadata:
cwe: "CWE-328: Use of Weak Hash"
confidence: HIGH
category: security
fix: "sugerencia_de_correccion"
Ejemplo Real
yaml
rules:
- id: insecure-hashes
message: Detected cryptographically insecure hashing function
pattern-either:
- pattern: md2::Md2::new(...)
- pattern: md4::Md4::new(...)
- pattern: md5::Md5::new(...)
- pattern: sha1::Sha1::new(...)
metadata:
references:
- https://github.com/RustCrypto/hashes
- https://docs.rs/md2/latest/md2/
- https://docs.rs/md4/latest/md4/
- https://docs.rs/md5/latest/md5/
- https://docs.rs/sha-1/latest/sha1/
technology:
- rust
category: security
cwe: "CWE-328: Use of Weak Hash"
confidence: HIGH
likelihood: LOW
impact: MEDIUM
subcategory: audit
license: Semgrep Rules License v1.0. For more details, visit
semgrep.dev/legal/rules-license
vulnerability_class:
- Insecure Hashing Algorithm
languages:
- rust
severity: WARNING
fix: "sha2::Sha256::new(...)"
Tipos de Patrones
pattern
Coincidencia básica de patrones:
yaml
pattern: "md5::Md5::new(...)"
pattern-either
Coincidencia con cualquiera de los patrones:
yaml
pattern-either:
- pattern: "md5::Md5::new(...)"
- pattern: "sha1::Sha1::new(...)"
pattern-not
Excluye coincidencias que contengan el patrón:
yaml
pattern-not: "safe_md5::Md5::new(...)"
pattern-inside
Coincidencia dentro de un contexto específico:
yaml
pattern-inside: |
function $FUNC() {
...
}
pattern-not-inside
Excluye coincidencias dentro de un contexto:
yaml
pattern-not-inside: |
if (is_safe) {
...
}
metavariable-pattern
Aplica restricciones adicionales a metavariables:
yaml
metavariable-pattern:
metavariable: $VAR
pattern: "dangerous_*"
Campos Principales
Campo | Descripción |
---|---|
id | Identificador único de la regla |
message | Mensaje mostrado al usuario |
severity | Nivel: ERROR, WARNING, INFO |
languages | Lista de lenguajes soportados |
pattern | Patrón básico a buscar |
pattern-either | Lista de patrones (cualquiera debe coincidir) |
pattern-not | Patrón a excluir |
pattern-inside | Contexto donde buscar |
pattern-not-inside | Contexto a excluir |
metavariable-pattern | Restricciones en metavariables |
metadata | Metadatos adicionales (CWE, OWASP, etc.) |
fix | Sugerencia de corrección |
Metadatos
yaml
metadata:
cwe: "CWE-328: Use of Weak Hash"
confidence: HIGH
category: security
technology: [rust]
references:
- "https://example.com/security-guidance"
vulnerability_class:
- "Insecure Hashing Algorithm"
Casos de Uso
Detección de Funciones Peligrosas
yaml
rules:
- id: dangerous-functions
message: Detected dangerous function call
pattern-either:
- pattern: "eval(...)"
- pattern: "exec(...)"
- pattern: "system(...)"
languages: [python]
severity: ERROR
Validación de Argumentos
yaml
rules:
- id: subprocess-shell
message: Using shell=True is dangerous
patterns:
- pattern: "subprocess.run(..., shell=True)"
- pattern-not-inside: |
if (is_safe_input($INPUT)) {
...
}
languages: [python]
severity: WARNING
Análisis de Contexto
yaml
rules:
- id: sql-injection
message: Potential SQL injection
patterns:
- pattern-inside: |
def $FUNC($REQUEST):
...
- pattern: "db.execute($QUERY)"
- metavariable-pattern:
metavariable: $QUERY
pattern: ".*\\+.*"
languages: [python]
severity: ERROR
Ventajas
✅ Perfecto para:
- Patrones complejos de código
- Análisis semántico
- Combinaciones de condiciones
- Análisis de contexto
- Metavariables avanzadas
❌ Limitaciones:
- Mayor complejidad
- Rendimiento más lento
- Curva de aprendizaje más alta
Diferencias con YAML Simple
Aspecto | YAML Simple | Semgrep |
---|---|---|
Complejidad | Baja | Alta |
Rendimiento | Alto | Medio |
Flexibilidad | Baja | Alta |
Patrones | Simples | Complejos |
Contexto | No | Sí |
Próximos Pasos
- Reglas YAML - Para patrones simples
- Reglas JSON - Para configuraciones
- Reglas OPA - Para lógica avanzada