Skip to main content

Referencia del DSL .sca

Nivel Avanzado
Tiempo de lectura ⏱ 20 min
palabras 1497
Temas custom-rulesdsl

Referencia del DSL .sca — StaticCodeAudit por CodeFixture

Este documento describe la sintaxis completa de los archivos de reglas .sca. Cada archivo define una regla de detección autónoma.

1. Estructura de una regla

Un archivo .sca contiene una sola regla. Estructura mínima:

rule mon_id_de_regle
  language  python
  severity  HIGH

  match
    pattern  mon_pattern_regex
  end

  risk
    en: English risk description
    fr: Description du risque en français
  end
  solution
    en: English fix
    fr: Correction en français
  end
end
El rule_id debe estar en minúsculas y solo con guiones bajos: [a-z0-9_]+

↑ Volver al índice

2. Palabras clave de la regla

Palabra claveValoresObligatorioDescripción
languagepython, javascript, java, csharp, php, html, yaml, dockerfilerequeridoLenguaje del código analizado
severityCRITICAL, HIGH, MEDIUM, LOW, INFOrequeridoSeveridad del finding
categorysecurity, arch, ui, ux, maintenance, cicdopcionalCategoría (predeterminado: security)
confidence0 a 100opcionalConfianza en % (predeterminado: 80)

↑ Volver al índice

3. Bloque match (detección por patrón)

El bloque match define los patrones a detectar en el código. Repetible (varios bloques = OR).

3.1 Palabras clave del bloque match

Palabra claveTipoDescripción
patternRegexExpresión regular a buscar
textTexto planoTexto escapado automáticamente. * = comodín (cualquier cosa)
withRegexEl contexto debe contener también este patrón
with-textTexto planoComo with pero escapado automáticamente
pattern-notRegexEl contexto no debe contener este patrón
text-notTexto planoComo pattern-not pero escapado
scopeValorAlcance de la búsqueda (ver más abajo)

3.2 Scopes

ScopeComportamiento del patternComportamiento del pattern-not
lineVerificado línea por líneaVerificado en la misma línea
context-NVerificado en ventanas de N líneasVerificado en el bloque entero de N líneas
fileVerificado en el archivo completoVerificado en el archivo completo

3.3 text vs pattern

text — para todos los desarrolladores. La herramienta escapa automáticamente los caracteres especiales. El * significa "cualquier cosa".

match
  text  .execute(
  with-text  f"*"
  scope  context-4
end

pattern — para expertos en regex. El patrón se utiliza tal cual.

match
  pattern  \.execute\s*\(.*f["']
  scope  context-4
end

Ambos ejemplos anteriores detectan el mismo código.

↑ Volver al índice

4. Bloque requires (condiciones de archivo)

El bloque requires define condiciones sobre el archivo. Si se utiliza solo (sin match), el finding se sitúa a nivel de archivo (línea 1). Si se combina con match, sirve como prefiltro.

Palabra claveLógicaDescripciónEjemplo
hasTODOS deben coincidirEl contenido del archivo debe contener este patrónhas @app\.route
not_hasNINGUNO debe coincidirEl contenido del archivo NO debe contener este patrónnot_has logging
min_lines≥ NEl archivo debe tener al menos N líneasmin_lines 500
path_containsAL MENOS UNO debe coincidirLa ruta del archivo debe contener este segmentopath_contains vendor/
not_path_has_fileNINGUNO debe existirEl directorio del archivo NO debe contener este archivonot_path_has_file LICENSE
has, not_has, path_contains y not_path_has_file son repetibles (varias líneas = varias condiciones).

Ejemplos

# Archivo Flask sin logging
requires
  has      @app\.route
  not_has  import\s+logging
end

# Archivo demasiado largo
requires
  min_lines  500
end

# Código vendor sin LICENSE
requires
  path_contains  vendor/
  not_path_has_file  LICENSE
  not_path_has_file  LICENSE.md
end

↑ Volver al índice

5. Análisis taint (source → sink)

El análisis taint rastrea el flujo de datos desde sources (entradas del usuario) hasta sinks (funciones peligrosas), salvo que intervenga un sanitizer.

Palabra claveSintaxisDescripción
sourcesource <regex> kind=<type>Origen de los datos no confiables
sinksink <regex>Función peligrosa que recibe los datos
sanitizersanitizer <regex>Función que neutraliza los datos

Tipos de sources (kind=): http, stdin, cli, env, file, network

rule taint_sqli
  language  python
  severity  HIGH

  source  request\.args\.get\(   kind=http
  source  request\.form\[        kind=http
  source  input\s*\(             kind=stdin

  sink    \.execute\s*\(
  sink    \.executemany\s*\(

  sanitizer  \bint\s*\(
  sanitizer  psycopg2\.sql\.SQL
end

↑ Volver al índice

6. Bloques i18n (risk, solution, message)

Los bloques risk, solution, benefit y message admiten traducción en 4 idiomas:

risk
  en: User input in SQL query allows injection.
  fr: Entrée utilisateur dans la requête SQL permet l'injection.
  es: Entrada de usuario en consulta SQL permite inyección.
  de: Benutzereingabe in SQL-Abfrage ermöglicht Injection.
end
Códigos de idioma admitidos: en, fr, es, de. El informe utiliza el idioma configurado en --lang.

↑ Volver al índice

7. Bloque metadata (CWE, CVE, OWASP, ISO, WCAG)

metadata
  cwe       CWE-89
  cwe       CWE-90
  cve       CVE-2021-44228
  owasp     A03:2021
  iso27001  A.8.28 A.8.25
  asvs      5.3.4
  wcag      1.1.1
end
ClaveFormatoDescripción
cweCWE-NNN (multi)Common Weakness Enumeration. Múltiples valores mediante líneas repetidas o tokens separados por espacios.
cveCVE-YYYY-NNNN (multi)CVE específico para el cual se creó la regla. Se muestra como enlace clickable a NVD.
owaspANN:YYYYOWASP Top 10
iso27001A.N.NN (multi)ISO/IEC 27001:2022 Anexo A
asvsN.N.N (multi)OWASP ASVS
wcagN.N.N (multi)Criterio W3C WCAG 2.1 (utilizado por las reglas de accesibilidad en lugar de CWE).

Todas las claves multi-valor (cwe, cve, iso27001, asvs, wcag) aceptan varios tokens en la misma línea (cwe  CWE-89 CWE-90) o líneas repetidas — los valores se acumulan.

La clasificación metadata se propaga a todos los exports: HTML (enlaces clickables), JSON (objeto finding.compliance) y SARIF (rule.properties.tags).

↑ Volver al índice

8. Modos de ejecución

El modo se infiere automáticamente a partir de los bloques presentes:

Bloques presentesModo inferido
match (pattern/text)regex
requires solo (has/not_has/min_lines)file_contains
match + requiresregex con prefiltro de archivo
source + sinktaint
source + sink + matchregex+taint
hookpython_hook (reglas custom avanzadas)
No es necesario especificar mode explícitamente; se recomienda la inferencia automática.

↑ Volver al índice

9. Ejemplos completos

9.1 Detección simple (texto plano)

rule console_log_residual
  language  javascript
  severity  LOW
  category  ux

  match
    text  console.log(
  end

  risk
    en: console.log() calls left in production code.
    fr: Appels console.log() laissés en production.
  end
  solution
    en: Remove console.log() or use a logging system.
    fr: Supprimer les console.log() ou utiliser un système de logging.
  end
end

9.2 Pattern con exclusión (context)

rule insecure_cookie
  language  python
  severity  MEDIUM

  match
    pattern  \.set_cookie\s*\(
    pattern-not  (?:httponly\s*=\s*True|secure\s*=\s*True)
    scope    context-4
  end

  risk
    en: Cookie without HttpOnly/Secure flags.
    fr: Cookie sans flags HttpOnly/Secure.
  end
  solution
    en: Add httponly=True, secure=True, samesite="Lax".
    fr: Ajouter httponly=True, secure=True, samesite="Lax".
  end
end

9.3 Condición de archivo solamente

rule file_too_long
  language  python
  severity  LOW
  category  arch

  requires
    min_lines  500
  end

  risk
    en: Very long files are difficult to maintain.
    fr: Les fichiers très longs sont difficiles à maintenir.
  end
  solution
    en: Split into smaller, focused modules.
    fr: Découper en modules plus petits et focalisés.
  end
end

9.4 Combinación match + requires

rule missing_auth_decorator
  language  python
  severity  MEDIUM

  match
    pattern  @app\.route\s*\(\s*[\"'](?:/admin|/api/delete)
    pattern-not  @login_required
    scope    context-4
  end

  risk
    en: Admin route without authentication decorator.
    fr: Route admin sans décorateur d'authentification.
  end
  solution
    en: Add @login_required on all sensitive routes.
    fr: Ajouter @login_required sur toutes les routes sensibles.
  end
end

9.5 Análisis taint (inyección SQL)

rule taint_sqli
  language  python
  severity  HIGH
  confidence  90

  source  request\.args\.get\(  kind=http
  source  request\.form\[      kind=http
  sink    \.execute\s*\(
  sink    \.executemany\s*\(
  sanitizer  psycopg2\.sql\.SQL
  sanitizer  \bint\s*\(

  risk
    en: Tainted data flows into SQL query without parameterization.
    fr: Données non fiables atteignent une requête SQL sans paramétrage.
  end
  solution
    en: Use parameterized queries with placeholders (%s, ?).
    fr: Utilisez des requêtes paramétrées avec placeholders (%s, ?).
  end

  metadata
    cwe    CWE-89
    owasp  A03:2021
  end
end

9.6 Verificación de gobernanza vendor

rule unreviewed_vendor_code
  language  python
  severity  LOW
  category  maintenance

  requires
    path_contains       vendor/
    path_contains       third-party/
    not_path_has_file   LICENSE
    not_path_has_file   NOTICE
  end

  risk
    en: Vendor code without LICENSE file.
    fr: Code tiers sans fichier LICENSE.
  end
  solution
    en: Add LICENSE file to vendor directories.
    fr: Ajouter un fichier LICENSE aux répertoires vendor.
  end
end

↑ Volver al índice

10. Glosario

TérminoDefinición
DSLDomain-Specific Language — lenguaje dedicado a la definición de reglas de auditoría
FindingProblema detectado por una regla (vulnerabilidad, defecto de arquitectura, etc.)
PatternExpresión regular o texto plano buscado en el código
ScopeAlcance de la búsqueda: línea, bloque de N líneas o archivo entero
SourceEntrada de datos no confiables (petición HTTP, entrada de teclado, etc.)
SinkFunción peligrosa donde los datos no confiables no deben llegar sin validación
SanitizerFunción que neutraliza los datos peligrosos (escapado, validación, conversión)
TaintMarcado de los datos como "contaminados" para seguir su propagación en el código
CWECommon Weakness Enumeration — catálogo de debilidades de software
OWASPOpen Web Application Security Project — Top 10 de los riesgos de seguridad web
ASVSApplication Security Verification Standard — niveles de verificación de seguridad
ISO 27001Norma internacional de gestión de la seguridad de la información
SASTStatic Application Security Testing — análisis de seguridad sin ejecutar el código

↑ Volver al índice


StaticCodeAudit — CodeFixture | Documentación DSL v1.0