ESPACE PUBLICITAIRE DISPONIBLE · PARLONS-EN

Configurer les extensions de règles Snyk Code pour mapper des assainisseurs personnalisés et éliminer les faux positifs

365Finds Editorial
11 430 articles Wiki répertoriés

Utilisez 365 Wiki avec votre IA

Copiez le prompt ci-dessous, collez-le dans l’IA que vous utilisez déjà, puis posez directement votre question.

Télécharger le Skill complet

Commencez par essayer le prompt. Si vous utilisez souvent 365 Wiki, installez le Skill 365Wiki complet pour ne plus avoir à le coller. Sans IA habituelle, les versions web de Gemini ou Microsoft Copilot conviennent aussi.

Les équipes de sécurité applicative (AppSec) et les architectes qui déploient Snyk Code à l'échelle de l'entreprise se heurtent fréquemment à un écueil opérationnel majeur : la fatigue d'alerte provoquée par un flot continu de faux positifs issus de composants internes. Snyk Code s'appuie sur le moteur sémantique DeepCode, alimenté par l'intelligence artificielle et l'exécution symbolique, pour tracer le flux de données non fiables depuis leurs points d'entrée (sources) jusqu'aux points d'exécution sensibles (sinks ou puits).

Cependant, lorsque les équipes de développement nettoient ou valident ces données au moyen de bibliothèques de sécurité internes, d'utilitaires d'échappement propriétaires ou de classes d'assertion sur mesure, le moteur SAST ne peut pas déduire de façon autonome si ces mécanismes neutralisent efficacement la charge utile. Par conséquent, du code parfaitement légitime déclenche des alertes de sévérité haute pour injection SQL, Cross-Site Scripting (XSS) ou traversée de répertoires (Path Traversal) à chaque pull request.

La gestion réactive consistant à ignorer manuellement les alertes dans l'interface ou à multiplier les fichiers .snyk locaux est coûteuse et accroît le risque d'occulter de véritables failles. Pour répondre à ce défi de gouvernance, Snyk propose dans ses offres Enterprise la fonctionnalité Rule Extensions (Extensions de règles). Elle permet aux équipes de sécurité d'enregistrer de façon centralisée le nom pleinement qualifié (Fully Qualified Name ou FQN) de leurs fonctions internes, de les associer à des règles de sécurité précises et de sélectionner la sémantique d'assainissement appropriée, supprimant ainsi les faux positifs dans toute l'organisation sans dégrader la détection des vulnérabilités réelles.


L'analyse de propagation de teinte et l'origine des faux positifs

Pour configurer efficacement un assainisseur (sanitizer) personnalisé, il convient de comprendre la mécanique d'évaluation de Snyk Code :

[Source : Entrée externe non approuvée]
       │
       ▼
[Validateur interne propriétaire] ──► (Opaque pour le moteur sans Rule Extension)
       │
       ▼ (Le marquage de contamination persiste)
[Puits (Sink) : Opération sensible] ──► Alerte faux positif (False Positive)
  1. Source : Point d'entrée de données non fiables dans l'application (paramètres de requête HTTP, en-têtes, téléversements de fichiers ou files d'attente de messages).
  2. Chemin de propagation : Parcours des données à travers les affectations de variables, arguments de fonctions et transformations d'objets sur plusieurs fichiers.
  3. Assainisseur (Sanitizer) : Fonction ou mécanisme de filtrage qui échappe, valide ou encode les données pour empêcher l'exécution de charges hostiles.
  4. Puits (Sink) : Opération sous-jacente sensible qui, lorsqu'elle reçoit des données non assainies, engendre une vulnérabilité (requête SQL, génération de code HTML, manipulation du système de fichiers).

Les analyseurs SAST par défaut ne modélisent que les bibliothèques standard des langages et les frameworks open source les plus répandus. Dès lors que les données transitent par une classe interne (telle que MyOrg.Security.Encoder.CleanHtml ou PathValidator.assertSafePath), le moteur considère que la contamination subsiste et déclenche une alerte au moment où le puits est atteint.

Les limites des méthodes de contournement classiques

Les extensions de règles résolvent le problème à la racine : en déclarant la fonction interne comme un assainisseur valide directement dans le moteur, la chaîne de contamination est automatiquement rompue pour tous les projets sous gestion.


Les quatre modèles d'assainissement et leur correspondance sémantique

Toutes les fonctions de sécurité n'opèrent pas de la même manière. Snyk Code distingue quatre types de sanitizers (extension_type dans l'API) correspondant à des modes d'exécution précis :

Type d'assainisseurextension_type (API)Comportement de l'analyseurCas d'usage caractéristiques
Flux direct (Flow Through)flows_through_sanitizerAssainit toutes les données traversant la fonction. La valeur retournée est considérée comme sûre quel que soit l'état de l'entrée.Échappement HTML, encodage d'URL, fonctions de nettoyage renvoyant une chaîne sécurisée.
Si vrai (If True)if_true_sanitizerL'argument est considéré comme sain uniquement dans les branches conditionnelles où la fonction renvoie true.Fonctions de validation booléennes, listes blanches par expressions régulières (ex. isAlphaNumeric).
Si faux (If False)if_false_sanitizerL'argument est considéré comme sain uniquement dans les branches conditionnelles où la fonction renvoie false.Contrôles de liste noire, détection de protocoles suspects (ex. containsJavascriptProtocol).
Toute utilisation (Any Usage)any_usage_sanitizerL'argument est considéré comme sain dès la fin de l'appel. Conçu pour les routines levant des exceptions ou modifiant les objets sur place.Méthodes d'assertion qui interrompent immédiatement le flux par une exception si la donnée est invalide.

1. Flux direct (Flow Through)

S'applique aux méthodes de transformation recevant une donnée brute et renvoyant une version nettoyée :

package com.company.utils;

public class SecurityUtils {
    public static String escapeHtml(String data) {
        if (data == null) return "";
        return data.replace("<", "&lt;").replace(">", "&gt;");
    }
}

Déclarée comme flows_through_sanitizer pour la règle XSS, toute variable recevant ce résultat et transmise à un puits de sortie HTTP ne sera plus signalée comme vulnérable.

2. Si vrai (If True)

S'applique aux méthodes de validation booléenne servant de garde-fous :

package com.company.utils;

public class SecurityUtils {
    public static boolean isAlphaNumeric(String data) {
        return data != null && data.matches("^[a-zA-Z0-9]*$");
    }
}

Dans le code de l'application :

if (SecurityUtils.isAlphaNumeric(username)) {
    // La contamination est neutralisée ici ; l'accès fichier est jugé sûr
    File userProfile = new File("/data/profiles/" + username);
} else {
    // La contamination subsiste dans le bloc else
    response.sendError(400, "Invalid username");
}

3. Si faux (If False)

S'applique aux méthodes vérifiant l'absence d'éléments malveillants :

package com.company.utils;

public class SecurityUtils {
    public static boolean containsJavascriptProtocol(String data) {
        if (data == null) return false;
        return data.toLowerCase().trim().startsWith("javascript:");
    }
}

Dans l'application :

if (!SecurityUtils.containsJavascriptProtocol(redirectUrl)) {
    // La contamination est rompue lorsque le retour est faux
    response.sendRedirect(redirectUrl);
} else {
    response.sendError(400, "Invalid redirect URL");
}

4. Toute utilisation (Any Usage)

S'applique aux méthodes d'assertion qui interrompent l'exécution dès qu'une anomalie est détectée :

package com.company.utils;

public class SecurityUtils {
    public static void validateFileId(String fileId) {
        if (fileId == null || !fileId.matches("^[a-zA-Z0-9_-]+$")) {
            throw new IllegalArgumentException("Invalid File ID format");
        }
    }
}

Dans l'application :

// Lève une exception si l'identifiant est invalide
SecurityUtils.validateFileId(fileId);

// Dès la ligne suivante, fileId est considéré comme entièrement assaini
File file = new File("/data/uploads/" + fileId);

Avertissement de sécurité : L'attribution erronée de any_usage_sanitizer à une fonction classique qui ne lève pas d'exception et ne modifie pas l'objet en mémoire crée des faux négatifs critiques. Le moteur considérera l'argument comme sain même si la validation a été ignorée.


Déterminer le nom pleinement qualifié (FQN)

Snyk Code identifie les fonctions cibles exclusivement via leur Fully Qualified Name (FQN). Les noms partiels (PQN) et les caractères génériques ne sont pas autorisés. Les syntaxes varient selon les langages :


Configuration dans la console Snyk et via l'API REST

Les extensions de règles s'administrent depuis la console web ou par le biais de l'API REST publique.

Étapes dans l'interface web

  1. Connectez-vous à Snyk et sélectionnez le Groupe (Group) concerné.
  2. Accédez à Group settings -> Snyk Code -> Rule Extensions.
  3. Cliquez sur Create sanitizer et renseignez les paramètres :
    • Sanitizer : Saisissez le FQN exact de la fonction.
    • Rule key : Choisissez la règle associée dans la liste officielle (ex. XSS, Sqli, PT, CommandInjection, OR, LogForging).
    • Sanitization type : Sélectionnez l'un des quatre comportements sémantiques.
  4. Configurez les attributs d'étendue et de gouvernance :
    • Scope : Appliquez à l'ensemble du Groupe ou à une sélection d'Organisations.
    • Description : Ajoutez la référence du ticket Jira, l'équipe responsable et l'objectif.
    • Status : Définissez sur Draft (Brouillon) ou Published (Publié).
  5. Cliquez sur Save.

Il est recommandé de conserver la règle en Draft pendant les phases de test d'impact et de ne la publier qu'une fois son comportement validé.


Validation préalable par les tests d'impact (Impact Testing)

Déployer directement une extension de règle expose à des écueils : une coquille dans le FQN rendra la règle inopérante, tandis qu'une sémantique trop permissive risque de masquer de vraies vulnérabilités. La fonctionnalité Impact Testing de Snyk permet de simuler avec exactitude l'effet d'une règle proposée sur les constats d'un projet avant sa mise en production.

Déroulement automatisé via l'API

Étape 1 : Lancer le test d'impact

Envoyez une requête POST à /rest/groups/{group_id}/sast/rule_extensions/tests :

POST /rest/groups/b1d4c802-9a3e-4b62-9e81-2c1a84f5093e/sast/rule_extensions/tests HTTP/1.1
Host: api.snyk.io
Authorization: token YOUR_API_TOKEN
Content-Type: application/json

{
  "data": {
    "type": "tests",
    "attributes": {
      "project_id": "a3b8d4e1-7f1c-4a09-8b7e-2c6f5d1a0b3f",
      "org_id": "123e4567-e89b-12d3-a456-426614174000",
      "fully_qualified_name": "com.company.utils.SecurityUtils.escapeHtml",
      "rule_keys": ["XSS"],
      "extension_type": "flows_through_sanitizer"
    }
  }
}

La réponse renvoie 202 Accepted ainsi qu'un identifiant test_id.

Étape 2 : Suivre l'état du traitement

Interrogez régulièrement GET /rest/groups/{group_id}/sast/rule_extensions/tests/{test_id} jusqu'à ce que l'état passe de STARTED à COMPLETED.

Étape 3 : Examiner le rapport d'impact

Consultez le résultat via GET /rest/groups/{group_id}/sast/rule_extensions/tests/{test_id}/results :

{
  "data": {
    "attributes": {
      "total_count": 4,
      "removed_findings": {
        "count": 4,
        "changes": [
          {
            "rule_id": "java/XSS",
            "rule_name": "Cross-site Scripting (XSS)",
            "file_path": "src/main/java/com/company/web/UserController.java",
            "severity": "high",
            "priority_score": 710
          }
        ]
      },
      "added_findings": {
        "count": 0,
        "changes": []
      }
    }
  }
}

Analyse des résultats


Bonnes pratiques de gouvernance AppSec en entreprise

  1. Centraliser dans des bibliothèques de sécurité dédiées : Interdisez le développement d'utilitaires isolés par projet. Regroupez les logiques de nettoyage dans des SDK d'entreprise audités (JAR partagé, module Go, package npm) et configurez les extensions de règles uniquement sur ces interfaces.
  2. Standardiser les importations explicites : Instaurez des règles de codage interdisant les importations à caractères génériques ou l'introspection dynamique sur les frontières de validation.
  3. Assurer le suivi du cycle de vie des bibliothèques : Lors des montées de version ou des refactorisations internes, mettez à jour immédiatement les FQNs dans Snyk Code pour prévenir la réapparition des alertes.
  4. Adopter un déploiement échelonné : Respectez le cycle : Création en brouillon ➔ Test d'impact API ➔ Validation sur une organisation pilote ➔ Déploiement global au niveau du Groupe.

En instaurant ce cadre de gouvernance, les équipes AppSec éliminent durablement la fatigue d'alerte, renforcent l'adhésion des développeurs et préservent l'intégrité de l'analyse statique à grande échelle.


Références