Étudiante en Master Sécurité des Systèmes d’Information, je partage sur ce blog mon parcours en cybersécurité à travers mes projets, travaux pratiques et retours d’expérience. J’y aborde le DevSecOps, la sécurité cloud, le SOC, la sécurité applicative, les réseaux, la gestion des risques et les bonnes pratiques pour renforcer la protection des systèmes d’information.
La détection précoce des vulnérabilités au sein du cycle de développement logiciel est devenue un impératif de sécurité. L'approche Shift-Left vise à intégrer les contrôles de sécurité directement dans les chaînes d'intégration continue (CI/CD). Cet article présente une étude de cas axée sur l'implémentation et la validation expérimentale du moteur d'analyse statique (Static Application Security Testing SAST) Semgrep dans un pipeline GitLab CI/CD. Nous formalisons les mécanismes théoriques sous-jacents notamment le Parsing en Arbre Syntaxique Abstrait (AST) et l'Analyse de Propagation (Taint Tracking) , puis nous analysons la performance, la précision des règles et l'exploitabilité des résultats issus d'exécutions réelles.
Dans le modèle traditionnel de développement, les audits de sécurité interviennent tardivement, souvent juste avant le déploiement en production. Cette approche tardive engendre des coûts de remédiation très élevés et crée des frictions entre les équipes de développement et de sécurité [3]. Le concept de Shift-Left désigne le déplacement stratégique des vérifications de sécurité vers les phases amont du cycle de vie logiciel.
/image%2F7223967%2F20260828%2Fob_b2915e_traditional-approach-2026-08-28-152651.png)
/image%2F7223967%2F20260828%2Fob_df48f3_traditional-approach-2026-08-28-153314.png)
Figure 1 — Comparaison entre l'approche de sécurité traditionnelle et l'approche Shift-Left.
L'objectif de cette étude est d'évaluer la mise en œuvre pratique de l'analyse statique automatique au sein d'un pipeline DevSecOps multi-services. Nous analysons l'architecture d'intégration de l'outil Semgrep, sa capacité à identifier des vulnérabilités critiques sans altérer la rapidité de la CI/CD, et la structuration des données produites pour les portes de décision de sécurité (Security Gates).
Cadre conceptuel et terminologique : Définition formelle des notions clés de la sécurité applicative et de l'analyse de code.
Formalisation théorique : Explication des principes d'analyse de flux et de propagation des données sans complexité mathématique superflue.
Architecture d'intégration : Spécification d'un pipeline automatisé combinant SAST, secrets scanning, linting et audit d'images conteneurisées.
Étude de cas basée sur des preuves : Restitution et analyse des alertes générées à partir de captures d'écran du moteur en environnement d'exécution.
Afin de poser un cadre d'analyse rigoureux et accessible, nous formalisons les concepts fondamentaux mobilisés par l'analyse statique et la sécurité applicative :
DevSecOps : Méthode qui consiste à intégrer la sécurité directement dans le développement logiciel, dès les premières étapes et tout au long du cycle CI/CD [5].
SAST (Static Application Security Testing) : Technique qui analyse le code sans exécuter l'application afin de détecter des vulnérabilités [3].
SCA (Software Composition Analysis) : Technique qui analyse les bibliothèques et dépendances utilisées par une application afin de rechercher des vulnérabilités connues [1].
DAST (Dynamic Application Security Testing) : Technique qui teste une application lorsqu'elle fonctionne, en simulant des attaques pour rechercher des vulnérabilités [1].
AST (Abstract Syntax Tree) : Représentation du code sous forme d'arbre, permettant à un outil de comprendre la structure du programme et de l'analyser [3].
CFG (Control Flow Graph) : Graphe qui représente les différents chemins que peut suivre l'exécution d'un programme.
DFG (Data Flow Graph) : Graphe qui montre comment les données circulent et sont transformées dans un programme.
Vrai Positif (TP — True Positive) : Cas où l'outil détecte correctement une véritable vulnérabilité.
Faux Positif (FP — False Positive) : Cas où l'outil signale une vulnérabilité alors que le code n'est pas réellement vulnérable.
Security Gate (Porte de Sécurité) : Mécanisme qui décide automatiquement si le code peut continuer dans le pipeline ou doit être bloqué en fonction des résultats de sécurité.
Pour détecter des vulnérabilités de manière fiable, un outil d'analyse statique ne traite pas le code source comme un simple fichier texte brut (ce qui générerait un taux incalculable de faux positifs). Il transforme le code en structures de données logiques en s'appuyant sur les mécanismes d'un compilateur [3].
Cette transformation se déroule en plusieurs étapes successives :
L'analyse lexicale (Lexing) : Le scanner découpe le flux de caractères du fichier source en éléments élémentaires appelés Jetons (Tokens). Par exemple, une ligne comme const query = req.body.id; est découpée en types distincts : un mot-clé (const), un identifiant (query), un opérateur (=), et un accès à une propriété (req.body.id).
L'analyse syntaxique (Parsing) : Le Parser vérifie que la séquence de jetons respecte la grammaire officielle du langage de programmation. S'il est valide, il reconstruit la logique du programme sous forme d'arbre.
L'AST est la représentation arborescente et hiérarchique de la structure logique du programme :
Débarrassé du superflu : Contrairement à un arbre syntaxique concret (Parse Tree), l'AST élimine les détails purement visuels ou syntaxiques qui n'ont pas d'impact sémantique (comme les espaces, les retours à la ligne, les commentaires ou les parenthèses de groupement).
Composition en Nœuds (Nodes) : Chaque élément du code devient un nœud typé dans l'arbre :
Un nœud racine représente le fichier ou le sous-programme.
Les nœuds intermédiaires représentent des structures de contrôle (boucles for, conditions if), des déclarations de fonctions ou des affectations.
Les nœuds feuilles représentent les valeurs littérales (chaînes de caractères, nombres) ou les noms de variables.
Exemple d'utilité pour SAST :
Si un développeur écrit
db.query("SELECT * FROM users WHERE id = " + input)ou qu'il ajoute des espaces ou des sauts de ligne dans cette chaîne, le texte brut change, mais la structure du nœud d'AST reste strictement identique (un nœud BinaryExpression effectuant une concaténation au sein d'un nœud CallExpression vers la fonctionquery). Cela permet au moteur de détection d'appliquer la règle peu importe le style d'écriture du développeur.
/image%2F7223967%2F20260828%2Fob_53fdc1_traditional-approach-2026-08-28-155554.png)
Figure 2 — Processus de transformation du code source en structures de données observables.
Une fois l'AST généré, le moteur SAST l'utilise pour construire deux graphes complémentaires indispensables à l'analyse avancée :
Le Graphe de Flux de Contrôle (CFG) : L'AST montre la structure du code, mais pas l'ordre d'exécution dynamique. Le CFG prend les nœuds de l'AST et les relie sous forme de chemin orienté pour représenter tous les itinéraires d'exécution possibles (par exemple : quel bloc s'exécute selon que la condition d'un if soit vraie ou fausse).
Le Graphe de Flux de Données (DFG) : Le DFG s'appuie à la fois sur l'AST et le CFG pour suivre le trajet des valeurs et des variables. Il permet de savoir à quel endroit une variable est créée, où sa valeur est modifiée, et dans quelles autres variables ou fonctions elle est réinjectée. C'est le DFG qui sert de support direct à l'analyse de propagation (Taint Tracking).
L’Analyse de Propagation (Taint Tracking ou analyse de souillure) est la méthode centrale permettant de détecter les vulnérabilités de type Injection (SQL, Command Injection, XSS, Path Traversal) [1], [3].
Elle consiste à suivre à la trace les données entrantes non fiables dans l'application pour vérifier si elles peuvent atteindre une fonction sensible sans avoir été préalablement nettoyées. Ce mécanisme repose sur trois composants fondamentaux :
La Source : Désigne tout point d'entrée par lequel une donnée provenant d'un environnement externe non maîtrisé (utilisateur, API tiers, base de données, en-tête HTTP) pénètre dans l'application (ex: req.body, req.params.id, window.location.search).
Le Sink (Puits d'exécution) : Représente une fonction sensible, une API système ou une commande critique dont l'exécution avec des paramètres arbitraires incontrôlés entraîne une faille de sécurité majeure (ex: db.query(), eval(), child_process.exec()).
Le Sanitizer (Assainisseur) : Désigne toute fonction de nettoyage, de filtrage ou d'échappement appliquée à une donnée infectée afin de neutraliser les caractères dangereux, rendant la donnée de nouveau sûre avant d'atteindre un Sink (ex: pg.prepare(), DOMPurify.sanitize(), encodeURIComponent()).
/image%2F7223967%2F20260828%2Fob_8c5204_traditional-approach-2026-08-28-171625.png)
Figure 3 — Représentation visuelle de l'analyse de propagation (Taint Tracking) et conditions d'alerte.
Le moteur d'analyse parcourt le graphe de flux de données de l'application. Une alerte de sécurité est générée si et seulement si un chemin de données ininterrompu relie directement une Source à un Sink sans traverser au préalable un Sanitizer.
Si la donnée passe par une fonction de nettoyage valide, son marquage de souillure est effacé par le moteur, ce qui invalide le chemin d'attaque et empêche la levée de l'alerte (Figure 3).
L'efficacité du Taint Tracking dépend de la portée d'analyse du moteur SAST :
Analyse Intra-procédurale : Le moteur suit le flux de données uniquement à l'intérieur d'une même fonction ou d'un même bloc de code local. Cette approche est très rapide mais aveugle aux passages de données entre différents fichiers ou modules.
Analyse Inter-procédurale : Le moteur est capable de suivre la donnée à travers les frontières des fonctions, des fichiers et des dépendances importées. Elle offre une précision bien supérieure pour détecter les failles complexes mais nécessite des ressources de calcul plus importantes [3].
Le pipeline de sécurité conçu s'articule autour de 7 stages automatisés, garantissant une stratégie de défense en profondeur [5] :
/image%2F7223967%2F20260828%2Fob_8ca918_traditional-approach-2026-08-28-172514.png)
Figure 4 — Séquence d'exécution et dépendances des stages au sein du pipeline CI/CD.
/image%2F7223967%2F20260828%2Fob_64dd09_capture-d-ecran-2026-08-28-172810.png)
Figure 5 — Interface graphique de GitLab CI lors de l'exécution du pipeline.
Le job SAST s'appuie sur l'image semgrep/semgrep:latest. Il est configuré pour appliquer les ensembles de règles ciblant les standards OWASP Top 10 [1] et CWE [2] sur les langages du projet (Node.js, React, TypeScript).
/image%2F7223967%2F20260828%2Fob_591ffa_capture-d-ecran-2026-08-28-173118.png)
Figure 6 — Configuration YAML du job Semgrep.
Lors d'une soumission de code sur le dépôt, le job sast-semgrep est instancié. Le moteur parse le code source, génère les ASTs correspondants et applique les règles de détection.
/image%2F7223967%2F20260828%2Fob_5888cf_capture-d-ecran-2026-08-28-180211.png)
Figure 7 — Journal d'exécution affichant le chargement des règles et le scan des fichiers.
Les trouvailles sont exportées dans l'artéfact semgrep-report.json selon une structure standardisée facilitant l'évaluation du risque.
/image%2F7223967%2F20260828%2Fob_a8e72a_capture-d-ecran-2026-08-28-180326.png)
Figure 8 — Structure JSON détaillée d'une alerte identifiée par Semgrep.
Le triage désigne l'activité d'évaluation manuelle ou semi-automatisée visant à classifier chaque résultat de scan en Vrai Positif (TP) ou Faux Positif (FP) :
/image%2F7223967%2F20260828%2Fob_d04f90_traditional-approach-2026-08-28-180451.png)
Figure 9 — Logique de décision et traitement des alertes lors de la phase de triage.
Analyse syntaxique rapide : L'analyse directe par motifs d'AST évite la phase de compilation lourde exigée par d'autres moteurs SAST traditionnels [4].
Standardisation et intégration : L'export au format JSON structuré s'interface nativement avec la Security Gate automatisée en fin de pipeline.
L'analyse SAST ne peut évaluer le comportement dynamique de l'application en cours d'exécution. C'est pourquoi elle doit s'insérer dans une matrice de couverture complémentaire :
/image%2F7223967%2F20260828%2Fob_dc2887_traditional-approach-2026-08-28-180715.png)
Figure 10 — Matrice de positionnement des outils DevSecOps du pipeline.
Cette étude de cas démontre la pertinence théorique et pratique du moteur SAST Semgrep au sein d'une chaîne DevSecOps moderne. En formalisant les concepts d'AST et de Taint Tracking, nous avons montré comment l'analyse statique intercepte les failles majeures (OWASP Top 10) à la source. L'association d'un scanner rapide, d'une qualification rigoureuse des faux positifs et d'une Security Gate automatisée permet d'élever le niveau de sécurité global de l'application sans ralentir le cycle de livraison logiciel.