Skip to main content

Créer ses règles personnalisées

Niveau Intermédiaire
Temps de lecture ⏱ 12 min
mots 1029
Sujets custom-ruleswizard

Custom Rules — Creation de regles personnalisees

Sommaire

  1. Vue d'ensemble
  2. Wizard interactif (--create-rule)
  3. Test rapide (--test-rule)
  4. Exemples commentes (--init-rule --examples)
  5. Gating par tier (licence)

Objectif

Permettre aux utilisateurs de creer, tester et deployer leurs propres regles de detection sans connaissance prealable du format interne ou de la syntaxe regex.


1. Vue d'ensemble

Outils disponibles

Outil Commande Role
Wizard --create-rule Creation guidee pas-a-pas, zero connaissance technique requise
Test rapide --test-rule <id> Feedback instantane sur une regle, sans audit complet
Exemples --init-rule --examples Apprentissage par l'exemple (fichiers .sca commentes)
Squelette --init-rule <id> Genere un fichier .sca vide pre-rempli
Validation --rules-validate Valide toutes les regles custom (syntaxe, regex, champs)
Liste --rules-list Affiche toutes les regles chargees (builtin + custom)

Toutes les regles personnalisees sont stockees dans le repertoire custom-rules/{lang}/{cat}/ a cote de l'executable. Elles ne sont jamais ecrasees par les mises a jour du produit.

Retour au sommaire


2. Wizard interactif (--create-rule)

2.1 Workflow utilisateur

$ ./staticcodeaudit /mon/projet --create-rule

  StaticCodeAudit — Creation de regle

? Nom de la regle (snake_case) : detect_console_error

? Langage cible :
  > python
    javascript
    java
    csharp
    php
    html
    yaml

? Que chercher dans le code ?
  Entrez le texte ou pattern a detecter.
  Exemples : "TODO", "console.error", "SELECT.*FROM.*WHERE"
  > console.error(

? Scope de recherche :
  > Chaque ligne independamment (line)
    Fenetre de 4 lignes (context-4)
    Fenetre de 6 lignes (context-6)

? Severite :
  > LOW — Bonne pratique, amelioration suggeree
    MEDIUM — Probleme a corriger dans un delai raisonnable
    HIGH — Probleme critique, a corriger immediatement

? Le fichier doit-il contenir un pattern specifique ?
  (Condition prealable — vide pour ignorer)
  > 

? Le fichier ne doit PAS contenir ?
  (Exclusion — vide pour ignorer)
  > 

? Description courte (anglais) : Residual console.error call
? Description courte (francais) : Appel console.error residuel
? Risque (anglais) : Error logging in production exposes internal state.
? Solution (anglais) : Remove console.error or use a proper logging framework.

  Apercu de la regle :

  rule detect_console_error
    language  javascript
    severity  LOW

    match
      pattern  console\.error\(
      scope    line
    end

    message
      en "Residual console.error call"
      fr "Appel console.error residuel"
    end
  end

? Creer cette regle ? (O/n) : O

  Regle creee : audit-rules/detect_console_error.sca
  Validee : 1 pattern, scope line, LOW

  Prochaines etapes :
  1. Testez : ./staticcodeaudit /mon/projet --test-rule detect_console_error
  2. Lancez l'audit complet pour inclure cette regle dans le rapport

2.2 Comportement du wizard

Echappement automatique des regex

Le client tape du texte brut. Le wizard echappe automatiquement les caracteres speciaux regex :

Saisie client Regex generee Explication
console.error( console\.error\( Point et parenthese echappes
System.out.println System\.out\.println Points echappes
SELECT.*FROM SELECT.*FROM .* reconnu comme intentionnel
\bfoo\b \bfoo\b Construction regex preservee

Regles d'echappement :

  • Les caracteres (, ), [, ], {, }, ., +, ?, ^, $, |, \ sont echappes automatiquement
  • SAUF si le client utilise des constructions regex explicites : .*, .+, \s, \w, \d, \b, [...], (a|b)
  • Le wizard detecte ces constructions et les preserve
  • En cas de doute, le wizard demande : "Ceci ressemble a une regex. L'utiliser telle quelle ? (O/n)"

Validation en temps reel

Chaque reponse est validee immediatement :

  • Nom : [a-z][a-z0-9_]* — sinon message d'erreur et re-demande
  • Pattern : compile en regex — si erreur, affiche l'erreur et re-demande
  • Severite : choix parmi les 3 valeurs — pas de saisie libre

Mode avance (optionnel)

Si le client tape --create-rule --advanced, des questions supplementaires apparaissent :

  • Confidence (0-100, defaut 80)
  • Pattern-not (pattern d'exclusion — "Ne PAS detecter si cette ligne contient...")
  • Scope codebase (pour requires — verifier sur l'ensemble des fichiers, pas fichier par fichier)
  • Metadata CWE/OWASP (conformite)

2.3 Gestion des erreurs

Situation Comportement
Nom deja utilise "Ce nom existe deja. Choisissez un autre nom."
Regex invalide "Pattern invalide : [erreur]. Corrigez ou tapez du texte simple."
Ctrl+C "Annule. Aucun fichier cree."
Repertoire audit-rules/ absent Cree automatiquement

3. Test rapide (--test-rule <id>)

3.1 Workflow utilisateur

$ ./staticcodeaudit /mon/projet --test-rule detect_console_error

  Test de la regle 'detect_console_error' sur 42 fichiers...

  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 findings detectes dans 2 fichiers (0.2s)

3.2 Comportement

  • Charge UNIQUEMENT la regle demandee (pas les builtin, pas les autres custom)
  • Scanne les fichiers du langage correspondant dans paths.include
  • Affiche chaque finding : fichier, ligne, code
  • Pas de rapport HTML, pas de baseline, pas d'export JSON
  • Chronometre le temps d'execution
  • Code de sortie : 0 si au moins 1 finding, 1 si 0 findings

3.3 Options

Option Comportement
--test-rule <id> Teste la regle dans audit-rules/
--test-rule <id> --file src/app.py Teste sur un seul fichier
--test-rule <id> --verbose Affiche aussi les fichiers scannes sans match

3.4 Cas d'erreur

Situation Comportement
Regle introuvable "Regle 'xxx' introuvable dans audit-rules/. Regles disponibles : ..."
Regle invalide Affiche les erreurs de validation (comme --rules-validate)
0 fichiers du langage "Aucun fichier .py trouve dans les chemins configures."

4. Exemples commentes (--init-rule --examples)

4.1 Installation

$ ./staticcodeaudit /mon/projet --init-rule --examples

  5 exemples installes dans audit-rules/_examples/
    01_simple_pattern.sca       — Detection d'un mot-cle simple
    02_multiline_context.sca    — Pattern sur plusieurs lignes
    03_file_condition.sca       — match + requires (combo)
    04_exclusion_pattern.sca    — Detecter sauf si safe
    05_requires_only.sca        — Condition fichier seule

    Lancez : ./staticcodeaudit /mon/projet --rules-validate
    pour verifier que les exemples sont valides.

4.2 Contenu des exemples

01_simple_pattern.sca

Detecte console.log() en JavaScript.
Format le plus basique : un pattern sur une seule ligne.

02_multiline_context.sca

Detecte .execute(f"...") en Python sur 4 lignes (scope context-4).
Le mot-cle "with" ajoute une condition AND sur la meme fenetre.

03_file_condition.sca

Combine match + requires : detecte Flask() uniquement dans les
fichiers qui n'importent pas CSRFProtect.
Le finding est a la ligne exacte de Flask(), pas a la ligne 1.

04_exclusion_pattern.sca

Detecte hashlib.md5() SAUF si "usedforsecurity=False" est present.
Le mot-cle "pattern-not" exclut les lignes contenant le safe pattern.

05_requires_only.sca

Un bloc requires seul (sans match) produit un finding file-level (ligne 1).
Detecte les fichiers Django avec MIDDLEWARE mais sans HSTS.

5. Gating par tier (licence)

Tier Regles custom Fonctionnalites
Demo 0 Aucune regle custom
Solo 20 regex --create-rule, --test-rule, --rules-validate
Team 100 regex + 30 taint Idem + exemples avances
Enterprise Illimite Tout + regles chiffrees

Retour au sommaire