.. Authors : .. mviewer team .. _secruity_scan: Scan de sécurité ================ Cette page décrit le scan de sécurité JavaScript intégré au dépôt. Le scan repose sur `Retire.js `_ et sur le script ``scans/security-audit.js``. Objectif -------- Le scan permet de : - détecter les bibliothèques JavaScript connues par Retire.js ; - identifier les versions détectées dans les fichiers du dépôt ; - remonter les vulnérabilités connues, leur sévérité et les CVE associées lorsqu'elles existent ; - générer un rapport texte exploitable en local et dans GitHub Actions. Exécution locale ---------------- Prérequis : - Node.js 24 ; - les dépendances du projet installées. Depuis la racine du dépôt :: npm ci npm run scan La commande ``npm run scan`` exécute le script ``scans/security-audit.js``. Fichiers générés ---------------- L'exécution locale produit deux fichiers à la racine du dépôt : - ``retire-develop.json`` : sortie JSON brute de Retire.js ; - ``security-report.txt`` : rapport texte généré à partir du JSON. Le rapport contient notamment : - un résumé exécutif ; - un tableau détaillé avec le nom du composant, le fichier source, la version détectée, le statut de vulnérabilité, le niveau de risque, les CVE et l'action recommandée ; - la liste des scripts HTML détectés ; - des recommandations générales. Workflow GitHub Actions ----------------------- Le workflow ``.github/workflows/security-audit.yml`` exécute le même scan : - sur chaque ``push`` vers la branche ``develop`` ; - chaque lundi via une planification hebdomadaire. Dans GitHub Actions : - ``npm ci`` installe les dépendances ; - ``npm run scan`` lance l'audit ; - le rapport est généré avec un nom daté : ``security-report-YYYY-MM-DD.txt`` ; - le rapport est publié comme artefact ``security-audit-report``. Personnalisation ---------------- Le script accepte plusieurs variables d'environnement utiles : - ``REPORT_DATE`` : date affichée dans le rapport ; - ``REPORT_BASENAME`` : nom du fichier de rapport ; - ``REPORT_FILE`` : chemin complet du rapport généré ; - ``RETIRE_OUTPUT_FILE`` : chemin du JSON produit par Retire.js. En local, le comportement par défaut est : - ``security-report.txt`` pour le rapport ; - ``retire-develop.json`` pour la sortie brute Retire.js. Dans GitHub Actions, le workflow force un nom daté pour le rapport généré. Limites ------- Ce scan reste un audit automatisé de premier niveau. - Retire.js ne couvre que les signatures et vulnérabilités qu'il connaît ; - certaines vulnérabilités dépendent du contexte d'usage de la bibliothèque ; - les bundles minifiés ou fortement transformés peuvent limiter la détection ; - un résultat ``Non`` ne remplace pas une revue de sécurité manuelle. Pour les cas ambigus, le fichier ``retire-develop.json`` doit être utilisé comme source de vérité technique, puis complété si nécessaire par une analyse manuelle. Scan RGAA statique ================== Le dépôt contient également un scan RGAA statique destiné à détecter certains problèmes d'accessibilité directement dans les fichiers HTML, les templates et les fragments HTML générés dans le JavaScript. Le scan repose sur : - le fichier ``scans/rgaa_criteres_ara.csv`` ; - le script ``scans/rgaa-scan.js`` ; - la commande ``npm run scan:rgaa``. Origine des critères -------------------- Les critères listés dans ``scans/rgaa_criteres_ara.csv`` proviennent d'ARA, l'outil d'audit rapide d'accessibilité porté par les services numériques de l'État. Le CSV conserve les liens vers : - le référentiel RGAA officiel : https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/ ; - la source ARA utilisée pour qualifier les types d'audit : https://github.com/DISIC/Ara/blob/main/confiture-web-app/src/criteria.ts. Le script n'automatise que les critères pouvant être vérifiés, totalement ou partiellement, par une analyse statique du code source. Les autres critères RGAA nécessitent une vérification manuelle. Périmètre contrôlé ------------------ Le scan parcourt les fichiers pouvant contenir du HTML : - les pages ``.html`` et ``.htm`` ; - les templates ``.mst``, ``.tpl`` et ``.mustache`` ; - les chaînes JavaScript qui contiennent des fragments HTML. Certains répertoires sont ignorés par défaut, notamment ``demo``, ``lib``, ``node_modules``, ``dist``, ``build`` et ``coverage``. Exécution locale ---------------- Depuis la racine du dépôt :: npm ci npm run scan:rgaa Par défaut, le rapport est affiché au format texte dans la sortie standard. Pour générer un rapport JSON :: npm run scan:rgaa -- --format json --output mviewer-rgaa-report.json Options utiles : - ``--format json`` : produit un rapport JSON ; - ``--output `` : écrit le rapport dans un fichier ; - ``--root `` : limite le scan à un répertoire ; - ``--csv `` : utilise un fichier de critères spécifique ; - ``--fail-on-issues`` : termine avec un code d'erreur si des anomalies sont détectées. Workflow GitHub Actions ----------------------- Le workflow ``.github/workflows/rgaa-scan.yml`` génère automatiquement le rapport RGAA : - sur les ``pull_request`` qui modifient les fichiers contrôlés ; - sur les ``push`` vers ``develop`` ; - manuellement via ``workflow_dispatch``. Le workflow exécute :: npm run scan:rgaa -- --format json --output mviewer-rgaa-report.json Le fichier ``mviewer-rgaa-report.json`` est publié comme artefact GitHub Actions téléchargeable sous le nom ``mviewer-rgaa-report.json``. Limites ------- Ce scan RGAA est un outil d'aide à l'audit. Il ne remplace pas un audit RGAA manuel. - les critères marqués ``partiel`` reposent sur des heuristiques ; - la pertinence d'un texte alternatif, d'un intitulé ou d'une structure ne peut pas toujours être validée automatiquement ; - les contenus générés dynamiquement à l'exécution peuvent échapper au scan ; - un rapport sans anomalie ne garantit pas la conformité RGAA complète.