Skip to main content

Crear reglas personalizadas

Nivel Intermedio
Tiempo de lectura ⏱ 12 min
palabras 1056
Temas custom-ruleswizard

Reglas personalizadas — Guía del cliente

Objetivo

Permitirle crear, probar y desplegar sus propias reglas de detección sin necesidad de conocer un formato interno, la sintaxis de las expresiones regulares ni la arquitectura del motor de análisis.


1. Visión general

Tres herramientas complementarias están a su disposición:

Herramienta Comando Función
Asistente --create-rule Creación guiada paso a paso, sin requerir conocimientos técnicos
Prueba rápida --test-rule <id> Retorno inmediato sobre una regla, sin auditoría completa
Ejemplos --init-rule --examples Aprendizaje mediante ejemplos (archivos .sca comentados)

Herramientas adicionales:

Herramienta Comando Función
Validación --rules-validate Valida todas sus reglas personalizadas (sintaxis, regex, campos)
Listado --rules-list Muestra todas las reglas cargadas (builtin + personalizadas)

Las reglas personalizadas se almacenan en el directorio custom-rules/ (junto al binario) y se conservan entre actualizaciones.


2. Asistente interactivo (--create-rule)

2.1 Flujo de trabajo

$ ./staticcodeaudit-<plataforma> /mi/proyecto --create-rule

  StaticCodeAudit — Creación de regla

? Nombre de la regla (snake_case): detect_console_error

? Lenguaje destino:
  > python
    javascript
    java
    csharp
    php
    html
    yaml

? ¿Qué buscar en el código?
  Introduzca el texto o patrón que se desea detectar.
  Ejemplos: "TODO", "console.error", "SELECT.*FROM.*WHERE"
  > console.error(

? Ámbito de búsqueda:
  > Cada línea de forma independiente (line)
    Ventana de 4 líneas (context-4)
    Ventana de 6 líneas (context-6)

? Severidad:
  > LOW — Buena práctica, mejora sugerida
    MEDIUM — Problema que debe corregirse en un plazo razonable
    HIGH — Problema crítico, debe corregirse de inmediato

? ¿El archivo debe contener un patrón específico?
  (Condición previa — dejar vacío para omitir)
  >

? ¿El archivo NO debe contener?
  (Exclusión — dejar vacío para omitir)
  >

? Descripción breve (inglés): Residual console.error call
? Descripción breve (español): Llamada console.error residual
? Riesgo (inglés): Error logging in production exposes internal state.
? Solución (inglés): Remove console.error or use a proper logging framework.

  Vista previa de la regla:

  rule detect_console_error
    language  javascript
    severity  LOW

    match
      pattern  console\.error\(
      scope    line
    end

    message
      en "Residual console.error call"
      es "Llamada console.error residual"
    end
  end

? ¿Crear esta regla? (S/n): S

  Regla creada: custom-rules/javascript/maintenance/detect_console_error.sca
  Validada: 1 pattern, scope line, LOW

  Próximos pasos:
  1. Pruébela: ./staticcodeaudit-<plataforma> /mi/proyecto --test-rule detect_console_error
  2. Lance la auditoría completa para incluir esta regla en el informe

2.2 Comportamiento del asistente

Escape automático de expresiones regulares

Usted introduce texto sin formato. El asistente escapa automáticamente los caracteres especiales de regex:

Su entrada Patrón generado Explicación
console.error( console\.error\( Punto y paréntesis escapados
System.out.println System\.out\.println Puntos escapados
SELECT.*FROM SELECT.*FROM .* reconocido como intencional
\bfoo\b \bfoo\b Construcción regex preservada

Reglas de escape:

  • Los caracteres (, ), [, ], {, }, ., +, ?, ^, $, |, \ se escapan automáticamente
  • EXCEPTO si usted utiliza construcciones regex explícitas: .*, .+, \s, \w, \d, \b, [...], (a|b)
  • El asistente detecta estas construcciones y las preserva
  • En caso de duda, el asistente le pregunta: "Esto parece una regex. ¿Usarla tal cual? (S/n)"

Validación en tiempo real

Cada respuesta se valida de inmediato:

  • Nombre: [a-z][a-z0-9_]* — en caso contrario, mensaje de error y nueva petición
  • Pattern: se compila como regex — si hay error, se muestra el error y se solicita de nuevo
  • Severidad: elección entre los 3 valores — sin entrada libre

Modo avanzado (opcional)

Si usted escribe --create-rule --advanced, aparecen preguntas adicionales:

  • Confidence (0-100, valor por defecto 80)
  • Pattern-not (patrón de exclusión — "NO detectar si esta línea contiene...")
  • Ámbito codebase (verificar sobre el conjunto de archivos, no archivo por archivo)
  • Metadatos CWE/OWASP (cumplimiento normativo)

2.3 Gestión de errores

Situación Comportamiento
Nombre ya en uso "Este nombre ya existe. Elija otro nombre."
Regex inválida "Pattern inválido: [error]. Corríjalo o introduzca texto simple."
Ctrl+C "Cancelado. No se creó ningún archivo."
Directorio custom-rules/ ausente Se crea automáticamente

3. Prueba rápida (--test-rule <id>)

3.1 Flujo de trabajo

$ ./staticcodeaudit-<plataforma> /mi/proyecto --test-rule detect_console_error

  Probando la regla 'detect_console_error' sobre 42 archivos...

  src/components/App.jsx:18      — console.error("Failed to load", err);
  src/utils/api.js:67            — console.error(response.statusText);
  src/utils/api.js:102           — console.error("Network error:", e);

  3 hallazgos detectados en 2 archivos (0.2s)

3.2 Comportamiento

  • Carga ÚNICAMENTE la regla solicitada (ni las builtin ni el resto de personalizadas)
  • Escanea los archivos del lenguaje correspondiente en paths.include
  • Muestra cada hallazgo: archivo, línea, código
  • Sin informe HTML, sin baseline, sin exportación JSON
  • Cronometra el tiempo de ejecución
  • Código de salida: 0 si hay al menos 1 hallazgo, 1 si hay 0 hallazgos

3.3 Opciones

Opción Comportamiento
--test-rule <id> Prueba la regla en custom-rules/
--test-rule <id> --file src/app.py Prueba sobre un único archivo
--test-rule <id> --verbose Muestra también los archivos escaneados sin coincidencias

3.4 Casos de error

Situación Comportamiento
Regla no encontrada "Regla 'xxx' no encontrada en custom-rules/. Reglas disponibles: ..."
Regla inválida Muestra los errores de validación (igual que --rules-validate)
0 archivos del lenguaje "No se encontró ningún archivo .py en las rutas configuradas."

4. Ejemplos comentados (--init-rule --examples)

4.1 Instalación

$ ./staticcodeaudit-<plataforma> /mi/proyecto --init-rule --examples

  5 ejemplos instalados en custom-rules/_examples/
    01_simple_pattern.sca       — Detección de una palabra clave simple
    02_multiline_context.sca    — Pattern sobre varias líneas
    03_file_condition.sca       — match + requires (combinación)
    04_exclusion_pattern.sca    — Detectar salvo si es seguro
    05_requires_only.sca        — Condición de archivo solamente

    Lance: ./staticcodeaudit-<plataforma> /mi/proyecto --rules-validate
    para verificar que los ejemplos sean válidos.

4.2 Contenido de los ejemplos

01_simple_pattern.sca

Detecta console.log() en JavaScript.
Formato más básico: un pattern en una sola línea.

02_multiline_context.sca

Detecta .execute(f"...") en Python sobre 4 líneas (scope context-4).
La palabra clave "with" añade una condición AND sobre la misma ventana.

03_file_condition.sca

Combina match + requires: detecta Flask() únicamente en los
archivos que no importan CSRFProtect.
El hallazgo se sitúa en la línea exacta de Flask(), no en la línea 1.

04_exclusion_pattern.sca

Detecta hashlib.md5() SALVO si "usedforsecurity=False" está presente.
La palabra clave "pattern-not" excluye las líneas que contienen el patrón seguro.

05_requires_only.sca

Un bloque requires solo (sin match) produce un hallazgo a nivel de archivo (línea 1).
Detecta los archivos Django con MIDDLEWARE pero sin HSTS.

5. Restricción por nivel (licencia)

Nivel Reglas personalizadas Funcionalidades
Demo 0 Sin reglas personalizadas
Solo 20 regex --create-rule, --test-rule, --rules-validate
Team 100 regex + 30 taint Igual + ejemplos avanzados
Enterprise Ilimitado Todo + reglas cifradas

6. Verificación

Tras la creación de sus reglas:

  1. --create-rule → responder a las preguntas → archivo creado y válido
  2. --test-rule <id> → hallazgos mostrados con rapidez
  3. --init-rule --examples → ejemplos instalados y válidos
  4. Auditoría completa → reglas personalizadas presentes en el informe HTML y JSON