Custom Rules — Creation de regles personnalisees
Sommaire
- Vue d'ensemble
- Wizard interactif (--create-rule)
- Test rapide (--test-rule)
- Exemples commentes (--init-rule --examples)
- 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.
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 |