StaticCodeAudit — Résumé produit
Outil autonome d'audit de conformité, de sécurité et de qualité du code. Zéro dépendance. 100 % hors-ligne. Rapports de qualité entreprise.
Par CodeFixture | Préfixe : SCA
Sommaire
- Points clés
- Ce qu'il fait
- Règles de détection
- Langages pris en charge
- Fonctionnalités du rapport
- Conformité et standards
- Internationalisation
- Référence CLI
- Configuration
- Performance
Points clés
- Binaire autonome unique — aucune installation, aucune dépendance externe à installer
- 100 % hors-ligne — aucun appel d'API, aucun accès réseau, aucune dépendance cloud
- Plus de 465 règles de détection réparties sur 7 catégories d'audit avec correspondance OWASP/CWE/WCAG/ASVS (Python, JS/TS, Java, C#, PHP, YAML)
- Rapports HTML interactifs — fichier unique autonome avec plus de 12 visualisations Chart.js
- Prise en charge de 4 langues — français, anglais, espagnol, allemand (rapport et console)
- Comparaison historique — suivi automatique de la baseline sur 10 audits
- Analyse CVE — intégration optionnelle de pip-audit et npm audit (locale, hors-ligne)
- Personnalisation marque blanche — nom d'outil, société et logo configurables par projet
- Matrice de conformité ISO 27001 — mappe les findings vers les 93 contrôles de l'Annexe A sur 4 thèmes
- Rétention des rapports — nettoyage configurable par nombre, jours ou les deux modes
- Intégration git blame — résolution du committeur par finding pour la traçabilité
- Configuration interactive — modes init et configure guidés pour une mise en place facile
- Mode démo —
--demogénère des rapports anonymisés (chemins, code, solutions masqués) pour les prospects et le partage public - Wizard de règles personnalisées —
--create-rulewizard unifié en 7 étapes : création ou édition, vérification de doublons (nom + pattern), DSL complet (risk/solution/benefit/fix), 4 langues - Filtre de sévérité —
--severity CRITICAL,HIGHfiltre les règles avant le scan ; bandeau orange dans le rapport quand actif - Badge de langage — chaque finding affiche son langage détecté (Python, JavaScript, YAML…) sous forme de badge neutre
- Graphique langage × sévérité — diagramme à barres empilées croisant le langage détecté et le niveau de sévérité
- Architecture des règles personnalisées — répertoire
custom-rules/séparé, jamais écrasé par les mises à jour - Progression détaillée — numérotation dynamique
[n/N]calculée après le chargement des règles, messages par langage et par étape de taint
Ce qu'il fait
StaticCodeAudit (SCA) est un outil d'analyse statique qui scanne le code source d'un projet à la recherche de vulnérabilités de sécurité, d'anti-patterns architecturaux, de problèmes d'accessibilité UI/UX et de dette de maintenance. Il produit un rapport HTML autonome avec des findings groupés par sévérité, des graphiques interactifs, un score de santé et une analyse historique des tendances.
Workflow
1. ./staticcodeaudit-<plateforme> /chemin/vers/projet --init # Initialise le projet (génère UUID + config)
2. ./staticcodeaudit-<plateforme> /chemin/vers/projet # Lance l'audit complet
3. Ouvrez SCA-REPORT-*.html # Consultez le rapport interactif
Chaque audit génère :
- Rapport HTML (
SCA-REPORT-{timestamp}.html) — autonome, imprimable, interactif - Rapport démo (
SCA-REPORT-{timestamp}-demo.html) — version anonymisée à partager (activable via--demo) - Données JSON (
SCA-DATA-{timestamp}.json) — lisible par machine, versionné (v3.4) - Baseline — stockée pour la comparaison du prochain audit (problèmes nouveaux/résolus/persistants)
Règles de détection
Plus de 465 règles réparties sur 7 catégories, chacune avec évaluation du risque, conseils de remédiation et description du bénéfice.
Security (~430 règles) — Poids : 3
| Règle | Sévérité | Standard |
|---|---|---|
| Injection SQL (f-string, concat, ORM) | HIGH | OWASP A03, CWE-89 |
| XSS (innerHTML, React, Angular, Vue, Svelte, Blade) | HIGH | CWE-79 |
| Injection JNDI (Java — Log4Shell) | CRITICAL | ASVS 1.3.8, CWE-917 |
| Injection XPath (Java, C#, PHP, Python) | HIGH | ASVS 1.2.7, CWE-643 |
| SSTI — Server-Side Template Injection (Python, JS) | HIGH | ASVS 1.3.7, CWE-1336 |
| Injection SpEL (Spring) | HIGH | CWE-917 |
| Injection LDAP (C#) | HIGH | CWE-90 |
| Injection CSV (formula injection) | MEDIUM | ASVS 1.2.10, CWE-1236 |
| Injection SMTP (Python, PHP) | MEDIUM | ASVS 1.3.11, CWE-93 |
| ReDoS — Regular Expression Denial of Service | MEDIUM | ASVS 1.3.12, CWE-1333 |
| Format String Vulnerability | MEDIUM | ASVS 1.3.10, CWE-134 |
| Secrets en dur | HIGH | CWE-798 |
| Identifiants par défaut (en dur) | HIGH | ASVS 6.3.2, CWE-798 |
| Exécution de code dangereuse (eval/exec) | HIGH | CWE-94 |
| Mode debug activé | HIGH | OWASP A05 |
| Secret journalisé (f-string, argument, Java, C#, PHP) | HIGH | OWASP A09, CWE-532 |
| Injection de log (CRLF) | MEDIUM | ASVS 16.3.2, CWE-117 |
| HTTP sans TLS | MEDIUM | OWASP A02 |
| WebSocket sans TLS (ws:// vs wss://) | MEDIUM | ASVS 4.4.1, CWE-319 |
| Désérialisation non sûre (Python, Java, C#, PHP) | HIGH | OWASP A08, CWE-502 |
| Cryptographie faible (MD5/SHA-1, Java, C#, PHP) | HIGH | CWE-328 |
| Taille de clé insuffisante (RSA < 2048) | MEDIUM | ASVS 11.2.3, CWE-326 |
| Injection de commande OS (Python, Java, C#, PHP) | HIGH | CWE-78 |
| Exception verbeuse (Python, Java, C#, PHP) | MEDIUM | CWE-209 |
| Authentification artisanale | HIGH | CWE-287 |
| Politique de mot de passe faible (min < 8) | MEDIUM | ASVS 6.2.1, CWE-521 |
| Questions de sécurité (auth basée sur la connaissance) | LOW | ASVS 6.4.2, CWE-640 |
| Jetons de session prévisibles | HIGH | CWE-330 |
| JWT algorithme None | CRITICAL | ASVS 9.1.2, CWE-345 |
| Secret JWT en dur | HIGH | ASVS 9.1.3, CWE-798 |
| Import dynamique | MEDIUM | CWE-502 |
| Aléatoire non sûr (Math.random, Java, C#, PHP) | MEDIUM | CWE-330 |
| Authentification côté client (localStorage) | HIGH | CWE-602 |
| Race condition (TOCTOU) | MEDIUM | CWE-367 |
| Injection XXE (Java, C#, PHP) | HIGH | CWE-611 |
| CSRF désactivé (Spring) | HIGH | CWE-352 |
| CORS permissif (Spring, C#) | MEDIUM | CWE-942 |
| Contournement SSL (Java, C#) | HIGH | CWE-295 |
| Open redirect (Java, C#, PHP) | MEDIUM | CWE-601 |
| Inclusion de fichier (PHP) | HIGH | CWE-98 |
| Upload de fichier sans validation | MEDIUM | ASVS 5.2.2, CWE-434 |
| Spécifique PHP (extract, type juggling, mass assignment) | MEDIUM-HIGH | Divers |
| PII journalisées (RGPD, 5 langages) | HIGH | RGPD Art. 5 |
| Rétention des données absente (RGPD) | MEDIUM | RGPD Art. 5 |
| MFA absent (5 langages) | MEDIUM | CWE-308 |
| Dockerfile (utilisateur root, base non figée, COPY all) | HIGH-MEDIUM | CWE-250 |
| Stockage local non sûr (jetons/secrets dans localStorage) | MEDIUM | CWE-922 |
| En-tête CSP absent (Flask, Django, Express) | MEDIUM | CWE-1021 |
| En-tête HSTS absent | MEDIUM | ASVS 3.4.1, CWE-523 |
| X-Content-Type-Options absent | MEDIUM | ASVS 3.4.4 |
| Referrer-Policy absent | LOW | ASVS 3.4.5 |
| Protection contre l'embarquement absente (CSP/X-Frame-Options) | MEDIUM | ASVS 3.4.6, CWE-1021 |
| PostMessage sans vérification d'origine | MEDIUM | ASVS 3.5.5, CWE-346 |
| Subresource Integrity (SRI) absent | LOW | ASVS 3.6.1 |
| Contenu SVG scriptable (XSS) | MEDIUM | ASVS 1.3.4, CWE-79 |
| Introspection GraphQL activée | MEDIUM | ASVS 4.3.2 |
| GraphQL sans limite de profondeur | MEDIUM | ASVS 4.3.1, CWE-770 |
| IP interne en dur (RFC 1918) | MEDIUM | CWE-798 |
| Endpoint de test exposé (/test, /debug non protégés) | MEDIUM | CWE-489 |
Interface / UI (5 règles) — Poids : 1
| Règle | Sévérité |
|---|---|
| Styles inline en JavaScript | LOW |
| Utilisation manuelle de createElement | LOW |
| Écouteurs d'événements non nettoyés | LOW |
| Manipulation du DOM dans des boucles | LOW |
| SVG inline dans le HTML | LOW |
Expérience utilisateur / Accessibilité (18 règles) — Poids : 1
| Règle | Sévérité | Standard |
|---|---|---|
| Bouton sans label ARIA | MEDIUM | WCAG 2.4.6 |
| Champ de saisie sans label | MEDIUM | WCAG 1.3.1 |
| Image sans texte alternatif | MEDIUM | WCAG 1.1.1 |
| tabindex positif | MEDIUM | WCAG 2.4.3 |
| Contour de focus retiré | MEDIUM | WCAG 2.4.7 |
| Médias en autoplay | MEDIUM | WCAG 1.4.2 |
| Messages toast non traduits | MEDIUM | i18n |
| Toasts d'erreur éphémères | MEDIUM | UX |
| Chaîne UI en dur (vérification i18n) | MEDIUM | i18n |
| console.log résiduel | LOW | — |
Maintenance (22 règles) — Poids : 1
| Règle | Sévérité | Standard |
|---|---|---|
| TODO/FIXME/HACK/XXX non résolus | LOW | — |
| Utilisation d'API dépréciée (Python, Java, C#, PHP, JS) | LOW | CWE-477 |
| Exception attrape-tout (Python, Java, C#, PHP) | MEDIUM | CWE-396 |
| System.out.println (Java) | LOW | — |
| Console.Write (C#) | LOW | — |
| Suppresseur d'erreur @ (PHP) | LOW | — |
| Destructif sans backup (DROP/TRUNCATE hors migrations) | LOW | ISO A.8.13 |
| Utilisation de l'heure locale (datetime.now() sans timezone) | LOW | ISO A.8.17 |
| Endpoint de health check absent | LOW | ISO A.8.16 |
| Code vendor non revu | MEDIUM | ISO A.5.22 |
Dependencies (3 règles) — Poids : 2
| Règle | Sévérité | Standard |
|---|---|---|
| Dépendance vulnérable (CVE) | HIGH-CRITICAL | OWASP A06 |
| Version de dépendance non figée | HIGH | CWE-1357 |
| Licence non conforme | MEDIUM | — |
CI/CD (18 règles) — Poids : 2
| Règle | Sévérité | Standard |
|---|---|---|
| pull_request_target_checkout | HIGH | CI-CD-01 |
| GHA expression injection | HIGH | CI-CD-01 |
| GHA permissions excessives | MEDIUM | CI-CD-05 |
| GHA permissions manquantes | MEDIUM | CI-CD-05 |
| GHA déclencheur de commentaire non protégé | MEDIUM | CI-CD-01 |
| Version d'action non figée | HIGH | CI-CD-09 |
| Variables GitLab non sûres | MEDIUM | CI-CD-05 |
| Workflow absent du fichier CODEOWNERS | LOW | CI-CD-05 |
| gha_secret_in_log | HIGH | CWE-312 |
| gha_deprecated_commands | HIGH | CVE-2020-15228 |
| gha_artifact_poisoning | MEDIUM | CI-CD-09 |
| gha_self_hosted_runner | MEDIUM | CI-CD-06 |
| ci_curl_pipe_bash | HIGH | CI-CD-09 |
| ci_insecure_download | MEDIUM | CWE-319 |
| hardcoded_secret_cicd | CRITICAL | CI-CD-04 / CWE-798 |
| docker_latest_tag | LOW | CI-CD-09 |
| gitlab_allow_failure_security | HIGH | CI-CD-04 |
| gitlab_script_secrets_echo | HIGH | CWE-312 |
Langages pris en charge
| Langage | Extensions | Couverture des règles |
|---|---|---|
| Python | .py |
Security, Architecture, Maintenance |
| JavaScript | .js, .jsx, .mjs |
Security, UI, UX |
| TypeScript | .ts, .tsx |
Mêmes règles que JavaScript |
| HTML | .html, .htm, .vue, .svelte, .ejs, .hbs, .njk, .jinja, .jinja2, .twig, .liquid, .mustache, .phtml, .erb, .jsp, .asp, .aspx, .cshtml |
UI, UX/Accessibilité |
| Java | .java |
Security, Architecture, Maintenance |
| C# | .cs |
Security, Architecture, Maintenance |
| PHP | .php |
Security, Architecture, Maintenance |
| YAML | .yml, .yaml |
CI/CD |
Fonctionnalités du rapport
Sections (17 au total)
- En-tête — Nom du projet, version, UUID, drapeau de langue, horodatage
- Sommaire — Grille cliquable avec icônes emoji
- Paramètres d'audit — Langages, extensions scannées, chemins, motifs d'exclusion, catégories, mode
- Options CLI utilisées — Checklist de 16 options avec statut et descriptions
- Visualisations — 9 graphiques de métriques + 4 graphiques de tendances historiques (incl. barres empilées langage × sévérité)
- Statistiques de synthèse — Cartes : compteurs HIGH/MEDIUM/LOW, validations, taux de tests, durée
- Score de santé — Score de sécurité logarithmique normalisé par LOC, avec pénalités par sévérité et barre de progression colorée
- Top 10 des fichiers problématiques — Classement en heatmap
- Tests unitaires — Compteurs pass/fail/error/skip avec détails
- Validation des fixtures — Résultats de précision de détection
- Dépendances — Résultats du scan CVE, paquets non figés (optionnel)
- Conformité SLA — Délais de résolution et règles d'escalade par sévérité
- Matrice de conformité ISO 27001 — Mapping des findings vers les contrôles de l'Annexe A ISO/IEC 27001:2022 (93 contrôles, 4 thèmes)
- Findings par sévérité — Groupés CRITICAL/HIGH/MEDIUM/LOW/INFO avec extraits de code, badges de catégorie, liens glossaire
- Validations par catégorie — Messages de succès (aucun problème détecté)
- Glossaire — 36 acronymes avec définitions (OWASP, ASVS, WCAG, CVE, CVSS, CWE, CSRF, XSS, SQL, SARIF, SBOM, ISO 27001, etc.)
Fonctionnalités interactives
- Sidebar redimensionnable — Sommaire collant avec poignée de redimensionnement et persistance localStorage
- Raccourcis clavier — Navigation j/k, Ctrl+Home
- Sections repliables — Cliquez pour déplier/replier les findings
- Mode impression — Mise en page imprimable en un clic
- Visualisations Chart.js — Plus de 12 graphiques interactifs avec tooltips
- Comparaison à la baseline — Problèmes nouveaux/résolus/persistants mis en évidence
- Liens croisés du glossaire — Tous les acronymes du rapport sont des liens cliquables vers le glossaire avec aperçu en tooltip
Autonomie du rapport
Chaque rapport est un fichier HTML unique autonome :
- Tous les CSS, JavaScript et Chart.js intégrés en inline
- Favicon et logo encodés en base64
- Aucun fichier externe, aucun CDN, aucun réseau requis
- Peut être ouvert dans n'importe quel navigateur, partagé par e-mail, archivé
Conformité et standards
| Standard | Couverture |
|---|---|
| OWASP Top 10 | A01 (Broken Access Control), A02 (Cryptographic Failures), A03 (Injection), A05 (Security Misconfiguration), A06 (Vulnerable Components), A08 (Software Integrity), A09 (Security Logging) |
| OWASP CI/CD Top 10 | CI-CD-01 (Insufficient Flow Control), CI-CD-05 (Insufficient PBAC), CI-CD-09 (Improper Artifact Integrity) |
| CWE | CWE-78, CWE-79, CWE-89, CWE-90, CWE-94, CWE-98, CWE-209, CWE-250, CWE-287, CWE-295, CWE-308, CWE-328, CWE-330, CWE-352, CWE-367, CWE-396, CWE-477, CWE-502, CWE-532, CWE-601, CWE-602, CWE-611, CWE-798, CWE-917, CWE-922, CWE-942, CWE-1021, CWE-1357 |
| WCAG 2.1 | 1.1.1 (Non-text Content), 1.3.1 (Info and Relationships), 1.4.2 (Audio Control), 2.4.3 (Focus Order), 2.4.6 (Headings and Labels), 2.4.7 (Focus Visible) |
| ISO/IEC 27001:2022 | Matrice de conformité Annexe A — 93 contrôles répartis sur 4 thèmes (Organisationnel, Personnes, Physique, Technologique). 44 contrôles couverts par l'analyse statique (~47,3 % de couverture). Organisationnel A.5 : 10/37 (27 %), Technologique A.8 : 34/34 (100 %). 4 graphiques interactifs (doughnut, barres, radar, barres empilées) avec accordéon par thème. Couvre le secure coding (A.8.28), la cryptographie (A.8.24), la gestion des vulnérabilités (A.8.8), l'authentification (A.8.5), le contrôle d'accès (A.8.3), la gestion des privilèges (A.8.18), la sécurité du cloud (A.5.23), la chaîne d'approvisionnement (A.5.21), la supervision (A.8.16), les terminaux (A.8.1), le filtrage web (A.8.23), la segmentation réseau (A.8.22), la synchronisation d'horloge (A.8.17), la sauvegarde de l'information (A.8.13), la protection des audits (A.8.34), etc. |
| RGPD | Art. 5 (journalisation des PII, rétention des données) |
| CVE | Analyse des vulnérabilités via pip-audit (Python) et npm audit (Node.js) |
Internationalisation
| Langue | Drapeau | Console | Rapport | Glossaire |
|---|---|---|---|---|
| Français | 🇫🇷 | --script-lang fr |
reports.language: "fr" |
36 termes |
| Anglais | 🇬🇧 | --script-lang en |
reports.language: "en" |
36 termes |
| Espagnol | 🇪🇸 | --script-lang es |
reports.language: "es" |
36 termes |
| Allemand | 🇩🇪 | --script-lang de |
reports.language: "de" |
36 termes |
Chaque chaîne de l'outil est localisée :
- Messages console (
locales/script/{lang}.json) - Messages de log de debug (niveaux info, detail, trace)
- Texte, libellés et titres du rapport (
locales/report/{lang}.json) - Noms des règles, descriptions de risque, solutions, bénéfices
- Noms de catégories, libellés de sévérité, libellés de graphiques
- Termes du glossaire, définitions d'acronymes
Référence CLI
La CLI est organisée en 3 groupes d'arguments principaux.
Scan Options (communs à toutes les cibles)
| Option | Description |
|---|---|
project_path |
Chemin du projet cible (défaut : .) |
--quick, -q |
Mode rapide — règles de sécurité uniquement |
--severity LEVELS |
Filtre les règles par sévérité, séparées par des virgules (ex. CRITICAL,HIGH). Défaut : toutes. Bandeau orange dans le rapport quand actif. |
--lang {fr,en,es,de} |
Langue du rapport et de la console (défaut : en) |
--list-rules |
Liste toutes les règles d'audit par catégorie |
Output Options
| Option | Description |
|---|---|
--fail-on-high |
Code de sortie 1 si des vulnérabilités HIGH sont trouvées (intégration CI/CD) |
--sarif |
Génère un export SARIF 2.1.0 (GitHub Code Scanning, GitLab SAST) |
--with-logs |
Sauvegarde la sortie console dans un fichier log du répertoire de sortie |
--quiet |
Mode console silencieux — affiche seulement les erreurs et le résultat final |
Client Features
| Option | Description |
|---|---|
--init |
Crée ou modifie audit.config.json (interactif) |
--create-rule |
Crée ou édite une règle personnalisée (wizard interactif) |
--custom-rules-match |
Vérifie la couverture des règles personnalisées par les fixtures personnalisées |
--with-tests |
Détection automatique et exécution des tests unitaires du projet |
--with-deps |
Scan des vulnérabilités de dépendances (pip-audit, npm audit) |
Configuration
Toute la configuration vit dans audit.config.json à la racine du projet. Généré par --init.
Sections clés
| Section | Rôle |
|---|---|
brand |
Nom de l'outil, nom de société, préfixe, logo personnalisé |
project |
UUID, nom, version, description |
languages |
Langages à auditer : ["python", "javascript", "html"] |
paths.include |
Répertoires à scanner |
paths.exclude |
Motifs à ignorer |
categories |
Activation/désactivation et poids par catégorie |
rules.disabled |
Liste des clés de règles à ignorer |
reports |
Répertoire de sortie, répertoire d'historique, historique max (10), langue |
tests |
Activation/désactivation, répertoire, commande de tests personnalisée |
thresholds |
Max HIGH (0), max MEDIUM (10), santé minimale (80 %) |
sla |
SLA par sévérité (délai, escalade) |
fixtures |
Inclure les fixtures génériques (true/false) |
retention |
Nettoyage des rapports : mode (count/days/both), max_count, max_days |
Personnalisation marque blanche
{
"brand": {
"tool_name": "MyCompanyAudit",
"company_name": "My Company",
"prefix": "MCA",
"logo": "assets/my-logo.svg"
}
}
Personnalise : titre du rapport, pied de page, noms des fichiers de sortie, favicon, logo de l'en-tête.
Identifiant unique du projet
Chaque projet reçoit un identifiant unique (UUID) au premier --init. Cet identifiant permet :
- De distinguer plusieurs projets portant le même nom à des emplacements différents
- D'isoler les règles et fixtures spécifiques au projet
- De suivre l'historique des audits (compteur, date du dernier audit)
L'identifiant est stocké dans le fichier audit.config.json du projet (clé project.id).
Performance
StaticCodeAudit met en cache l'analyse pour accélérer drastiquement les exécutions répétées :
- Cache des règles compilées — réutilisation entre runs
- Analyse incrémentale par hash — seuls les fichiers modifiés sont ré-analysés
- Gain mesuré : -71 % en mode warm sur un projet de référence (332 fichiers : 15 s → 4,3 s)
- Cache sécurisé — HMAC-SHA256 anti-falsification, écriture atomique, purge des entrées orphelines
- Désactivable par variables d'environnement (
SCA_NO_CACHE,SCA_NO_INCREMENTAL,SCA_NO_PARALLEL) si nécessaire