Skip to content

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

CampoDescripción
idIdentificador único de la regla
messageMensaje mostrado al usuario
severityNivel: ERROR, WARNING, INFO
languagesLista de lenguajes soportados
patternPatrón básico a buscar
pattern-eitherLista de patrones (cualquiera debe coincidir)
pattern-notPatrón a excluir
pattern-insideContexto donde buscar
pattern-not-insideContexto a excluir
metavariable-patternRestricciones en metavariables
metadataMetadatos adicionales (CWE, OWASP, etc.)
fixSugerencia 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

AspectoYAML SimpleSemgrep
ComplejidadBajaAlta
RendimientoAltoMedio
FlexibilidadBajaAlta
PatronesSimplesComplejos
ContextoNo

Próximos Pasos

RootCause - Modular Static Analysis Engine