Règles Semgrep pour JavaScript¶
rules_lgpl_javascript_database_rule-node-knex-sqli-injection¶
Résumé :
Neutralisation inappropriée des éléments spéciaux utilisés dans une commande SQL (Injection SQL)
Sévérité : Critique
CWE : CWE-89
Description :
L'application utilise les méthodes de constructeur de requêtes Knex knex.raw() ou whereRaw() avec des entrées utilisateur non fiables directement concaténées dans des requêtes SQL. Cela contourne le mécanisme de requêtes paramétrées de Knex et permet aux attaquants d'injecter des commandes SQL arbitraires, ce qui peut entraîner un accès non autorisé aux données, des modifications ou des suppressions. Les méthodes SQL brutes sont particulièrement dangereuses car elles désactivent l'échappement automatique et la paramétrisation qui rendent Knex sécurisé par défaut.
Remédiation :
Envisagez d'utiliser les méthodes de constructeur de requêtes standard de Knex comme where(), insert(), update(), et select() qui paramètrent automatiquement les valeurs et préviennent les injections SQL. Si le SQL brut est absolument nécessaire, utilisez la syntaxe de liaison positionnelle avec knex.raw('SELECT * FROM users WHERE id = ?', [userId]) ou des liaisons nommées avec knex.raw('SELECT * FROM users WHERE id = :id', {id: userId}) pour garantir que les entrées utilisateur sont correctement paramétrées. Il est recommandé d'éviter complètement raw() et whereRaw() si possible, car le constructeur de requêtes standard fournit des alternatives sûres et à l'épreuve des injections pour presque toutes les opérations SQL. Pour des requêtes complexes, envisagez de les diviser en appels de chaîne de constructeurs plus petits plutôt que de recourir au SQL brut.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
règles_lgpl_javascript_base_de_données_règle-no-sqli-injection¶
Résumé :
Neutralisation inadéquate des éléments spéciaux dans la logique de requête de données
Sévérité : Critique
CWE : CWE-943
Description :
L'application passe des entrées utilisateur non fiables directement dans la méthode de requête findOne() de MongoDB sans une désinfection appropriée. Cela permet aux attaquants d'injecter des opérateurs de requête MongoDB comme $gt, $ne, $regex, ou d'autres opérateurs spéciaux qui peuvent contourner les contrôles d'authentification, extraire des données non autorisées, ou provoquer un déni de service. L'injection NoSQL se produit lorsque des objets contrôlés par l'utilisateur sont utilisés comme paramètres de requête, permettant la manipulation de la logique de requête via des entrées spécialement conçues.
Remédiation :
Envisagez d'utiliser le paquet mongo-sanitize pour supprimer toute clé commençant par $ des entrées utilisateur avant de les passer aux requêtes MongoDB. Installez-le avec npm install mongo-sanitize et appliquez-le à toutes les données contrôlées par l'utilisateur avec const clean = sanitize(req.body). Alternativement, validez les entrées pour vous assurer qu'elles correspondent aux types attendus - par exemple, cast explicitement les IDs en chaînes de caractères avec String(userId) ou validez que les valeurs de requête sont des primitives plutôt que des objets. Il est recommandé de mettre en œuvre une couche de validation de schéma stricte en utilisant des bibliothèques comme Joi ou express-validator pour s'assurer que les entrées utilisateur répondent aux types et formats de données attendus avant qu'elles n'atteignent les requêtes de base de données. Pour les systèmes de production, envisagez d'utiliser Mongoose avec des définitions de schéma strictes, ce qui fournit une protection supplémentaire contre l'injection inattendue d'opérateurs de requête.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_database_rule-node-nosqli-js-injection¶
Résumé :
Neutralisation incorrecte des éléments spéciaux dans la logique de requête de données.
Gravité : Critique
CWE : CWE-943
Description :
L'application utilise l'opérateur $where de MongoDB avec des entrées utilisateurs non fiables, permettant l'exécution de code JavaScript arbitraire dans le contexte de la base de données. L'opérateur $where évalue les expressions JavaScript côté serveur, et l'injection d'entrées utilisateurs directement dans ces expressions permet aux attaquants d'exécuter un code malveillant, d'accéder à des données sensibles ou de provoquer un déni de service. Cela est particulièrement dangereux car cela accorde des capacités d'exécution de code côté serveur plutôt qu'une simple manipulation de requêtes.
Remédiation :
Considérez l'évitement complet de l'opérateur $where dans les requêtes MongoDB, car il est intrinsèquement dangereux et a un surcoût de performance significatif. Remplacez les requêtes basées sur $where par les opérateurs de requête natifs de MongoDB comme $gt, $lt, $regex, $and, $or qui fournissent la même fonctionnalité sans exécution de JavaScript. Pour des conditions complexes, utilisez le pipeline d'agrégation avec l'opérateur $expr qui permet des comparaisons champ à champ de manière sécurisée. Il est recommandé d'implémenter une validation stricte des entrées et d'utiliser des méthodes de schéma Mongoose ou des modèles de constructeur de requêtes qui empêchent l'interpolation directe de chaînes dans les requêtes. MongoDB a déprécié $where dans la version 4.4 et les versions plus récentes offrent des alternatives plus sûres pour tous les cas d'utilisation courants. Si le code hérité nécessite absolument $where, isolez-le dans une fonction contrôlée avec une validation d'entrées extensive, bien que la migration hors de $where soit fortement préférée.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_database_rule-node-sqli-injection¶
Résumé :
Neutralisation incorrecte des éléments spéciaux utilisés dans une commande SQL (Injection SQL)
Gravité : Critique
CWE : CWE-89
Description :
L'application construit des requêtes SQL en concaténant des entrées utilisateur non fiables à l'aide de la concaténation de chaînes, de littéraux de modèle ou d'ajout de chaînes avec des méthodes de pilote de base de données telles que query() de mysql, pg, mssql, oracledb ou sequelize. Cela permet aux attaquants d'injecter des commandes SQL arbitraires qui peuvent lire, modifier ou supprimer des données, contourner l'authentification ou exécuter des opérations administratives sur la base de données. La concaténation de chaînes annule toutes les protections intégrées fournies par les pilotes de base de données et rend l'injection SQL triviale à exploiter.
Remédiation :
Envisagez d'utiliser des requêtes paramétrées (également appelées déclarations préparées) qui séparent le code SQL des données utilisateur et préviennent les attaques par injection. Pour mysql, utilisez connection.query('SELECT * FROM users WHERE id = ?', [userId]) avec des paramètres positionnels. Pour pg (PostgreSQL), utilisez client.query('SELECT * FROM users WHERE id = $1', [userId]) avec des espaces réservés numérotés. Pour une meilleure sécurité de type et une expérience développeur améliorée, il est recommandé d'utiliser des constructeurs de requêtes comme Knex.js ou des ORM tels que Sequelize, TypeORM ou Prisma, qui fournissent par défaut des requêtes paramétrées et réduisent la probabilité de vulnérabilités d'injection SQL. Évitez entièrement les littéraux de modèle et la concaténation de chaînes lors de la construction de requêtes SQL - même pour les noms de tables ou de colonnes, utilisez une liste blanche pour valider par rapport à un ensemble prédéfini de valeurs sûres plutôt que la construction dynamique.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_database_rule-sequelize-weak-tls¶
Résumé :
Sélection d'un algorithme moins sécurisé lors de la négociation (Downgrade d'algorithme)
Gravité : Critique
CWE : CWE-757
Description :
La configuration de connexion à la base de données Sequelize définit explicitement dialectOptions.ssl.minVersion sur TLSv1 ou TLSv1.1 pour les connexions MySQL, MariaDB ou PostgreSQL. Les protocoles TLS 1.0 et TLS 1.1 sont des protocoles obsolètes avec des faiblesses cryptographiques connues, y compris des vulnérabilités aux attaques POODLE et BEAST, et ils ont été officiellement prohibés par les principales normes de conformité, y compris PCI DSS, depuis 2018. Utiliser ces versions de protocole obsolètes expose le trafic de la base de données à des attaques de downgrade de protocole et compromet la confidentialité et l'intégrité des données transmises.
Remédiation :
Envisagez de définir minVersion: 'TLSv1.3' dans la configuration dialectOptions.ssl pour imposer le protocole TLS le plus sécurisé disponible, ce qui élimine les suites de chiffrement héritées et fournit par défaut la confidentialité persistante. Si TLS 1.3 n'est pas pris en charge par votre serveur de base de données, utilisez minVersion: 'TLSv1.2' comme norme minimale acceptable - TLS 1.2 est sécurisé lorsqu'il est correctement configuré et largement pris en charge. Il est également recommandé de vérifier que votre serveur de base de données est configuré pour désactiver complètement la prise en charge de TLS 1.0 et 1.1 au niveau du serveur, car l'application côté client seule peut ne pas prévenir les attaques de downgrade dans tous les scénarios. Pour les services de bases de données cloud, consultez la documentation de votre fournisseur pour activer l'application de TLS 1.2+ côté serveur (AWS RDS, Azure et GCP prennent tous en charge cela). Envisagez de supprimer complètement le paramètre minVersion pour utiliser les valeurs par défaut de Node.js, qui imposent déjà TLS 1.2+ dans les versions récentes.
OWASP :
- A3:2017-Exposition des données sensibles
- A02:2021-Failles cryptographiques
règles_lgpl_javascript_electronjs_règle-electron-autoriser-http¶
Résumé :
Transmission en clair d'informations sensibles
Gravité : Critique
CWE : CWE-319
Description :
La configuration de BrowserWindow définit webPreferences.allowRunningInsecureContent sur true, ce qui permet à l'application Electron de charger et d'exécuter du contenu via des connexions HTTP non chiffrées. Cela rend l'application vulnérable aux attaques de type homme du milieu où des attaquants peuvent intercepter, modifier ou injecter un contenu malveillant dans le trafic HTTP, compromettant potentiellement l'application entière et les données utilisateur.
Remédiation :
Envisagez de supprimer le paramètre allowRunningInsecureContent: true de webPreferences ou de le définir explicitement sur false. Il est recommandé de configurer votre application Electron pour ne charger que des ressources via HTTPS en veillant à ce que toutes les URLs utilisent le protocole https:// et que tout contenu local soit servi par des canaux sécurisés. Si vous devez charger du contenu externe, mettez en œuvre une Politique de Sécurité de Contenu (CSP) qui restreint les ressources uniquement aux origines HTTPS. Pour les environnements de développement où HTTP est nécessaire, envisagez d'utiliser des fichiers de configuration spécifiques à l'environnement plutôt que de coder en dur des paramètres non sécurisés dans le code de production.
OWASP :
- A6:2017-Mauvaise configuration de la sécurité
- A05:2021-Mauvaise configuration de la sécurité
rules_lgpl_javascript_electronjs_rule-electron-disable-websecurity¶
Résumé :
Erreur de validation d'origine
Gravité : Critique
CWE : CWE-346
Description :
La configuration de BrowserWindow définit webPreferences.webSecurity à false,
ce qui désactive la politique de même origine de Chromium, les restrictions de partage de ressources entre origines (CORS),
et l'application de la politique de sécurité du contenu. Cela permet à l'application Electron
de charger et d'exécuter du code depuis n'importe quel domaine sans vérifications de sécurité,
la rendant vulnérable aux attaques de scripting inter-sites (XSS), d'exfiltration de données, et d'exécution de code arbitraire. Désactiver la sécurité web supprime effectivement les
frontières de sécurité fondamentales du navigateur qui protègent les utilisateurs contre un contenu web malveillant.
Remédiation :
Envisagez de supprimer le paramètre webSecurity: false des webPreferences pour
restaurer les protections de la politique de même origine. Si des demandes inter-origines sont nécessaires,
il est recommandé de configurer les en-têtes CORS appropriés côté serveur ou d'utiliser l'API webRequest d'Electron pour modifier les en-têtes de réponse de manière sécurisée. Pour le chargement de fichiers locaux,
utilisez la fonctionnalité d'enregistrement de protocole personnalisé (protocol.registerFileProtocol) avec
des vérifications de privilèges appropriées au lieu de désactiver entièrement la sécurité web. Si vous
devez contourner CORS pour des domaines de confiance spécifiques pendant le développement, mettez en œuvre
des configurations spécifiques à l'environnement et assurez-vous que la sécurité web est toujours activée dans
les builds de production.
OWASP :
- A6:2017-Mauvaise configuration de sécurité
- A05:2021-Mauvaise configuration de sécurité
rules_lgpl_javascript_electronjs_rule-electron-experimental-features¶
Résumé :
Violation du principe du moindre privilège
Gravité : Critique
CWE : CWE-272
Description :
La configuration de BrowserWindow définit webPreferences.experimentalFeatures à
vrai, ce qui active les fonctionnalités expérimentales et potentiellement instables de Chromium dans
le processus de rendu d'Electron. Ces fonctionnalités expérimentales ne sont pas prêtes pour la production
et peuvent contenir des vulnérabilités de sécurité, des problèmes de sécurité mémoire ou des comportements inattendus qui n'ont pas été soumis à un examen de sécurité approfondi. L'activation de telles fonctionnalités
viole le principe du moindre privilège en exposant une fonctionnalité non testée qui
pourrait être exploitée par un contenu malveillant.
Remédiation :
Envisagez de retirer le réglage experimentalFeatures: true de webPreferences
pour n'utiliser que des fonctionnalités Chromium stables et bien testées. Il est conseillé d'évaluer
si la fonctionnalité requise peut être réalisée à l'aide d'API Electron stables,
de modules Node.js ou de bibliothèques tierces matures plutôt que de fonctionnalités expérimentales du navigateur. Si des fonctionnalités expérimentales spécifiques sont absolument nécessaires, passez en revue attentivement les notes de version d'Electron et de Chromium pour comprendre les risques associés, et mettez en œuvre des contrôles de sécurité compensatoires tels qu'un sandboxing strict, des politiques de sécurité de contenu et une validation des entrées. Envisagez d'utiliser des drapeaux de fonctionnalité pour désactiver
les fonctionnalités expérimentales en production tout en les autorisant dans les environnements de développement.
OWASP :
- A6:2017-Mauvaise configuration de la sécurité
- A05:2021-Mauvaise configuration de la sécurité
rules_lgpl_javascript_eval_rule-eval-require¶
Résumé :
Utilisation d'un nom ou d'une référence mal résolus
Gravité : Critique
CWE : CWE-706
Description :
L'application passe des entrées d'utilisateur non fiables provenant de paramètres de requête HTTP directement dans la fonction require() de Node.js, créant une vulnérabilité critique d'exécution de code à distance. La fonction require() charge et exécute des modules JavaScript, et les attaquants peuvent manipuler le chemin du module pour charger des packages malveillants, accéder à des modules internes non destinés à l'accès utilisateur, ou exploiter la traversée de chemin pour exécuter des fichiers de code arbitraires à partir du système de fichiers. Cette vulnérabilité permet une compromission complète du serveur, car les attaquants peuvent exécuter du JavaScript arbitraire avec tous les privilèges de l'application, accéder à des fichiers sensibles, voler des variables d'environnement ou établir des portes dérobées persistantes.
Remédiation :
Ne jamais passer des entrées d'utilisateur directement à require() - validez toujours contre une liste de noms de modules permise. Définissez un tableau ou un ensemble explicite contenant uniquement les modules spécifiques auxquels les utilisateurs devraient avoir accès et rejetez toute entrée non présente dans cette liste. Utilisez une correspondance exacte de chaînes (par exemple, allowedModules.includes(userInput)) plutôt qu'une correspondance par motif pour prévenir les tentatives de contournement. Évitez d'utiliser require() dynamique complètement lorsque c'est possible - chargez plutôt tous les modules nécessaires de manière statique et utilisez une instruction switch ou une carte d'objet pour sélectionner le module approprié en fonction de l'entrée utilisateur validée. Si vous devez prendre en charge le chargement de plugins, implémentez un répertoire de plugins dédié avec des conventions de nommage de fichiers strictes et vérifiez que les chemins résolus restent dans le répertoire autorisé en utilisant path.resolve() et la vérification de préfixe. Envisagez d'utiliser import() dynamique ES6 avec une validation appropriée car cela offre de meilleures limites de sécurité que require() de CommonJS.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_eval_rule-sandbox-code-injection¶
Résumé :
Contrôle inadéquat de la génération de code (Injection de code)
Sévérité : Critique
CWE : CWE-94
Description :
L'application transmet des entrées utilisateur non fiables provenant des paramètres de requête HTTP (req.query, req.body) directement à la méthode run() du package npm sandbox. Le package sandbox exécute du code JavaScript dans un environnement isolé, mais ne fournit pas de sandbox sécurisé - il utilise le module intégré vm de Node.js qui présente des vulnérabilités connues d'évasion de sandbox. Les attaquants peuvent concevoir des charges utiles JavaScript malveillantes qui s'échappent de la sandbox en utilisant la pollution de prototype, la manipulation de constructeur ou d'autres techniques d'évasion pour exécuter du code arbitraire sur le serveur Node.js avec tous les privilèges. Cela crée une vulnérabilité critique d'exécution de code à distance.
Remédiation :
Ne jamais exécuter de code fourni par un utilisateur dans des applications Node.js, même dans des environnements sandboxés. Les modules sandbox et vm ne peuvent pas fournir une isolation de sécurité fiable contre des attaquants déterminés. Supprimez toutes les fonctionnalités qui exécutent du code JavaScript dynamique fourni par l'utilisateur. Si vous devez prendre en charge une logique personnalisable par l'utilisateur, utilisez un langage spécifique à un domaine (DSL) sûr ou un evaluateurs d'expressions avec des limitations de syntaxe strictes, comme expr-eval ou safe-eval-2 configurés avec des capacités minimales. Alternativement, implémentez un ensemble prédéfini d'opérations que les utilisateurs peuvent configurer via une configuration JSON déclarative au lieu de code exécutable. Pour une exécution de code véritablement isolée, envisagez d'exécuter du code utilisateur dans des processus séparés avec des limites de ressources strictes en utilisant des technologies de containerisation telles que Docker avec des profils de sécurité, bien que cela nécessite une expertise en sécurité substantielle pour être correctement mis en œuvre.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
règles_lgpl_javascript_eval_rule-injection-de-modèle-côté-serveur¶
Résumé :
Contrôle inadéquat de la génération de code (Injection de code)
Sévérité : Critique
CWE : CWE-94
Description :
L'application passe des entrées utilisateur non fiables directement dans la fonction compile() des moteurs de templates JavaScript, y compris Handlebars, Pug, Haml.js, EJS, Squirrelly ou Eta. Ces moteurs de templates compilent les chaînes de templates en fonctions JavaScript exécutables, et lorsque l'entrée utilisateur est incluse dans le code source du template, les attaquants peuvent injecter des expressions de template malveillantes qui exécutent du JavaScript arbitraire sur le serveur Node.js. L'injection de template permet aux attaquants d'accéder au contexte complet côté serveur, d'exécuter des commandes système, de lire des fichiers sensibles, d'accéder aux variables d'environnement ou d'établir des portes dérobées persistantes. Il s'agit d'une vulnérabilité critique d'injection de modèle côté serveur (SSTI) qui conduit à une exécution de code à distance complète.
Remédiation :
Ne passez jamais l'entrée utilisateur directement dans les fonctions compile() du moteur de template. Séparez les définitions de templates des données de templates - stockez les templates sous forme de fichiers statiques ou de chaînes pré-compilées, et passez l'entrée utilisateur uniquement en tant que données au contexte de rendu. Utilisez l'API de rendu du moteur de template (par exemple, template.render(data) ou ejs.render(templateString, data)) où l'entrée utilisateur est passée sous forme d'objet de données, et non sous forme de chaîne de template. Si vous devez permettre aux utilisateurs de personnaliser des templates, utilisez un système de templating sûr avec l'auto-échappement activé et sans capacités d'exécution de code, ou implémentez une interface utilisateur de constructeur de templates qui construit des templates à partir de composants pré-approuvés. Activez toujours l'auto-échappement dans votre moteur de template pour prévenir les XSS, même lorsque les templates sont sûrs contre les SSTI. Envisagez d'utiliser des moteurs de templates sans logique comme Mustache, qui n'ont pas de capacités d'exécution de code pour les templates personnalisables par l'utilisateur.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_eval_rule-vm-code-injection¶
Résumé :
Contrôle inapproprié de la génération de code (Injection de Code)
Gravité : Critique
CWE : CWE-94
Description :
L'application transmet des entrées utilisateur non fiables à partir des paramètres de requête HTTP (req.query, req.body) aux fonctions du module vm intégré de Node.js, y compris vm.runInContext(), vm.runInNewContext(), vm.runInThisContext(), vm.compileFunction(), ou au constructeur vm.Script. Le module vm exécute du code JavaScript dans des contextes V8 isolés mais ne fournit explicitement aucune isolation de sécurité - il est conçu uniquement pour exécuter un code de confiance dans des portées globales séparées. Les attaquants peuvent facilement échapper des contextes VM en utilisant la manipulation de prototype, l'accès aux constructeurs ou d'autres techniques bien documentées pour exécuter du code arbitraire sur le serveur Node.js avec des privilèges complets. Cela crée une vulnérabilité critique d'exécution de code à distance.
Remédiation :
N'utilisez jamais le module vm pour exécuter du code non fiable - il ne fournit aucune isolation de sécurité malgré les apparences de création de contextes séparés. Comme indiqué explicitement dans la documentation de Node.js, le module vm n'est pas un mécanisme de sécurité. Supprimez complètement toute fonctionnalité qui exécute du code fourni par l'utilisateur. Si vous avez besoin d'un comportement dynamique, implémentez-le en utilisant des alternatives sûres : utilisez une instruction switch ou une carte d'objet pour sélectionner parmi des opérations sûres prédéfinies, utilisez JSON.parse() pour les données, ou implémentez un langage spécifique à un domaine restreint (DSL) avec un analyseur sûr. Pour les expressions mathématiques, envisagez des bibliothèques comme expr-eval avec une configuration stricte. Si l'exécution de code est absolument inévitable, isolez-la dans des conteneurs Docker séparés ou des fonctions sans serveur sans accès réseau, avec des systèmes de fichiers en lecture seule et des limites strictes de ressources, bien que même cela nécessite une expertise en matière de sécurité substantielle.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_eval_rule-vm-compilefunction-injection¶
Résumé :
Contrôle incorrect de la génération de code (Injection de Code)
Gravité : Critique
CWE : CWE-94
Description :
L'application passe des entrées utilisateur non fiables provenant des paramètres de requête HTTP (req.query, req.body) dans l'option parsingContext de la méthode vm.compileFunction() de Node.js. L'API vm.compileFunction() compile des chaînes en fonctions JavaScript, et bien que le corps du code puisse être fiable, fournir un contexte d'analyse contrôlé par l'utilisateur permet aux attaquants d'injecter des objets malveillants accessibles lors de la compilation et de l'exécution de la fonction. Le module vm ne fournit pas d'isolement de sécurité, et les attaquants peuvent manipuler le contexte d'analyse pour introduire une pollution de prototype, écraser des objets intégrés ou injecter du code par manipulation de contexte. Cela crée une vulnérabilité d'injection de code qui peut conduire à l'exécution de code à distance sur le serveur Node.js.
Remédiation :
Ne jamais passer d'entrées utilisateur à vm.compileFunction() ou à toute API du module vm. Le module vm ne fournit pas d'isolement de sécurité et ne doit jamais être utilisé avec des données non fiables. Si vous avez besoin de compiler des fonctions dynamiquement, assurez-vous que le code et le contexte d'analyse sont entièrement sous le contrôle de votre application sans influence utilisateur. Définissez le contexte d'analyse statiquement en utilisant uniquement des objets de confiance. Mieux encore, évitez complètement la compilation dynamique de fonctions - utilisez des fonctions JavaScript standard définies à l'heure de la compilation, ou implémentez un comportement dynamique par le biais d'une configuration sécurisée (objets JSON mappant les choix des utilisateurs à des fonctions prédéfinies). Pour tout scénario impliquant une logique personnalisable par l'utilisateur, repensez l'architecture pour utiliser une configuration déclarative au lieu de code exécutable, éliminant ainsi complètement le besoin d'APIs du module vm.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
règles_lgpl_javascript_eval_rule-vm-runincontext-injection¶
Résumé :
Contrôle inadéquat de la génération de code (Injection de code)
Gravité : Critique
CWE : CWE-94
Description :
L'application passe des entrées utilisateur non fiables provenant des paramètres de requête HTTP (req.query, req.body) dans l'objet de contexte passé à la méthode vm.runInContext() de Node.js. La fonction vm.runInContext() exécute du code dans un objet de contexte fourni, et lorsque ce contexte contient des données contrôlées par l'utilisateur, les attaquants peuvent injecter des objets ou des fonctions malveillants qui deviennent partie de l'environnement d'exécution. Le module vm ne fournit pas d'isolement de sécurité et est uniquement conçu pour séparer les portées globales de code de confiance. Les attaquants peuvent manipuler le contexte pour introduire une pollution de prototype, remplacer des objets et des fonctions intégrés, ou injecter du code exécutable déguisé en données. Cela crée une vulnérabilité critique d'injection de code permettant l'exécution de code à distance.
Remédiation :
Ne jamais passer des entrées utilisateur dans les objets de contexte de vm.runInContext() ou utiliser le module vm avec des données non fiables. Le module vm ne fournit aucun isolement de sécurité malgré la création de contextes séparés. Si vous devez fournir des données à l'exécution de code, définissez le contexte de manière statique avec uniquement des objets de confiance et n'incorporez jamais d'entrées utilisateur. Mieux encore, éliminez le besoin de vm.runInContext() en redesignant votre application pour éviter l'exécution de code dynamique. Utilisez des fonctions statiques et des contrôles de flux (instructions switch, cartes d'objets) pour implémenter un comportement dynamique en toute sécurité. Pour la configuration, utilisez des objets JSON qui sélectionnent des opérations sûres prédéfinies. Si vous utilisez vm.runInContext() pour évaluer des modèles ou des expressions, remplacez-le par des bibliothèques sûres dédiées conçues pour ces objectifs spécifiques.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
règles_lgpl_javascript_eval_rule-vm-runinnewcontext-injection¶
Résumé :
Contrôle inapproprié de la génération de code (Injection de Code)
Gravité : Critique
CWE : CWE-94
Description :
L'application passe des entrées utilisateur non fiables provenant des paramètres de requête HTTP (req.query, req.body) dans l'objet de contexte passé à la méthode vm.runInNewContext() de Node.js. La fonction vm.runInNewContext() crée un nouveau contexte V8 et exécute du code à l'intérieur, mais lorsque l'objet de contexte contient des données contrôlées par l'utilisateur, les attaquants peuvent injecter des objets, des fonctions ou des valeurs malveillantes qui deviennent partie intégrante de l'espace global pendant l'exécution. Le module vm ne fournit explicitement pas d'isolation de sécurité - il ne sépare que les espaces globaux à des fins organisationnelles. Les attaquants peuvent exploiter l'injection de contexte pour introduire une pollution de prototype, remplacer des fonctions essentielles intégrées ou injecter du code exécutable, entraînant une exécution de code à distance sur le serveur Node.js.
Remédiation :
N'utilisez jamais vm.runInNewContext() avec des objets de contexte contrôlés par l'utilisateur ou des données non fiables. Le module vm ne fournit pas de conteneur de sécurité et ne doit être utilisé qu'avec du code et des contextes entièrement fiables. Si vous devez exécuter du code avec des variables globales spécifiques, définissez l'objet de contexte statiquement sans entrée utilisateur. Idéalement, supprimez toute utilisation de vm.runInNewContext() et repensez votre application pour éviter complètement l'exécution dynamique de code. Implémentez un comportement dynamique par le biais de mécanismes sûrs comme les instructions switch qui sélectionnent parmi des fonctions prédéfinies, ou utilisez des objets de configuration (JSON) qui contrôlent la logique de l'application sans exécuter de code. Pour l'évaluation de modèles ou l'analyse d'expressions, utilisez des bibliothèques dédiées spécifiquement conçues à ces fins avec les contrôles de sécurité appropriés.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_eval_rule-vm2-code-injection¶
Résumé :
Contrôle inapproprié de la génération de code (Injection de code)
Gravité : Critique
CWE : CWE-94
Description :
L'application passe des entrées utilisateur non fiables provenant des paramètres de la requête HTTP (req.query, req.body) à la méthode run() du package vm2 ou au constructeur VMScript. La bibliothèque vm2 a été conçue pour fournir un environnement sécurisé pour l'exécution de code JavaScript non fiable, mais de nombreuses vulnérabilités critiques d'évasion de bac à sable ont été découvertes au fil des ans et elle est maintenant obsolète et non maintenue. Les attaquants peuvent exploiter des techniques d'évasion de bac à sable connues ou futures pour sortir de l'isolation de la VM et exécuter du code arbitraire sur le serveur Node.js avec des privilèges complets. Cela crée une vulnérabilité critique d'exécution de code à distance, et le package ne doit pas être utilisé à des fins de sécurité.
Remédiation :
Retirez immédiatement le package vm2 car il est obsolète, non maintenu et présente des vulnérabilités de sécurité connues. Ne pas exécuter le code JavaScript fourni par l'utilisateur dans les applications Node.js dans aucun cas. Si vous avez besoin de logique personnalisable par l'utilisateur, implémentez un langage spécifique à un domaine (DSL) sûr avec une syntaxe et des capacités limitées, ou utilisez une configuration déclarative basée sur JSON que les utilisateurs peuvent modifier. Pour les expressions mathématiques, envisagez des bibliothèques comme expr-eval avec une liste blanche stricte des opérations autorisées. Si l'exécution de code est absolument nécessaire pour votre cas d'utilisation, isolez-la dans des processus conteneurisés séparés avec des limites strictes de ressources, une isolation réseau, des systèmes de fichiers en lecture seule et aucun accès à des secrets ou données sensibles. Même avec l'isolation, évitez d'exécuter du code non fiable si une alternative de conception existe.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_eval_rule-vm2-context-injection¶
Résumé :
Contrôle inadéquat de la génération de code (Injection de code)
Gravité : Critique
CWE : CWE-94
Description :
L'application passe des entrées utilisateur non fiables provenant des paramètres de requête HTTP (req.query, req.body) dans l'objet de contexte du bac à sable lors de la création d'instances de VM ou NodeVM avec vm2. Cela permet aux attaquants d'injecter des objets ou des fonctions malveillants dans le contexte global du bac à sable, qui peuvent ensuite être accessibles et exécutés par le code s'exécutant dans la VM. En contrôlant le contexte du bac à sable, les attaquants peuvent introduire une pollution de prototype, remplacer des fonctions intégrées ou injecter du code malveillant qui semble faire partie de l'environnement de confiance. Associé aux vulnérabilités d'évasion bien connues du bac à sable de vm2 et à son statut obsolète, cela crée un risque critique d'exécution de code à distance où les attaquants peuvent manipuler l'environnement d'exécution et échapper au bac à sable.
Remédiation :
Retirez immédiatement le package vm2 car il est obsolète et non sécurisé. Ne laissez jamais les entrées utilisateur contrôler le contexte du bac à sable ou la portée globale de tout environnement d'exécution de code. Si vous devez fournir un contexte de bac à sable, définissez-le statiquement avec uniquement des objets et fonctions explicites et sûrs, sans incorporer de données fournies par l'utilisateur. Repensez complètement votre architecture pour éviter l'exécution de code fourni par l'utilisateur. Si les utilisateurs ont besoin d'un comportement personnalisable, mettez-le en œuvre par le biais de configurations déclaratives (schémas JSON définissant les opérations autorisées) plutôt que de code exécutable. Pour les systèmes de plugins ou d'extensibilité, utilisez une API bien définie où les plugins sont installés par des administrateurs, et non par des utilisateurs finaux, et sont validés avant déploiement. Toute architecture nécessitant l'exécution de code non fiable devrait être reconsidérée car elle ne peut fondamentalement pas être sécurisée dans Node.js.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_exec_rule-shelljs-os-command-exec¶
Résumé :
Neutralisation inappropriée des éléments spéciaux utilisés dans une commande OS ('Injection de commande OS')
Sévérité : Critique
CWE : CWE-78
Description :
Des données contrôlées par l'utilisateur sont passées directement à la fonction shelljs.exec(), qui exécute des commandes OS via un shell. Cela permet aux attaquants d'injecter des commandes shell arbitraires, pouvant entraîner une compromission complète du système. La bibliothèque shelljs offre un accès shell sans sanitisation adéquate des entrées, ce qui la rend extrêmement dangereuse lorsqu'elle est combinée avec des entrées non fiables.
Remédiation :
Envisagez d'éviter totalement la bibliothèque shelljs pour les opérations impliquant des entrées utilisateur, car elle procure un accès direct au shell. Il est recommandé d'utiliser child_process.execFile() intégré à Node.js avec un tableau d'arguments à la place, qui n'invoque pas de shell et traite les arguments comme des paramètres discrets. Si shelljs doit être utilisé, validez toutes les entrées utilisateur contre une liste d'autorisation stricte et ne permettez jamais des caractères spéciaux de shell comme ;, |, &, $ ou des accents graves.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_headers_rule-generic-header-injection¶
Résumé :
Neutralisation inadéquate des en-têtes HTTP pour la syntaxe de script
Sévérité : Critique
CWE : CWE-644
Description :
L'application utilise des entrées utilisateur non fiables provenant des propriétés de la requête (comme req.query, req.params ou req.body) directement dans les en-têtes de réponse HTTP via des méthodes Express.js comme res.set() ou Node.js res.writeHead() sans validation ou assainissement appropriés. Cela permet aux attaquants d'injecter des en-têtes HTTP arbitraires ou de réaliser des attaques par découpage de réponse en incluant des caractères de nouvelle ligne (séquences CRLF) dans l'entrée. Les vulnérabilités d'injection d'en-têtes peuvent entraîner de graves problèmes de sécurité, notamment la fixation de session, le cross-site scripting via des en-têtes injectés, l'empoisonnement de cache et le contournement d'authentification. Les attaquants peuvent manipuler des en-têtes comme Set-Cookie, Location ou Content-Type pour compromettre la sécurité de l'application et les données des utilisateurs.
Remédiation :
Envisagez de valider et d'assainir toutes les entrées utilisateur avant de les utiliser dans les en-têtes HTTP. Supprimez ou rejetez toute entrée contenant des caractères de nouvelle ligne (\r, \n) ou d'autres caractères de contrôle qui pourraient être utilisés pour l'injection d'en-têtes. Utilisez une approche par liste blanche pour valider que les valeurs des en-têtes correspondent aux modèles attendus, comme vérifier que les URL de redirection figurent sur une liste de domaines autorisés. Pour les applications Express.js, évitez d'utiliser directement les données de la requête dans les en-têtes - si vous devez définir des en-têtes dynamiques, utilisez une validation stricte comme value.replace(/[\\r\\n]/g, '') pour supprimer les caractères dangereux. Envisagez d'utiliser un middleware de sécurité comme Helmet.js qui offre une protection contre les attaques courantes basées sur les en-têtes. Pour les scénarios de redirection, utilisez une carte prédéfinie d'URL sûres plutôt que d'accepter des cibles de redirection arbitraires. Ne faites jamais confiance aux entrées utilisateur pour des en-têtes critiques en matière de sécurité tels que Content-Type, Set-Cookie ou les en-têtes CORS.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_jwt_rule-jwt-express-hardcoded¶
Résumé :
Identifiants insuffisamment protégés
Sévérité : Critique
CWE : CWE-522
Description :
Un secret JWT en dur a été détecté dans l'option de configuration secret passée au middleware expressjwt du paquet express-jwt. Le fait de coder en dur des secrets comme les clés de signature JWT représente un risque de sécurité significatif, car si le code source se retrouve dans un dépôt public, partagé avec des sous-traitants ou compromis par une violation de sécurité, le secret est exposé. Les attaquants pourraient alors utiliser ce secret pour générer des jetons falsifiés avec des revendications arbitraires et contourner totalement l'authentification, obtenant ainsi un accès non autorisé aux routes protégées de votre application Express.
Remédiation :
Envisagez de stocker le secret JWT dans une variable d'environnement et d'y accéder via process.env.JWT_SECRET dans l'objet de configuration expressjwt. Cela permet de garder le secret hors du contrôle de version et de permettre différents secrets par environnement de déploiement. Il est recommandé d'utiliser un service de gestion des secrets tel que AWS Secrets Manager, HashiCorp Vault ou Azure Key Vault pour les systèmes de production afin de stocker en toute sécurité les clés de signature JWT et de contrôler strictement l'accès. Pour le développement local, vous pouvez utiliser un fichier .env qui est ajouté à .gitignore et le charger avec le paquet dotenv au démarrage de l'application. Exemple : expressjwt({ secret: process.env.JWT_SECRET, algorithms: ['HS256'] }). Assurez-vous que le secret est aléatoire sur le plan cryptographique et d'au moins 256 bits (32 octets) de longueur pour HS256.
OWASP :
- A3:2017-Exposition de données sensibles
- A02:2021-Failles cryptographiques
rules_lgpl_javascript_jwt_rule-node-jwt-none-algorithm¶
Résumé :
Utilisation d'un algorithme cryptographique cassé ou risqué.
Gravité : Critique
CWE : CWE-327
Description :
L'algorithme none est spécifié dans les appels à jwt.sign() ou jwt.verify() du paquet jsonwebtoken. Utiliser none comme algorithme signifie que le JWT n'est pas signé et ne fournit aucune protection d'intégrité cryptographique. Les attaquants peuvent modifier facilement le contenu du token pour changer les identifiants d'utilisateur, les rôles, les permissions, ou toute autre affirmation, et l'application acceptera le token modifié comme valide. Cela contourne complètement les contrôles d'authentification et d'autorisation, permettant aux attaquants de se faire passer pour n'importe quel utilisateur ou d'escalader les privilèges en éditant simplement le contenu codé en Base64.
Remédiation :
Envisagez d’utiliser des algorithmes basés sur HMAC comme HS256, HS384 ou HS512 pour une signature symétrique avec un secret partagé, ou des algorithmes RSA/ECDSA comme RS256, ES256 pour une signature asymétrique avec des paires de clés publique/privée. Il est recommandé d'utiliser HS256 pour la plupart des applications car il offre une sécurité forte avec de bonnes performances et une gestion de clé plus simple. Pour les systèmes où le vérificateur du token ne doit pas avoir accès aux capacités de signature, vous pouvez utiliser RS256 avec des clés RSA. Exemple : jwt.sign(payload, secret, { algorithm: 'HS256' }) et jwt.verify(token, secret, { algorithms: ['HS256'] }). Lors de l'appel à jwt.verify(), spécifiez toujours explicitement les algorithmes autorisés dans l'option du tableau algorithms pour éviter les attaques de confusion d'algorithmes. Ne jamais autoriser l'algorithme none dans le tableau algorithms pour la vérification.
OWASP :
- A3:2017-Exposition de Données Sensibles
- A02:2021-Failles Cryptographiques
rules_lgpl_javascript_redirect_rule-express-open-redirect¶
Résumé :
Redirection d'URL vers un site non fiable 'redirection ouverte'
Gravité : Critique
CWE : CWE-601
Description :
L'application passe des entrées utilisateur non vérifiées à la méthode res.redirect() d'Express sans validation. Cela crée une vulnérabilité de redirection ouverte où des attaquants peuvent concevoir des URL qui redirigent les victimes vers des sites malveillants tout en apparaissant provenir de l'application légitime. Les attaquants exploitent cela pour mener des attaques de phishing, voler des identifiants ou contourner des contrôles de sécurité qui font confiance aux redirections depuis votre domaine.
Remédiation :
Envisagez de valider les URL de redirection par rapport à une liste autorisée de destinations permises avant de les passer à res.redirect(). Il est recommandé de vérifier si l'URL est relative (commence par / mais pas //) ou correspond à des domaines approuvés en utilisant l'analyse d'URL. Évitez d'utiliser directement les entrées utilisateur provenant des paramètres de requête ou des corps de requête pour les redirections. Si des redirections dynamiques sont nécessaires, mettez en œuvre une validation stricte : analysez l'URL, vérifiez le nom d'hôte par rapport aux domaines de confiance et rejetez toutes les URL avec des protocoles ou des motifs inattendus.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_redirect_rule-express-open-redirect2¶
Résumé :
Redirection URL vers un site non fiable 'redirection ouverte'
Sévérité : Critique
CWE : CWE-601
Description :
Des entrées utilisateur non fiables sont utilisées dans les méthodes de réponse d'Express telles que res.location(), res.redirect(), ou les en-têtes HTTP (location, set(), setHeader()), ce qui peut entraîner une vulnérabilité de redirection ouverte. Les attaquants peuvent concevoir des URL malveillantes qui redirigent les victimes vers des sites de phishing ou des domaines sous le contrôle de l'attaquant pour voler des informations d'identification ou des jetons de session.
Remédiation :
Envisagez de valider toutes les URL de redirection contre une liste autorisée de destinations permises avant d'effectuer les redirections. Il est recommandé de définir un ensemble d'URL autorisées et d'utiliser allowedUrls.includes(url) pour vérifier que la cible est sûre. Évitez d'utiliser les entrées utilisateur directement dans res.redirect(), res.location(), ou les en-têtes Location. Si les URL fournies par l'utilisateur sont nécessaires, assurez-vous d'une validation stricte et envisagez d'utiliser uniquement des chemins relatifs dans votre application.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_ssrf_rule-phantom-ssrf¶
Résumé :
Falsification de requêtes côté serveur (SSRF)
Gravité : Critique
CWE : CWE-918
Description :
Cette règle a détecté des entrées contrôlées par l'utilisateur transmises aux méthodes d'automatisation du navigateur PhantomJS, y compris page.open(), page.setContent(), page.openUrl(), page.evaluateJavaScript(), et page.property('content') sans validation. Lorsque les entrées de l'utilisateur contrôlent les URLs chargées par des instances de navigateur sans tête, des vulnérabilités de falsification de requêtes côté serveur (SSRF) apparaissent, permettant aux attaquants de forcer le navigateur côté serveur à accéder à des ressources internes, des points de terminaison de métadonnées cloud ou des pages web arbitraires. Cela peut exposer des API internes, des interfaces administratives, ou permettre des attaques à travers le contexte d'automatisation du navigateur qui contournent les restrictions réseau.
Remédiation :
Envisagez de mettre en œuvre une liste blanche d'URLs stricte qui valide les entrées des utilisateurs par rapport aux domaines approuvés avant de transmettre des URLs aux méthodes PhantomJS. La validation des URLs doit vérifier le schéma, le nom d'hôte et le port pour prévenir les contournements. Limitez les protocoles autorisés à http:// et https:// uniquement, en niant explicitement file://, javascript://, data://, et d'autres schémas dangereux qui pourraient permettre un accès aux fichiers locaux ou l'exécution de code. Pour les scénarios de navigateur sans tête, mettez en œuvre un sandboxing supplémentaire en exécutant PhantomJS dans un environnement réseau restreint avec un filtrage sortant pour bloquer l'accès aux plages IP internes (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) et aux points de terminaison de métadonnées cloud (169.254.169.254). Envisagez d'utiliser une approche de mappage côté serveur où l'entrée utilisateur fournit des clés qui correspondent à des URLs pré-approuvées plutôt que d'accepter directement des URLs arbitraires.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_ssrf_rule-playwright-ssrf¶
Résumé :
Falsification de requête côté serveur (SSRF)
Gravité : Critique
CWE : CWE-918
Description :
Cette règle a détecté des entrées contrôlées par l'utilisateur étant transmises aux méthodes d'automatisation du navigateur Playwright, y compris page.goto(), page.setContent(), page.evaluate(), page.evaluateHandle(), page.evaluateOnNewDocument(), et context.addInitScript() sans validation. Lorsque l'input de l'utilisateur contrôle des URL ou des scripts chargés par des instances de navigateur sans interface graphique, des vulnérabilités de falsification de requête côté serveur (SSRF) peuvent survenir, permettant aux attaquants de forcer le navigateur côté serveur à accéder à des ressources internes, à des points de terminaison de métadonnées cloud, ou à exécuter du JavaScript arbitraire. Cela peut exposer des API internes, des interfaces administratives, ou permettre des attaques via le contexte d'automatisation du navigateur qui contournent les restrictions réseau et les frontières de sécurité.
Remédiation :
Envisagez de mettre en œuvre une liste d'URL autorisées stricte qui valide l'entrée utilisateur contre des domaines approuvés avant de transmettre les URL aux méthodes Playwright. La validation des URL doit vérifier le schéma, le nom d'hôte et le port pour prévenir les contournements. Limitez les protocoles autorisés à http:// et https:// uniquement, en niant explicitement file://, javascript://, data://, et d'autres schémas dangereux qui pourraient permettre l'accès à des fichiers locaux ou l'exécution de code. Pour les scénarios de navigateur sans interface graphique, mettez en œuvre un sablage supplémentaire en configurant Playwright avec interception des requêtes réseau en utilisant page.route() pour bloquer les requêtes vers des plages d'adresses IP internes (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) et des points de terminaison de métadonnées cloud (169.254.169.254). Envisagez de faire fonctionner Playwright dans des environnements conteneurisés avec un accès réseau restreint et un filtrage des sorties. Utilisez une approche de mappage côté serveur où l'input utilisateur fournit des clés qui mappent à des URL pré-approuvées plutôt que d'accepter directement des URL arbitraires.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_ssrf_rule-puppeteer-ssrf¶
Résumé :
Falsification de requête côté serveur (SSRF)
Gravité : Critique
CWE : CWE-918
Description :
Cette règle a détecté des entrées contrôlées par l'utilisateur transmises aux méthodes d'automatisation du navigateur Puppeteer, y compris page.goto(), page.setContent(), page.evaluate(), page.evaluateHandle(), et page.evaluateOnNewDocument() sans validation. Lorsque l'entrée de l'utilisateur contrôle des URL ou des scripts chargés par des instances de navigateur sans tête, des vulnérabilités de Falsification de Requête Côté Serveur (SSRF) apparaissent, permettant aux attaquants de forcer le navigateur côté serveur à accéder à des ressources internes, à des points de terminaison de métadonnées cloud ou à exécuter du JavaScript arbitraire. Cela peut exposer des API internes, des interfaces d'administration, ou permettre des attaques via le contexte d'automatisation du navigateur qui contourne les restrictions réseau et les frontières de sécurité.
Remédiation :
Envisagez de mettre en œuvre une liste d'autorisation d'URL stricte qui valide l'entrée de l'utilisateur contre des domaines approuvés avant de transmettre les URL aux méthodes Puppeteer. La validation des URL doit vérifier le schéma, le nom d'hôte, et le port pour prévenir les contournements. Restreignez les protocoles autorisés à http:// et https:// uniquement, en niant explicitement file://, javascript://, data://, et d'autres schémas dangereux qui pourraient permettre l'accès aux fichiers locaux ou l'exécution de code. Pour les scénarios de navigateur sans tête, mettez en œuvre un sandboxing supplémentaire en configurant Puppeteer avec l'interception des requêtes réseau utilisant page.setRequestInterception(true) et des gestionnaires page.on('request') pour bloquer les requêtes vers les plages d'IP internes (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) et les points de terminaison de métadonnées cloud (169.254.169.254). Envisagez d'exécuter Puppeteer dans des environnements conteneurisés avec un accès réseau restreint et un filtrage sortant. Utilisez une approche de mappage côté serveur où l'entrée de l'utilisateur fournit des clés qui correspondent à des URL pré-approuvées plutôt que d'accepter directement des URL arbitraires.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_ssrf_rule-wkhtmltopdf-ssrf¶
Résumé :
Falsification de demande côté serveur (SSRF)
Gravité : Critique
CWE : CWE-918
Description :
Cette règle a détecté des URL contrôlées par l'utilisateur passées à la fonction wkhtmltopdf()
sans validation. La bibliothèque wkhtmltopdf utilise un moteur WebKit sans tête
pour convertir des pages web en documents PDF, et lorsque l'entrée utilisateur contrôle le
paramètre d'URL, des vulnérabilités de falsification de demande côté serveur (SSRF) apparaissent.
Les attaquants peuvent en profiter pour forcer le serveur à accéder à des ressources internes,
à des points de métadonnées cloud (169.254.169.254) ou à scanner des services réseau internes.
Cela peut exposer des APIs internes, des interfaces administratives, des fichiers sensibles via
des URL file://, ou permettre une cartographie réseau qui contourne les protections de pare-feu
et la segmentation de réseau.
Remédiation :
Envisagez de mettre en œuvre une liste blanche d'URL strictes qui valide l'entrée utilisateur
contre des domaines approuvés avant de passer des URL à wkhtmltopdf(). Utilisez le
parsing d'URL de Node.js avec new URL() pour valider le schéma, le nom d'hôte, et le port,
et rejetez toutes les URL qui ne correspondent pas à la liste blanche. Restreignez les protocoles
autorisés à http:// et https:// uniquement, en interdisant explicitement file://, data://, et
d'autres schémas dangereux qui pourraient permettre un accès aux fichiers locaux. Implémentez une
protection contre le rebinding DNS en résolvant les noms d'hôtes en adresses IP et en bloquant
les plages IP privées (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
et les adresses de métadonnées cloud (169.254.169.254). Les défenses au niveau réseau peuvent
inclure l'exécution de wkhtmltopdf dans un environnement sandboxé avec des règles de filtrage
d'egress pour empêcher les connexions aux réseaux internes. Envisagez d'utiliser une approche de
mapping côté serveur où l'entrée utilisateur fournit des clés qui correspondent à des URL sûres préconfigurées,
plutôt que d'accepter des URL arbitraires.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_xml_rule-node-entity-expansion¶
Résumé :
Restriction inappropriée des références d'entités récursives dans les DTD (Expansion d'entité XML)
Gravité : Critique
CWE : CWE-776
Description :
L'application transmet des données contrôlées par l'utilisateur à une instance de expat.Parser() via la méthode write() sans contrôles appropriés du traitement des entités. Cela expose l'application à des attaques par expansion d'entité XML (également connues sous le nom d'attaques Billion Laughs), où un XML malveillant avec des définitions d'entités récursives peut épuiser les ressources système et provoquer une déni de service.
Remédiation :
Envisagez de désactiver le traitement des entités externes et la validation des DTD lors de l'analyse de XML non fiable. Il est recommandé de configurer le parseur pour rejeter les documents contenant des déclarations d'entité à l'aide d'options de parseur. Pour le parseur expat, évitez de traiter directement les entrées utilisateur ou implémentez une validation stricte des entrées avant l'analyse. Envisagez d'utiliser des bibliothèques de parsing XML plus sûres qui désactivent par défaut les fonctionnalités dangereuses, ou de sanitiser l'entrée XML pour supprimer les déclarations d'entité avant l'analyse.
OWASP :
- A4:2017-Entités externes XML (XXE)
- A05:2021-Misconfiguration de sécurité
rules_lgpl_javascript_xml_rule-node-xpath-injection¶
Résumé :
Neutralisation incorrecte des données dans les expressions XPath (Injection XPath)
Sévérité : Critique
CWE : CWE-643
Description :
L'application transmet directement les entrées utilisateur non fiables à xpath.parse() sans validation ou assainissement appropriés. Cela crée une vulnérabilité d'injection XPath où les attaquants peuvent concevoir des expressions XPath malveillantes pour accéder à des données non autorisées dans des documents XML, contourner les contrôles d'accès ou extraire des informations sensibles. L'analyse de contamination a détecté des entrées utilisateur circulant des objets de requête vers l'analyse XPath.
Remédiation :
Envisagez d'utiliser des requêtes XPath paramétrées si votre bibliothèque XML les prend en charge, afin de séparer la structure de la requête des données utilisateur. Il est recommandé de valider les entrées utilisateur par rapport à une liste d'autorisation stricte des expressions XPath ou des composants de requête autorisés avant l'analyse. Évitez la concaténation de chaînes lors de la construction de requêtes XPath. Si des requêtes dynamiques sont nécessaires, mettez en œuvre une validation des entrées pour rejeter les caractères XPath spéciaux tels que /, [, ], ' et les fonctions.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_xml_rule-node-xxe¶
Résumé :
Restriction inadéquate de la référence à l'entité externe XML
Gravité : Critique
CWE : CWE-611
Description :
L'application utilise les fonctions libxmljs parseXmlString(), parseXml(),
SaxParser.parseString() ou SaxPushParser.push() pour traiter des données XML contrôlées par l'utilisateur à partir des paramètres de requête HTTP sans désactiver le traitement des entités externes, la rendant vulnérable aux attaques par entités externes XML (XXE). Lorsque le parseur libxmljs traite des entrées XML non fiables provenant de paramètres de requête ou de corps de requête avec le support des entités externes activé par défaut, des attaquants peuvent en profiter pour lire des fichiers arbitraires à partir du système de fichiers du serveur, effectuer des attaques SSRF contre des services réseau internes, exfiltrer des données sensibles par le biais de canaux hors bande, ou provoquer une déni de service par le biais d'attaques par milliard de ricanements et d'expansion d'entités.
Remédiation :
Configurez libxmljs pour désactiver la résolution d'entités externes en passant { noent: false, dtdload: false, dtdvalid: false } comme paramètre d'options aux fonctions de parsing. La définition de noent: false empêche la substitution d'entités, tandis que dtdload: false et dtdvalid: false désactivent entièrement le chargement et la validation des DTD. Cela empêche les attaques XXE, les vulnérabilités d'expansion d'entités, et les attaques DoS par milliard de ricanements. Envisagez de migrer vers des parseurs XML activement maintenus comme fast-xml-parser avec des configurations par défaut sécurisées. Exemple : libxmljs.parseXml(xmlString, { noent: false, dtdload: false, dtdvalid: false }); Pour les utilisateurs de node-expat, envisagez d'utiliser xmldom ou fast-xml-parser à la place, car ils offrent de meilleurs paramètres de sécurité par défaut. Des conseils supplémentaires sont disponibles à
https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html
OWASP :
- A4:2017-Entités Externes XML (XXE)
- A05:2021-Mauvaise Configuration de Sécurité
rules_lgpl_javascript_xml_rule-xxe-expat¶
Résumé :
Restriction inappropriée de la référence à une entité externe XML
Gravité : Critique
CWE : CWE-611
Description :
L'application utilise le constructeur Parser() du module node-expat et les méthodes parse() ou write() pour traiter des données XML contrôlées par l'utilisateur à partir des paramètres de requête HTTP sans désactiver le traitement des entités externes, la rendant vulnérable aux attaques par entités externes XML (XXE). Lorsque le parseur expat traite des entrées XML non fiables provenant de paramètres de requête ou de corps de requête avec le support des entités externes activé par défaut, les attaquants peuvent exploiter cela pour lire des fichiers arbitraires sur le serveur, effectuer des attaques SSRF vers des points de terminaison internes, exfiltrer des données sensibles ou provoquer un déni de service via des attaques d'expansion d'entités telles que le trillion de rires et l'explosion quadratique.
Remédiation :
Le parseur node-expat ne fournit pas d'options intégrées pour désactiver le traitement des entités externes, le rendant intrinsèquement dangereux pour le traitement d'entrées XML non fiables. Il est recommandé de migrer vers des bibliothèques de parsing XML plus sûres comme fast-xml-parser (qui a des valeurs par défaut sécurisées), xmldom avec une configuration appropriée, ou sax avec la résolution des entités externes désactivée. Si vous devez utiliser node-expat, mettez en œuvre une validation stricte des entrées pour rejeter tout XML contenant des déclarations DOCTYPE ou des références d'entités avant le parsing. Exemple avec fast-xml-parser : const parser = new XMLParser({ processEntities: false, allowBooleanAttributes: true }); const result = parser.parse(xmlString); Instructions supplémentaires disponibles à l'adresse
https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html
OWASP :
- A4:2017-Entités externes XML (XXE)
- A05:2021-Misconfiguration de sécurité
rule-js-ts-child-process-exec-injection¶
Résumé :
Injection de commandes utilisant exec() de child_process
Sévérité : Élevée
CWE : CWE-78
Description :
Les entrées contrôlées par l'utilisateur sont passées directement à la fonction child_process.exec(), qui exécute des commandes via un shell système. Cela permet aux attaquants d'injecter des commandes shell arbitraires en utilisant des métacaractères tels que ;, |, &, ou $(), ce qui peut potentiellement mener à une exécution de code à distance. La fonction exec() est intrinsèquement dangereuse car elle lance un shell pour interpréter l'ensemble de la chaîne de commandes.
Remédiation :
Envisagez d'utiliser child_process.execFile() au lieu de exec(), qui ne lance pas de shell et traite les arguments comme des paramètres discrets. Il est recommandé de passer la commande et les arguments comme des éléments de tableau séparés, par exemple execFile('commande', [arg1, arg2]), pour prévenir les injections shell. Si exec() doit être utilisé, validez toutes les entrées utilisateur contre une liste blanche stricte et ne concaténez jamais les données utilisateur dans les chaînes de commandes.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
règles_lgpl_javascript_database_rule-sequelize-tls-cert-validation¶
Résumé :
Validation de certificat incorrecte
Gravité : Élevée
CWE : CWE-295
Description :
La configuration de la connexion à la base de données Sequelize définit dialectOptions.ssl.rejectUnauthorized: false, ce qui désactive la validation du certificat TLS pour les connexions MySQL, MariaDB ou PostgreSQL. Cela annule tout le but du chiffrement TLS car cela permet aux attaquants de présenter des certificats auto-signés ou invalides lors d’attaques de l'homme du milieu (MITM) sans déclencher d'avertissements. La connexion semblera chiffrée mais ne fournit aucune assurance que le client communique avec le véritable serveur de base de données, rendant les identifiants et les données vulnérables à l'interception.
Remédiation :
Envisagez de supprimer complètement le paramètre rejectUnauthorized: false et de configurer plutôt une validation correcte des certificats en fournissant le certificat CA du serveur de base de données avec dialectOptions: { ssl: { ca: fs.readFileSync('/path/to/server-ca.pem') } }. Pour les fournisseurs de bases de données dans le cloud, téléchargez le bundle de certificats racines de votre fournisseur (AWS RDS, Azure Database, Google Cloud SQL les fournissent tous) et référencez-le dans la configuration SSL. Il est recommandé d'utiliser l'option require en plus d'une configuration CA appropriée pour appliquer TLS et rejeter les certificats non autorisés. Si vous utilisez des certificats auto-signés en développement, maintenez des fichiers de configuration distincts pour les environnements de développement et de production plutôt que de désactiver la validation globalement. Pour le développement local, envisagez d'utiliser des certificats correctement signés de Let's Encrypt ou de configurer une autorité de certification locale plutôt que de désactiver ce contrôle de sécurité critique.
OWASP :
- A3:2017-Exposition de données sensibles
- A02:2021-Failles cryptographiques
rules_lgpl_javascript_eval_rule-eval-nodejs¶
Résumé :
Neutralisation incorrecte des directives dans le code évalué dynamiquement ('Injection Eval')
Sévérité : Élevée
CWE : CWE-95
Description :
L'application transmet des données contrôlées par l'utilisateur provenant des paramètres de requête HTTP (req.query, req.body) directement à des fonctions d'exécution de code dangereux telles que eval(), le constructeur Function(), ou des appels basés sur des chaînes de caractères à setTimeout()/setInterval(). Ces fonctions JavaScript exécutent du code arbitraire à l'exécution dans le contexte du serveur Node.js, permettant aux attaquants d'exécuter des commandes système, d'accéder au système de fichiers, de voler des variables d'environnement contenant des secrets, ou de compromettre complètement le serveur. Il s'agit d'une vulnérabilité critique d'injection côté serveur qui peut entraîner une exécution de code à distance complète.
Remédiation :
Ne jamais transmettre l'entrée utilisateur directement aux fonctions d'exécution de code dans les applications Node.js. Supprimez complètement les appels à eval(), au constructeur Function() et aux fonctions de minuterie basées sur des chaînes, en les remplaçant par des alternatives plus sûres qui n'exécutent pas de code arbitraire. Pour un accès dynamique aux propriétés, utilisez la notation entre crochets combinée avec une liste blanche stricte pour valider les clés. Pour le parsing des données, utilisez JSON.parse() au lieu de eval(). Pour les rappels de minuterie, transmettez des références de fonction au lieu de chaînes. Si vous devez exécuter une logique dynamique basée sur l'entrée utilisateur, utilisez une instruction switch ou une carte d'objet pour sélectionner parmi les opérations sûres prédéfinies. Mettez en œuvre une validation des entrées à la frontière de l'application, rejetant toute requête avec des paramètres inattendus. Envisagez d'utiliser des outils d'analyse statique et des linters configurés pour interdire l'utilisation de fonctions dangereuses dans tout votre code.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_jwt_rule-hardcoded-jwt-secret¶
Résumé :
Utilisation de crédentiels en dur
Sévérité : Élevée
CWE : CWE-798
Description :
Un secret JWT ou une clé privée codée en dur a été détecté dans les appels à jwt.sign() ou jwt.verify() du package jsonwebtoken, ou dans les méthodes SignJWT.sign() et jwtVerify() du package jose. La codification de secrets comme les clés de signature JWT représente un risque de sécurité important, car si le code source finit dans un repository public ou est compromis, le secret est exposé. Les attaquants pourraient alors utiliser le secret pour générer des tokens forgés avec des assertions arbitraires et obtenir un accès non autorisé au système.
Remédiation :
Envisagez d'utiliser des variables d'environnement pour stocker le secret JWT et y accéder via process.env.SECRET au lieu de coder la valeur directement dans le code source. Cela maintient le secret à l'extérieur du contrôle de version et permet d'utiliser différents secrets par environnement de déploiement. Pour les systèmes de production, il est recommandé d'utiliser un service de gestion des secrets comme AWS Secrets Manager, HashiCorp Vault ou Azure Key Vault pour stocker de manière sécurisée et contrôler étroitement l'accès aux clés de signature JWT. Pour le développement local, vous pouvez utiliser un fichier .env qui est ajouté à .gitignore et le charger avec le package dotenv pour accéder aux secrets depuis process.env. Exemple : const token = jwt.sign(payload, process.env.SECRET, { algorithm: 'HS256' });
OWASP :
- A3:2017-Exposition de données sensibles
- A02:2021-Failles cryptographiques
règles_lgpl_javascript_jwt_rule-jwt-exposed-credentials¶
Résumé :
Identifiants insuffisamment protégés
Gravité : Élevée
CWE : CWE-522
Description :
L'application stocke un mot de passe dans la charge utile du token JWT passé à
jwt.sign() du paquet jsonwebtoken ou au constructeur SignJWT()
du paquet jose. Le stockage de mots de passe dans les charges utiles de tokens JWT est une pratique peu sécurisée qui peut entraîner la compromission des identifiants, car les charges utiles JWT ne sont que codées en Base64, pas chiffrées. Le mot de passe transmis dans la charge utile JWT est donc visible pour quiconque intercepte le token ou a accès à un stockage côté client où les tokens sont souvent conservés. Les attaquants peuvent facilement décoder le Base64 sans clé secrète et extraire le mot de passe en texte clair.
Remédiation :
Envisagez de stocker uniquement des identifiants utilisateurs non sensibles dans les charges utiles JWT, tels que des ID d'utilisateurs, des noms d'utilisateur ou des adresses e-mail qui correspondent à des identifiants stockés de manière sécurisée sur le serveur. Il est recommandé de ne jamais inclure de mots de passe, de clés API, de tokens secrets ou d'autres identifiants sensibles dans les revendications JWT. Si vous avez besoin de transmettre des données sensibles, vous pouvez utiliser JWT chiffré (JWE) avec la classe CompactEncrypt du paquet jose, bien que cela ajoute de la complexité et qu'il soit toujours préférable d'éviter d'envoyer des identifiants dans les tokens. Pour les flux d'authentification, le token lui-même sert de preuve d'identité après la première connexion, donc il n'est pas nécessaire d'inclure le mot de passe dans les requêtes suivantes. Exemple de charge utile sécurisée : { user_id: 123, username: 'john_doe', role: 'admin' }
OWASP :
- A3:2017-Exposition de Données Sensibles
- A02:2021-Échecs Cryptographiques
rules_lgpl_javascript_jwt_rule-jwt-exposed-data¶
Résumé :
Identifiants insuffisamment protégés
Sévérité : Élevée
CWE : CWE-522
Description :
Les entrées contrôlées par l'utilisateur sont passées directement au
méthode JWT.sign() du package jose sans validation ni filtrage. Les charges utiles JWT ne sont que codées en Base64, et non chiffrées, donc toutes les données incluses dans le jeton sont visibles
par quiconque peut y accéder. Si des informations sensibles comme des mots de passe, des clés API, des numéros de sécurité sociale ou d'autres données confidentielles sont présentes dans l'objet d'entrée, elles seront exposées par la charge utile du jeton JWT et lisibles
par les attaquants qui interceptent ou accèdent au jeton.
Remédiation :
Envisagez de construire explicitement la charge utile JWT avec uniquement les champs non sensibles spécifiques nécessaires, plutôt que de passer directement des objets utilisateur entiers ou des paramètres de requête à JWT.sign(). Il est recommandé de créer une liste autorisée de déclarations sûres comme l'ID utilisateur, le nom d'utilisateur, l'e-mail et le rôle, puis de copier uniquement ces propriétés spécifiques dans l'objet de charge utile. Vous pouvez utiliser la destructuration d'objet pour extraire les champs sûrs : const payload = { user_id: input.id, username: input.username, role: input.role };. Si vous devez inclure des données plus dynamiques, envisagez de valider et de sanitiser d'abord l'entrée et d'exclure explicitement les champs sensibles comme les mots de passe, les jetons ou les informations personnelles. Pour des données véritablement sensibles qui doivent être dans un jeton, vous pouvez utiliser le JWT chiffré (JWE) avec le package jose, bien que cela ajoute de la complexité.
OWASP :
- A3:2017-Exposition de données sensibles
- A02:2021-Failles cryptographiques
rules_lgpl_javascript_jwt_rule-jwt-not-revoked¶
Résumé :
Identifiants insuffisamment protégés
Gravité : Élevée
CWE : CWE-522
Description :
Aucun mécanisme de révocation des jetons n'est configuré dans le middleware expressjwt du package express-jwt. Sans la fonction de rappel isRevoked, les jetons JWT restent valides jusqu'à leur expiration basée sur leur revendication exp, même s'ils sont compromis, divulgués ou si l'utilisateur se déconnecte. Cela signifie qu'un attaquant qui obtient un jeton valide peut continuer à l'utiliser pour accéder à des routes protégées jusqu'à ce que le jeton expire naturellement, potentiellement des heures ou des jours plus tard, et il n'y a aucun moyen d'invalider le jeton côté serveur.
Remédiation :
Envisagez d'implémenter la fonction de rappel isRevoked dans la configuration expressjwt pour vérifier si un jeton a été révoqué avant de l'accepter. La fonction de rappel devrait interroger une liste de révocation (comme un ensemble Redis, une table de base de données ou un cache en mémoire) contenant les ID de jetons révoqués ou les revendications JTI. Il est recommandé de stocker la revendication jti (ID JWT) du jeton dans votre magasin de révocation lorsque les utilisateurs se déconnectent ou lorsque les jetons sont compromis. La fonction isRevoked reçoit la demande et la charge utile du jeton, et doit retourner true si le jeton est révoqué. Exemple : expressjwt({ secret: 'secret', algorithms: ['HS256'], isRevoked: async (req, token) => { return await redisClient.sIsMember('revoked_tokens', token.payload.jti); } }). Gardez à l'esprit que cela ajoute une recherche dans la base de données/cache à chaque requête authentifiée, donc des considérations de performance s'appliquent.
OWASP :
- A3:2017-Exposition de données sensibles
- A02:2021-Failles cryptographiques
rules_lgpl_javascript_ssrf_rule-node-ssrf¶
Résumé :
Usurpation de requêtes côté serveur (SSRF)
Gravité : Élevée
CWE : CWE-918
Description :
Cette règle a détecté des URL contrôlées par l'utilisateur étant passées aux bibliothèques client HTTP de Node.js, y compris axios.get(), axios.post(), fetch(), http.get(), http.request(), needle(), request(), urllib.request(), superagent.get(), bent(), got.get(), net.connect(), et socket.io-client.io(). Lorsque l'entrée de l'utilisateur contrôle l'URL de destination des requêtes HTTP sans validation, des vulnérabilités d'Usurpation de Requêtes Côté Serveur (SSRF) apparaissent. Le SSRF permet aux attaquants de forcer le serveur à faire des requêtes vers des systèmes internes, des points de terminaison de métadonnées cloud (comme 169.254.169.254) ou d'autres destinations non autorisées. Cela peut exposer des API internes, des bases de données, des panneaux d'administration, ou permettre des scans de réseau et des attaques de pivot qui contournent les règles de pare-feu et la segmentation du réseau.
Remédiation :
Envisagez de mettre en œuvre une liste d'URL autorisées stricte qui valide l'entrée utilisateur par rapport à un ensemble prédéfini de domaines sûrs avant de faire des requêtes HTTP. La validation des URL doit analyser l'URL complète y compris le schéma, le nom d'hôte, et le port pour empêcher les contournements à travers des divergences d'analyse d'URL. Refusez les protocoles dangereux tels que file://, gopher://, ftp://, et dict:// en ne permettant que http:// et https://. Implémentez une protection contre le rebinding DNS en résolvant les noms d'hôte en adresses IP et en rejetant les plages d'adresses IP privées (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) et les adresses de métadonnées cloud (169.254.169.254). Les défenses au niveau du réseau peuvent inclure la configuration de règles de filtrage des egress pour restreindre les connexions sortantes depuis le serveur d'application, ou le routage de toutes les requêtes client HTTP via un proxy surveillé avec filtrage des requêtes. Lorsque des URL absolues doivent être acceptées, envisagez d'utiliser une approche de mapping côté serveur où l'entrée utilisateur fournit une clé qui correspond à des URL sûres préconfigurées au lieu d'accepter directement les URL. Pour plus d'informations, consultez OWASP : Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html
OWASP :
- A1:2017-Injection
- A03:2021-Injection
javascript_buf_rule-buffer-noassert-read¶
Résumé :
Lecture hors limites
Gravité : Moyenne
CWE : CWE-125
Description :
L'application utilise les méthodes de lecture de Buffer de Node.js telles que readUInt8(), readInt32LE(), readInt32BE(), readFloatLE(), ou readDoubleLE() avec le paramètre noAssert réglé sur true. Cela désactive le contrôle des limites et pourrait entraîner une lecture au-delà de la fin du buffer, menant à un accès mémoire hors limites. Lorsque noAssert est réglé sur true, ces méthodes ne vérifient pas que le décalage est dans les limites du buffer, permettant des lectures au-delà de la zone mémoire allouée. Cela peut provoquer un comportement indéfini, des plantages de l'application ou des exploits de sécurité potentiels où des attaquants pourraient lire des données sensibles à partir de régions de mémoire adjacentes.
Remédiation :
Envisagez de supprimer le paramètre noAssert ou de le régler explicitement sur false pour activer le contrôle automatique des limites sur toutes les opérations de lecture de Buffer. Le runtime Node.js lancera une RangeError si le décalage est hors limites, empêchant l'accès mémoire hors limites. Il est recommandé de valider les décalages avant d'effectuer des opérations de lecture en vérifiant que le décalage plus la taille de lecture ne dépasse pas la longueur du buffer (par exemple, if (offset + 4 <= buffer.length)). Pour les codes critiques en termes de performance où le coût du contrôle des limites est une préoccupation, validez manuellement les décalages à l'avance plutôt que de désactiver complètement le contrôle des limites. Enveloppez toujours les opérations de Buffer dans des blocs try-catch pour gérer gracieusement toute exception RangeError qui pourrait se produire pendant l'exécution.
OWASP :
- A6:2017-Mauvaise Configuration de Sécurité
- A05:2021-Mauvaise Configuration de Sécurité
javascript_buf_rule-buffer-noassert-write¶
Résumé :
Écriture hors limites
Sévérité : Moyenne
CWE : CWE-787
Description :
L'application utilise des méthodes d'écriture du Buffer Node.js telles que writeUInt8(),
writeInt32LE(), writeInt32BE(), writeFloatLE(), ou writeDoubleLE() avec
le paramètre noAssert défini sur true. Cela désactive la vérification des limites et pourrait
résulter en une écriture au-delà de la fin du buffer, entraînant une corruption de la mémoire et
des vulnérabilités de sécurité. Lorsque noAssert est défini sur true, ces méthodes ne
vérifient pas que le décalage est dans les limites du buffer, permettant des écritures au-delà de la
zone mémoire allouée. Cela peut causer un comportement indéfini, corrompre des structures de données
adjacentes, faire planter l'application, ou créer des conditions exploitables où
des attaquants pourraient écraser des régions critiques de la mémoire.
Remédiation :
Envisagez de supprimer le paramètre noAssert ou de le définir explicitement sur false
pour activer la vérification automatique des limites lors de toutes les opérations d'écriture sur le Buffer. L'exécution Node.js lancera une exception RangeError si le décalage est hors des limites, empêchant
la corruption de la mémoire. Il est recommandé de valider les décalages avant d'effectuer des opérations d'écriture en vérifiant que le décalage plus la taille d'écriture ne dépasse pas
la longueur du buffer (par exemple, if (offset + 4 <= buffer.length)). Pour
des chemins de code sensibles aux performances où le coût de la vérification des limites est un enjeu,
envisagez de valider manuellement les décalages une fois au début plutôt que de désactiver complètement la vérification des limites. Enveloppez toujours les opérations d'écriture du Buffer dans des blocs try-catch pour gérer
gracieusement toute exception RangeError pouvant survenir à l'exécution.
OWASP :
- A6:2017-Misconfiguration de la Sécurité
- A05:2021-Misconfiguration de la Sécurité
javascript_timing_rule-possible-timing-attacks¶
Résumé :
Discrépance de temps observable
Gravité : Moyenne
CWE : CWE-208
Description :
L'application effectue des comparaisons de chaînes en utilisant des opérateurs d'égalité standard
(===, !==, ==, !=) sur des valeurs sensibles à la sécurité telles que des mots de passe,
des tokens, des clés API ou des secrets. Ces opérateurs effectuent une comparaison caractère par caractère
et sortent rapidement à la première différence, créant des différences de timing mesurables. Les attaquants peuvent exploiter ces écarts de timing par le biais d'analyses statistiques pour forcer de manière itérative la valeur attendue, un caractère à la fois.
Remédiation :
Envisagez d'utiliser crypto.timingSafeEqual() pour comparer des chaînes sensibles à la sécurité afin d'assurer une comparaison en temps constant. Cette fonction compare des buffers octet par octet indépendamment du contenu, prévenant ainsi les attaques par canaux latéraux basées sur le timing. Il est recommandé de convertir les deux chaînes en objets Buffer avec le même encodage avant la comparaison : crypto.timingSafeEqual(Buffer.from(input), Buffer.from(expected)). Cette approche garantit un temps d'exécution égal pour toutes les comparaisons.
OWASP :
- A3:2017-Exposition de données sensibles
- A02:2021-Failles cryptographiques
rules_lgpl_javascript_crypto_rule-node-aes-ecb¶
Résumé :
Utilisation d'un algorithme cryptographique cassé ou risqué
Gravité : Moyenne
CWE : CWE-327
Description :
L'application utilise crypto.createCipheriv() ou crypto.createDecipheriv() avec AES en mode ECB (Electronic Codebook), qui est déterministe et révèle des motifs dans les données chiffrées. Le mode ECB chiffre des blocs de texte en clair identiques en blocs de texte chiffré identiques, ce qui le rend vulnérable aux attaques par analyse de motifs. Cela est particulièrement dangereux lors du chiffrement de données structurées, d'images ou de tout contenu avec des motifs répétitifs, car les attaquants peuvent inférer des informations sur le texte en clair en analysant la structure du texte chiffré.
Remédiation :
Envisagez d'utiliser AES avec le mode GCM (Galois/Counter Mode) ou CBC (Cipher Block Chaining) au lieu de ECB. Le mode GCM est recommandé car il offre à la fois le chiffrement et l'authentification, protégeant contre les attaques de falsification. Utilisez crypto.createCipheriv('aes-256-gcm', key, iv) pour un chiffrement authentifié. Si vous utilisez le mode CBC, assurez-vous de générer un IV aléatoire cryptographiquement à l'aide de crypto.randomBytes(16) pour chaque opération de chiffrement et ne réutilisez jamais les IV. Pour une sécurité supplémentaire avec CBC, combinez-le avec HMAC pour l'authentification afin de créer une construction de chiffrement-then-MAC. L'implémentation GCM du module crypto de Node.js gère automatiquement les tags d'authentification via les méthodes cipher.getAuthTag() et decipher.setAuthTag().
OWASP :
- A3:2017-Exposition de données sensibles
- A02:2021-Failles cryptographiques
rules_lgpl_javascript_crypto_rule-node-aes-noiv¶
Résumé :
Utilisation d'un algorithme cryptographique défectueux ou risqué
Gravité : Moyenne
CWE : CWE-327
Description :
L'application utilise crypto.createCipheriv() avec une chaîne vide comme paramètre de vecteur d'initialisation (IV), ce qui entraîne l'utilisation d'un IV nul pour le chiffrement AES. L'utilisation d'un IV statique ou nul contredit l'objectif de l'IV et rend le chiffrement déterministe, permettant aux attaquants d'identifier quand le même texte clair est chiffré plusieurs fois. Cette vulnérabilité facilite les attaques par dictionnaire et l'analyse de motifs, car des textes clairs identiques chiffrés avec la même clé produiront toujours des données chiffrées identiques, révélant des informations sur les données chiffrées.
Remédiation :
Générez toujours un IV aléatoire cryptographiquement à l'aide de crypto.randomBytes(16) pour AES-128 ou AES-192, ou utilisez un IV de 12 octets avec crypto.randomBytes(12) pour le mode AES-GCM. L'IV doit être unique pour chaque opération de chiffrement avec la même clé et doit être généré à l'aide d'un générateur de nombres aléatoires sécurisé sur le plan cryptographique. Stockez ou transmettez l'IV avec le texte chiffré, car il n'est pas nécessaire qu'il reste secret, mais ne doit pas être réutilisé. Pour le mode AES-GCM, la combinaison de la clé et de l'IV ne doit jamais être répétée, car la réutilisation de l'IV entraîne des échecs de sécurité catastrophiques qui peuvent exposer la clé d'authentification. Envisagez d'utiliser des bibliothèques de chiffrement de niveau supérieur comme @noble/ciphers ou l'API Web Crypto crypto.subtle.encrypt() qui gèrent automatiquement la génération d'IV.
OWASP :
- A3:2017-Exposition des données sensibles
- A02:2021-Échecs cryptographiques
rules_lgpl_javascript_crypto_rule-node-insecure-random-generator¶
Résumé :
Utilisation de générateur de nombres pseudo-aléatoires (PRNG) cryptographiquement faibles
Gravité : Moyenne
CWE : CWE-338
Description :
L'application utilise des générateurs de nombres aléatoires cryptographiquement faibles tels que
crypto.pseudoRandomBytes() ou Math.random() pour des opérations sensibles à la sécurité. La fonction crypto.pseudoRandomBytes() utilise un PRNG non cryptographique qui peut être prévisible, tandis que Math.random() est explicitement conçu pour un usage général et est complètement inadapté à des fins cryptographiques. Utiliser ces fonctions pour générer des jetons de session, des jetons CSRF, des jetons de réinitialisation de mot de passe, des clés de chiffrement ou d'autres valeurs critiques pour la sécurité permet aux attaquants de prédire les sorties futures en observant les valeurs précédentes. Cette prévisibilité peut entraîner un vol de session, un contournement de l'authentification ou une compromission totale des protections cryptographiques.
Remédiation :
Remplacez toutes les utilisations de crypto.pseudoRandomBytes() et Math.random() par
crypto.randomBytes() pour toute génération de nombres aléatoires sensible à la sécurité.
La fonction crypto.randomBytes() utilise le générateur de nombres aléatoires
cryptographiquement sécurisé du système d'exploitation (par exemple, /dev/urandom sur Linux,
CryptGenRandom sur Windows). Pour générer des entiers aléatoires dans une plage spécifique,
utilisez crypto.randomInt(min, max) qui est disponible dans Node.js 14.10.0
et versions ultérieures. Lors de la génération de jetons ou d'identifiants, envisagez d'utiliser
crypto.randomUUID() pour des UUID conformes à RFC 4122, ou encodez des octets aléatoires
en utilisant le codage base64url avec randomBytes(32).toString('base64url') pour des jetons
compatibles avec les URL. Notez que crypto.pseudoRandomBytes() a été obsolète dans Node.js
v6.0.0 et ne devrait jamais être utilisé dans des applications modernes.
OWASP :
- A3:2017-Exposition de données sensibles
- A02:2021-Échecs cryptographiques
rules_lgpl_javascript_crypto_rule-node-md5¶
Résumé :
Utilisation de hachage faible
Gravité : Moyenne
CWE : CWE-328
Description :
L'application utilise le hachage MD5 à travers diverses API JavaScript incluant
crypto.createHash('md5'), CryptoJS.MD5(), des packages npm comme md5,
blueimp-md5, js-md5, ou des bibliothèques comme node-forge et jshashes. MD5 est
cryptographiquement cassé et vulnérable aux attaques par collision, où des attaquants
peuvent générer deux entrées différentes produisant des sorties de hachage identiques. Des
attaques par collision pratiques contre MD5 ont été démontrées depuis 2004, et les attaques
par collision avec préfixe choisi sont désormais réalisables avec des ressources
informatiques modestes. Utiliser MD5 pour le hachage de mots de passe, les signatures
numériques, la vérification de certificats ou les vérifications d'intégrité des données permet
aux attaquants de falsifier des informations d'authentification, de créer des fichiers malveillants
avec des signatures légitimes, ou de substituer des données de confiance par un contenu malveillant.
Remédiation :
Migrer vers SHA-256 ou SHA-3 pour le hachage cryptographique en utilisant
crypto.createHash('sha256') ou crypto.createHash('sha3-256') dans le
module crypto de Node.js. Pour le hachage de mots de passe spécifiquement, utiliser des
fonctions de hachage de mots de passe dédiées comme bcrypt (via le package npm
bcrypt), scrypt (via crypto.scrypt()), ou Argon2 (via le package npm
argon2) au lieu de fonctions de hachage à usage général. Ces algorithmes incluent la
génération de sel et des facteurs de travail configurables pour résister aux attaques par
force brute. Si vous devez maintenir la compatibilité avec des systèmes hérités utilisant
MD5 à des fins non sécuritaires comme les sommes de contrôle, documentez clairement que
MD5 n'est utilisé que pour l'intégrité des données dans des contextes non adversariaux,
jamais pour l'authentification ou des fins cryptographiques. Lors de la migration loin des
hachages de mot de passe MD5, implémentez une stratégie de migration progressive qui
rehache les mots de passe avec un algorithme sécurisé lors de la connexion de l'utilisateur.
OWASP :
- A3:2017-Exposition de données sensibles
- A02:2021-Failles cryptographiques
rules_lgpl_javascript_crypto_rule-node-sha1¶
Résumé :
Utilisation de hachage faible
Gravité : Moyenne
CWE : CWE-328
Description :
L'application utilise le hachage SHA-1 à travers diverses API JavaScript, y compris
crypto.createHash('sha1'), CryptoJS.SHA1(), des packages npm comme sha1 et
js-sha1, ou des bibliothèques comme node-forge, jshashes, hash.js et jssha.
SHA-1 est cassé cryptographiquement et vulnérable aux attaques par collision où
les attaquants peuvent créer deux entrées différentes qui produisent des sorties de hachage identiques.
L'attaque SHAttered démontrée en 2017 a montré des collisions pratiques de SHA-1,
et des recherches ultérieures ont rendu ces attaques de plus en plus réalisables. Utiliser
SHA-1 pour des signatures numériques, la validation de certificats, la vérification de commits git,
ou des vérifications d'intégrité des données permet aux attaquants de substituer un contenu malveillant tout en
maintenant le même hachage, de contourner les mécanismes d'authentification, ou de falsifier
des signatures cryptographiques.
Remédiation :
Remplacez SHA-1 par SHA-256 ou SHA-3 en utilisant crypto.createHash('sha256') ou
crypto.createHash('sha3-256') du module crypto de Node.js. Pour le hachage des mots de passe,
utilisez des algorithmes dédiés comme bcrypt, scrypt (via
crypto.scrypt()), ou Argon2 (via le package npm argon2) qui incluent
un salage et des facteurs de travail configurables. Pour les opérations HMAC, migrez de
crypto.createHmac('sha1', key) vers crypto.createHmac('sha256', key). Si
vous vous intégrez à des systèmes hérités qui nécessitent SHA-1 pour des fins non cryptographiques
comme le hachage d'objets git ou la compatibilité avec des protocoles hérités, isolez clairement
et documentez ces utilisations pour prévenir une utilisation accidentelle dans des contextes critiques pour la sécurité. Lorsque vous remplacez SHA-1 dans des systèmes existants, mettez en œuvre une stratégie de migration versionnée qui peut valider à la fois les anciens hachages SHA-1 et les nouveaux hachages SHA-256 pendant la période de transition.
OWASP :
- A3:2017-Exposition de Données Sensibles
- A02:2021-Failles Cryptographiques
rules_lgpl_javascript_crypto_rule-node-timing-attack¶
Résumé :
Écart de temps observable
Gravité : Moyenne
CWE : CWE-208
Description :
L'application utilise des opérateurs d'égalité JavaScript standard (===, !==, ==, !=) pour comparer des valeurs sensibles comme des mots de passe, des jetons, des secrets, des clés API ou des hachages d'authentification. Ces opérateurs effectuent des comparaisons de chaînes à court-circuit qui retournent dès qu'une différence est trouvée, ce qui fait que le temps de comparaison varie en fonction du nombre de caractères correspondants. Un attaquant peut mesurer ces différences de temps à travers des tentatives d'authentification répétées pour déduire progressivement la valeur correcte caractère par caractère. Cette attaque par canal latéral basé sur le temps est particulièrement efficace contre les secrets basés sur des chaînes et les jetons d'authentification, où un attaquant avec un accès réseau peut effectuer suffisamment de tentatives de mesure pour extraire l'intégralité du secret à travers une analyse statistique des temps.
Remédiation :
Utilisez crypto.timingSafeEqual() pour des comparaisons de chaînes en temps constant lors de la validation des mots de passe, des jetons ou d'autres secrets. Cette fonction compare deux objets Buffer ou TypedArray en temps constant, quelle que soit leur contenu, prévenant ainsi les attaques par timing. Convertissez les chaînes en buffers en utilisant Buffer.from(string) avant la comparaison. Par exemple : crypto.timingSafeEqual(Buffer.from(userToken), Buffer.from(expectedToken)). Notez que les deux buffers doivent avoir la même longueur, sinon la fonction déclenchera une erreur, donc assurez-vous que les entrées sont normalisées à la longueur attendue. Pour le hachage des mots de passe spécifiquement, utilisez bcrypt.compare() ou argon2.verify() qui incluent une comparaison en temps constant intégrée. Des bibliothèques alternatives comme le package npm secure-compare fournissent également des fonctions de comparaison sûres en termes de timing. Soyez conscient que la mitigation des attaques par timing doit être appliquée de manière cohérente à travers tous les chemins de code d'authentification, car une seule comparaison vulnérable peut compromettre l'intégralité du système d'authentification.
OWASP :
- A3:2017-Exposition de données sensibles
- A02:2021-Pannes cryptographiques
rules_lgpl_javascript_crypto_rule-node-tls-reject¶
Résumé :
Validation de certificat incorrecte
Gravité : Moyenne
CWE : CWE-295
Description :
L'application définit process.env.NODE_TLS_REJECT_UNAUTHORIZED à '0' ou 0, ce qui désactive la validation des certificats TLS/SSL pour toutes les connexions HTTPS établies par Node.js. Cette variable d'environnement indique à Node.js d'accepter n'importe quel certificat sans le vérifier contre des Autorités de Certification de confiance, y compris les certificats auto-signés, les certificats expirés ou les certificats avec des noms d'hôtes incorrects. Désactiver la validation des certificats élimine le composant d'authentification de TLS, rendant l'application vulnérable aux attaques de type homme du milieu (MITM) où un attaquant peut intercepter, lire et modifier tout le trafic chiffré. Ce paramètre affecte toutes les requêtes HTTPS au niveau global dans le processus Node.js, y compris celles effectuées par le module https, des clients HTTP tiers comme axios ou node-fetch, et toute bibliothèque qui utilise des connexions TLS.
Remédiation :
Ne jamais définir NODE_TLS_REJECT_UNAUTHORIZED=0 dans des environnements de production. Supprimez tout code qui définit cette variable d'environnement et reposez-vous sur le comportement sécurisé par défaut de Node.js pour la validation des certificats. Pour le développement ou les tests avec des certificats auto-signés, utilisez une configuration de certificat appropriée plutôt que de désactiver la validation globalement. Ajoutez des certificats CA personnalisés au magasin de confiance à l'aide de l'option ca dans https.request() ou tls.connect(), par exemple : https.request({ ca: fs.readFileSync('custom-ca.pem') }). Pour les environnements de développement, générez des certificats auto-signés appropriés avec des noms d'hôtes corrects et ajoutez-les au magasin de confiance de votre système. Si vous devez vous connecter à des serveurs avec des certificats invalides dans des cas spécifiques, utilisez l'option rejectUnauthorized: false sur des requêtes individuelles plutôt que de désactiver la validation globalement, et documentez clairement pourquoi cette exception est nécessaire. Envisagez d'utiliser des outils comme mkcert pour générer des certificats de développement de confiance localement qui ne nécessitent pas la désactivation de la validation.
OWASP :
- A6:2017-Mauvaise configuration de la sécurité
- A05:2021-Mauvaise configuration de la sécurité
rules_lgpl_javascript_crypto_rule-node-weak-crypto¶
Résumé :
Utilisation d'un algorithme cryptographique cassé ou risqué
Gravité : Moyenne
CWE : CWE-327
Description :
L'application utilise crypto.createCipher() avec le chiffrement DES (Data Encryption Standard), qui est cryptographiquement cassé en raison de sa petite taille de clé de 56 bits. Les clés DES peuvent être brute-forcées en quelques heures avec du matériel moderne, et des machines spécialisées peuvent casser le chiffrement DES en quelques minutes. L'algorithme a été officiellement déprécié par le NIST en 2005 et ne devrait pas être utilisé pour aucun chiffrement sensible à la sécurité. De plus, crypto.createCipher() lui-même est déprécié au profit de crypto.createCipheriv() car il utilise une méthode de dérivation de clé peu sécurisée. Utiliser le chiffrement DES donne un faux sentiment de sécurité tout en offrant une protection minimale contre des attaquants déterminés.
Remédiation :
Remplacez le DES par l'AES-256-GCM utilisant crypto.createCipheriv() pour le chiffrement authentifié. L'AES-256-GCM offre à la fois la confidentialité et l'authenticité avec une taille de clé de 256 bits considérée comme sécurisée contre les attaques par force brute. Utilisez crypto.randomBytes(32) pour générer des clés de chiffrement et crypto.randomBytes(12) pour générer des nonces pour le mode GCM. Exemple : crypto.createCipheriv('aes-256-gcm', key, iv). Pour la compatibilité avec les systèmes nécessitant des modes de chiffrement par blocs sans authentification, utilisez l'AES-256-CBC avec HMAC-SHA256 pour la construction encrypt-then-MAC. N'utilisez jamais la fonction dépréciée crypto.createCipher(), qui dérive les clés de manière peu sécurisée à partir de mots de passe. Si vous avez besoin d'un chiffrement basé sur un mot de passe, utilisez crypto.scrypt() ou crypto.pbkdf2() pour la dérivation de clé avant de passer la clé dérivée à crypto.createCipheriv(). La migration depuis le DES nécessite de réencrypter toutes les données stockées, alors planifiez un déploiement progressif avec un support pour les deux algorithmes pendant la période de transition.
OWASP :
- A3:2017-Exposition de données sensibles
- A02:2021-Failles cryptographiques
rules_lgpl_javascript_database_rule-sequelize-tls¶
Résumé :
Transmission en clair d'informations sensibles
Sévérité : Moyenne
CWE : CWE-319
Description :
La configuration de connexion de la base de données Sequelize pour MySQL, MariaDB, PostgreSQL ou Oracle n'active pas le chiffrement TLS/SSL dans les paramètres dialectOptions.ssl. Cela entraîne une transmission des identifiants de base de données, des requêtes et des ensembles de résultats en clair sur le réseau, les exposant à l'interception par des attaquants réalisant des attaques par interception (MITM). Sans chiffrement de transport, tout observateur du réseau peut capturer des données sensibles, y compris des informations d'authentification et des données critiques pour l'entreprise.
Remédiation :
Envisagez d'activer TLS pour toutes les connexions de base de données en ajoutant une configuration SSL aux options de connexion de Sequelize. Pour PostgreSQL, ajoutez dialectOptions: { ssl: true } à l'objet de configuration. Pour MySQL et MariaDB, utilisez dialectOptions: { ssl: { require: true } } ou fournissez des options de certificat spécifiques avec { ssl: { ca: fs.readFileSync('/path/to/ca.pem') } }. Il est recommandé de configurer le serveur de base de données pour exiger des connexions TLS et rejeter les tentatives non chiffrées afin d'éviter des rétrogradations accidentelles. Pour les bases de données hébergées dans le cloud comme AWS RDS, Azure Database ou Google Cloud SQL, téléchargez le certificat racine du fournisseur et configurez-le explicitement dans les options SSL pour garantir une validation correcte du certificat. Les déploiements en production doivent imposer TLS 1.2 ou supérieur et valider les certificats du serveur pour prévenir complètement les attaques MITM.
OWASP :
- A3:2017-Exposition de données sensibles
- A02:2021-Failles cryptographiques
rules_lgpl_javascript_dos_rule-layer7-object-dos¶
Résumé :
Entrée non vérifiée pour la condition de boucle
Sévérité : Moyenne
CWE : CWE-606
Description :
L'application boucle sur des objets contrôlés par l'utilisateur en utilisant des méthodes telles que
Object.keys(), forEach(), map(), filter(), reduce() ou reduceRight(),
ou itère avec des boucles for basées sur des propriétés length contrôlées par l'utilisateur. Cela peut
entraîner une vulnérabilité de déni de service de couche 7 lorsque des attaquants envoient des objets ou des tableaux extrêmement
grands qui consomment des cycles CPU ou de la mémoire excessifs lors de l'itération.
Dans les applications Node.js, cela peut entraîner un blocage total de l'application
pour les demandes d'autres utilisateurs, car l'exécution de JavaScript est mono-threadée.
Remédiation :
Envisagez de mettre en œuvre des limites strictes sur la taille des objets et
tableaux contrôlés par l'utilisateur avant de les itérer. Il est recommandé de valider la propriété de longueur
et de rejeter les demandes qui dépassent des seuils raisonnables (par exemple, maximum 100 éléments)
en utilisant des middleware ou des vérifications de validation précoce. Pour les scénarios de pagination, utilisez
des limites de paramètres de requête comme ?limit=10&offset=0 avec des valeurs maximales imposées.
Vous pouvez également utiliser le traitement par flux ou par morceaux pour de grands ensembles de données au lieu de
charger des objets entiers en mémoire. Envisagez de mettre en œuvre un contrôle de taux au niveau
de l'API en utilisant des packages comme express-rate-limit pour prévenir les abus répétés.
Pour la validation d'objets complexes, des bibliothèques comme joi ou ajv peuvent imposer des contraintes de schéma
y compris les longueurs maximales de tableaux et les nombres de propriétés d'objets avant
de traiter l'entrée utilisateur.
OWASP :
- A6:2017-Misconfiguration de sécurité
- A05:2021-Misconfiguration de sécurité
rules_lgpl_javascript_dos_rule-regex-dos¶
Résumé :
Expression régulière incorrecte
Gravité : Moyenne
CWE : CWE-185
Description :
L'application utilise des méthodes regex comme .test() ou .exec() pour valider ou correspondre aux entrées fournies par l'utilisateur à partir des paramètres de requête, des chaînes de requête ou des propriétés du corps. Si le motif d'expression régulière contient des constructions vulnérables entraînant un backtracking catastrophique (comme des quantificateurs imbriqués tels que (a+)+ ou des alternations chevauchantes), les attaquants peuvent créer des chaînes d'entrée qui provoquent un déni de service par expression régulière (ReDoS). Cela bloque la boucle d'événements à thread unique de Node.js et rend l'application non réactive pour tous les utilisateurs.
Remédiation :
Envisagez d'analyser tous les motifs d'expression régulière pour des vulnérabilités ReDoS à l'aide d'outils comme redos-detector ou safe-regex avant de déployer en production. Il est recommandé de remplacer les motifs vulnérables par des alternatives plus simples qui évitent les quantificateurs imbriqués et les alternations chevauchantes. Pour des scénarios de validation complexes, envisagez de migrer vers le package node-re2 (npm install re2), qui garantit un appariement regex en temps linéaire et ne peut pas être exploité pour des attaques ReDoS. Lors de l'utilisation de RE2, remplacez RegExp par le constructeur RE2 et notez que certaines fonctionnalités regex de JavaScript comme les lookaheads ne sont pas prises en charge. Il est également possible de mettre en place des limites de longueur d'entrée avant le traitement regex (par exemple, rejeter les chaînes de plus de 1000 caractères) pour réduire la surface d'attaque. Pour des cas de validation simples comme la vérification des e-mails ou des URL, envisagez d'utiliser des bibliothèques de validation dédiées comme validator.js au lieu de motifs regex écrits à la main.
OWASP :
- A6:2017-Mauvaise configuration de sécurité
- A05:2021-Mauvaise configuration de sécurité
rules_lgpl_javascript_electronjs_rule-electron-blink-integration¶
Résumé :
Violation du principe du moindre privilège
Sévérité : Moyen
CWE : CWE-272
Description :
La configuration de BrowserWindow permet d'activer les fonctionnalités expérimentales de Chromium Blink via webPreferences.enableBlinkFeatures. Ces fonctionnalités expérimentales ne sont pas considérées comme stables ou prêtes pour la production, et peuvent introduire des vulnérabilités de sécurité inattendues, des problèmes de corruption de mémoire, ou des opportunités d'escalade de privilèges. L'activation de fonctionnalités expérimentales viole le principe du moindre privilège en exposant des capacités de navigateur non testées à du contenu potentiellement non fiable.
Remédiation :
Envisagez de supprimer complètement le paramètre enableBlinkFeatures des webPreferences pour n'utiliser que des fonctionnalités Chromium stables et bien testées. Si une fonctionnalité spécifique est requise, évaluez si elle peut être réalisée en utilisant des API Electron stables ou des modules Node.js plutôt que des fonctionnalités expérimentales du navigateur. Il est recommandé de passer en revue attentivement la documentation de sécurité d'Electron et d'évaluer si les fonctionnalités expérimentales sont vraiment nécessaires pour la fonctionnalité de votre application. Si des fonctionnalités expérimentales doivent être utilisées, mettez en œuvre des contrôles de sécurité supplémentaires tels que des politiques de sécurité du contenu strictes, le sandboxing, et une validation d'entrée complète pour atténuer les risques potentiels.
OWASP :
- A6:2017-Misconfiguration de la sécurité
- A05:2021-Misconfiguration de la sécurité
rules_lgpl_javascript_electronjs_rule-electron-context-isolation¶
Résumé :
Modification mal contrôlée des attributs de prototype d'objet ('Pollution de Prototype')
Gravité : Moyenne
CWE : CWE-1321
Description :
La configuration de BrowserWindow définit webPreferences.contextIsolation sur false, ce qui désactive la barrière de sécurité entre le code interne d'Electron et le contenu web. Sans isolation de contexte, le code JavaScript s'exécutant dans les pages web peut modifier les prototypes JavaScript intégrés (Pollution de Prototype), ce qui peut potentiellement affecter la fonctionnalité interne d'Electron et mener à une exécution de code à distance s'il est combinado avec d'autres vulnérabilités. Cette configuration permet au contenu web non approuvé d'accéder directement et de manipuler l'environnement Node.js lorsque nodeIntegration est activé.
Remédiation :
Envisagez d'activer l'isolation de contexte en soit en supprimant le paramètre contextIsolation (il est par défaut à true dans Electron 12+) ou en le paramétrant explicitement à true. Il est recommandé d'utiliser l'API contextBridge d'Electron pour exposer uniquement des fonctions spécifiques et nettoyées aux processus de rendu au lieu de permettre un accès direct aux API Node.js. Le contextBridge offre un moyen sécurisé de communiquer entre des contextes isolés tout en maintenant les barrières de sécurité. Si vous migrez du code hérité, refactorez les scripts de préchargement pour utiliser contextBridge.exposeInMainWorld() pour une exposition contrôlée des API. L'isolation de contexte est une fonctionnalité de sécurité critique et ne doit être désactivée que dans des circonstances exceptionnelles après un examen de sécurité approfondi.
OWASP :
- A6:2017-Mauvaises configurations de sécurité
- A05:2021-Mauvaises configurations de sécurité
rules_lgpl_javascript_electronjs_rule-electron-nodejs-integration¶
Résumé :
Violation du principe du moindre privilège
Gravité : Moyenne
CWE : CWE-272
Description :
La configuration de BrowserWindow définit webPreferences.nodeIntegration sur true, ce qui expose toutes les API Node.js (y compris require(), fs, child_process) au processus de rendu et au contenu web. Si l'application est vulnérable au Cross-Site Scripting (XSS) ou charge du contenu non fiable, les attaquants peuvent exploiter les API Node.js pour exécuter des commandes système arbitraires, accéder au système de fichiers, établir des connexions réseau ou compromettre complètement le système hôte. Cela transforme effectivement toute vulnérabilité XSS en une vulnérabilité d'exécution de code à distance.
Remédiation :
Envisagez de désactiver l'intégration de Node.js en supprimant nodeIntegration: true ou en le définissant explicitement sur false (l'option par défaut depuis Electron 5). Il est recommandé d'utiliser le mécanisme IPC (Communication Inter-Processus) d'Electron avec contextBridge et des scripts de préchargement pour exposer uniquement des fonctionnalités spécifiques et assainies aux processus de rendu. L'API contextBridge permet d'exposer sélectivement des méthodes sécurisées en utilisant contextBridge.exposeInMainWorld() tout en maintenant l'isolation de contexte. Pour les applications nécessitant des fonctionnalités de Node.js, mettez en œuvre une architecture de sécurité où les opérations sensibles sont gérées dans le processus principal et communiquées via ipcRenderer/ipcMain avec une validation des entrées et des vérifications d'autorisation appropriées. Cette approche fournit une défense en profondeur contre l'exploitation XSS.
OWASP :
- A6:2017-Mauvaise configuration de sécurité
- A05:2021-Mauvaise configuration de sécurité
rules_lgpl_javascript_headers_rule-cookie-session-no-httponly¶
Résumé :
Cookie sensible sans le drapeau 'HttpOnly'
Gravité : Moyen
CWE : CWE-1004
Description :
L'application définit explicitement httpOnly: false dans la configuration des cookies pour cookie-session ou express-session, ce qui permet à JavaScript côté client d'accéder aux cookies de session via document.cookie. Cela augmente considérablement le risque de détournement de session par des attaques de script inter-sites (XSS), car des scripts malveillants injectés dans l'application peuvent voler des identifiants de session et les envoyer vers des serveurs contrôlés par des attaquants. Le drapeau httpOnly est une mesure critique de défense en profondeur qui empêche l'accès JavaScript aux cookies, même lorsque des vulnérabilités XSS existent dans l'application.
Remédiation :
Envisagez de supprimer la configuration httpOnly: false ou de définir explicitement httpOnly: true dans vos options de middleware de session. Par exemple, utilisez session({ cookie: { httpOnly: true } }) lors de la configuration de la session. Notez que httpOnly est généralement activé par défaut dans la plupart des middlewares de session, vous devrez donc peut-être simplement supprimer le réglage explicite à false. Il existe très peu de cas d'utilisation légitimes pour permettre l'accès JavaScript aux cookies de session, et des approches alternatives, comme l'utilisation de jetons d'authentification séparés, devraient être envisagées si un accès côté client à l'état d'authentification est nécessaire. Le drapeau httpOnly fournit une protection même contre des attaques XSS sophistiquées qui pourraient contourner d'autres contrôles de sécurité.
OWASP :
- A2:2017-Authentification rompue
- A07:2021-Failles d'identification et d'authentification
rules_lgpl_javascript_headers_rule-cookie-session-no-samesite¶
Résumé :
Cookie sensible avec un attribut SameSite incorrect
Gravité : Moyenne
CWE : CWE-1275
Description :
L'application utilise le middleware cookie-session ou express-session sans
configurer l'attribut sameSite sur 'strict' ou 'lax' dans les options du cookie, ce qui permet d'envoyer des cookies de session avec des requêtes inter-sites initiées par des sites tiers. Cette protection manquante rend l'application vulnérable aux attaques de type Cross-Site Request Forgery (CSRF), où des sites malveillants peuvent déclencher des actions authentifiées en s'appuyant sur la session active de l'utilisateur. Sans l'attribut sameSite, les navigateurs enverront les cookies de session avec toutes les requêtes, quel que soit l'origine, permettant ainsi aux attaquants d'effectuer des opérations non autorisées au nom des utilisateurs authentifiés.
Remédiation :
Envisagez de définir sameSite: 'strict' ou sameSite: 'lax' dans la configuration du cookie du middleware de session pour prévenir les attaques CSRF. Utilisez session({ cookie: { sameSite: 'strict' } }) pour une protection maximale, ce qui empêche le cookie d'être envoyé avec toute requête inter-sites. Pour les applications nécessitant de prendre en charge des liens entrants provenant de sites externes (comme des liens par email ou sur les réseaux sociaux), utilisez plutôt sameSite: 'lax', qui permet l'envoi de cookies avec une navigation de premier niveau mais les bloque pour les requêtes intégrées, comme les images ou les iframes. Dans les navigateurs modernes, 'lax' devient le paramètre par défaut, mais une configuration explicite garantit un comportement cohérent. Pour les API qui doivent accepter des requêtes inter-origines, envisagez d'utiliser une authentification basée sur des jetons au lieu de sessions basées sur des cookies.
OWASP :
- A2:2017-Authentification Brisée
- A07:2021-Failles d'Identification et d'Authentification
rules_lgpl_javascript_headers_rule-cookie-session-no-secure¶
Résumé :
Cookie sensible dans une session HTTPS sans l'attribut 'Secure'
Sévérité : Moyenne
CWE : CWE-614
Description :
L'application utilise les middlewares cookie-session ou express-session sans configurer le drapeau secure: true dans les options des cookies, ce qui permet aux cookies de session d'être transmis sur des connexions HTTP non chiffrées. Cela expose les identifiants de session aux attaquants basés sur le réseau qui peuvent intercepter le trafic par le biais d'attaques de type homme du milieu, ce qui peut entraîner un détournement de session et un accès non autorisé au compte. Sans le drapeau sécurisé, les navigateurs envoient le cookie de session sur les connexions HTTP et HTTPS.
Remédiation :
Envisagez de définir secure: true dans la configuration des cookies du middleware de session pour garantir que les cookies de session ne soient transmis que sur des connexions HTTPS. Par exemple, utilisez session({ cookie: { secure: true } }) lors de l'initialisation du middleware. Dans les environnements de production, cela doit toujours être activé, mais notez que cela nécessite que l'application soit servie via HTTPS. Pour les environnements de développement utilisant HTTP, vous pouvez le définir de façon conditionnelle en fonction de l'environnement, comme secure: process.env.NODE_ENV === 'production'. De plus, envisagez d'utiliser le package express-session avec un magasin de session sécurisé comme Redis ou MongoDB plutôt qu'un stockage en mémoire pour les applications de production.
OWASP :
- A2:2017-Authentification cassée
- A07:2021-Failles d'identification et d'authentification
rules_lgpl_javascript_headers_rule-express-cors¶
Résumé :
Erreur de validation d'origine
Sévérité : Moyenne
CWE : CWE-346
Description :
L'application définit l'en-tête de réponse Access-Control-Allow-Origin sur '*'
(joker) en utilisant des méthodes d'Express.js comme res.set(), res.header(), ou
res.writeHead(), ou active le CORS en wildcard en utilisant app.options('*',
cors()). Cela désactive le mécanisme de sécurité de la Politique de même origine, permettant
à n'importe quel site web sur Internet d'effectuer des requêtes cross-origin vers cette application
et de lire les réponses. Cela est particulièrement dangereux lorsque l'application
manipule des données sensibles ou des authentifications, car des sites web malveillants peuvent faire
des requêtes au nom d'utilisateurs authentifiés et accéder à leurs informations personnelles. L'origine wildcard contourne le modèle de sécurité fondamental du navigateur conçu pour empêcher un accès non autorisé aux données cross-origin.
Remédiation :
Envisagez de configurer le CORS avec une liste blanche spécifique d'origines autorisées
au lieu d'utiliser le joker. Pour les applications Express.js utilisant le middleware cors,
utilisez l'option origin avec un tableau ou une fonction, tel que
cors({ origin: ['https://trusted-site.com', 'https://another-trusted.com']
}). Pour une validation dynamique des origines, utilisez une fonction comme cors({ origin:
(origin, callback) => { callback(null, allowedOrigins.includes(origin)) }
}). Si vous devez prendre en charge plusieurs origines, validez chaque origine par rapport à une
liste blanche avant de définir l'en-tête. N'utilisez jamais le CORS en wildcard pour les APIs qui
gèrent l'authentification ou des données sensibles. Pour les APIs publiques qui ont réellement besoin
d'un accès universel, envisagez d'utiliser des clés API ou d'autres mécanismes d'authentification
au lieu de dépendre des restrictions CORS. Assurez-vous également que les informations d'identification ne
soient pas autorisées lors de l'utilisation de politiques CORS plus larges.
OWASP :
- A6:2017-Mauvaise configuration de la sécurité
- A05:2021-Mauvaise configuration de la sécurité
rules_lgpl_javascript_headers_rule-generic-cors¶
Résumé :
Erreur de validation d'origine
Gravité : Moyenne
CWE : CWE-346
Description :
L'application utilise app.options('*', cors()) pour activer les réponses de pré-vol CORS pour toutes les routes avec correspondance générique, ce qui entraîne généralement le réglage de Access-Control-Allow-Origin: * pour les requêtes OPTIONS. Cette configuration désactive les protections de la politique de même origine à travers toute l'application, permettant à n'importe quel site web de faire des requêtes inter-origin. Bien que les requêtes OPTIONS elles-mêmes n'exposent pas de données, ce modèle indique souvent une configuration CORS trop permissive qui s'étend aux requêtes de données réelles. Les politiques CORS avec des jokers sapent fondamentalement les mécanismes de sécurité des navigateurs conçus pour prévenir l'accès non autorisé aux ressources sensibles.
Remédiation :
Envisagez de remplacer le gestionnaire d'options génériques par des configurations CORS spécifiques aux routes qui ne mettent sur liste blanche que les origines de confiance. Utilisez le middleware cors avec une configuration d'origine spécifique, comme app.options('/api/*', cors({ origin: 'https://trusted-domain.com' })) pour des modèles de routes spécifiques. Pour les applications qui doivent prendre en charge plusieurs origines de confiance, utilisez un tableau comme cors({ origin: ['https://site1.com', 'https://site2.com'] }) ou implémentez une validation dynamique avec une fonction d'origine. Supprimez l'appel global app.options('*', cors()) et appliquez plutôt le middleware CORS sélectivement aux routes qui nécessitent un accès inter-origine. Pour les API publiques, envisagez de mettre en œuvre une authentification par clé API plutôt que de compter sur CORS comme contrôle de sécurité. Documentez quelles origines sont autorisées et pourquoi dans votre code pour éviter des reconfigurations accidentelles lors des mises à jour.
OWASP :
- A6:2017-Mauvaise configuration de sécurité
- A05:2021-Mauvaise configuration de sécurité
rules_lgpl_javascript_headers_rule-header-xss-generic¶
Résumé :
Vérification de sécurité mal mise en œuvre pour la norme
Severité : Moyenne
CWE : CWE-358
Description :
L'application définit explicitement l'en-tête X-XSS-Protection à 0 en utilisant des méthodes Express.js comme res.header(), res.set(), ou res.writeHead(), ce qui désactive le filtre XSS intégré du navigateur. Bien que les navigateurs modernes avec le support de la politique de sécurité de contenu aient déprécié cet en-tête au profit de CSP, désactiver la protection contre les XSS pour les anciens navigateurs supprime une couche de défense importante contre les attaques de cross-site scripting reflétées. L'en-tête X-XSS-Protection défini à 0 indique explicitement aux navigateurs de ne pas tenter de détecter et de bloquer les attaques XSS, laissant ainsi les utilisateurs d'anciens navigateurs plus vulnérables. Cette configuration est particulièrement problématique si l'application manque d'une mise en œuvre complète de la politique de sécurité de contenu.
Remédiation :
Envisagez de supprimer la définition explicite de l'en-tête X-XSS-Protection: 0 ou de la changer en X-XSS-Protection: 1; mode=block pour activer la protection XSS du navigateur. Pour les applications Express.js, vous pouvez utiliser res.set('X-XSS-Protection', '1; mode=block') ou vous appuyer sur le middleware Helmet.js qui définit des valeurs par défaut sécurisées. La meilleure solution à long terme est de mettre en œuvre une politique de sécurité de contenu stricte qui empêche les attaques XSS à la source, rendant l'en-tête X-XSS-Protection redondant. Si vous utilisez Helmet, la configuration par défaut active une protection XSS appropriée. Pour les applications modernes, concentrez-vous sur la mise en œuvre de CSP avec des directives telles que default-src 'self'; script-src 'self' pour prévenir de manière exhaustive les attaques XSS. Ne désactivez l'en-tête X-XSS-Protection que si vous avez une mise en œuvre CSP robuste et avez documenté pourquoi la compatibilité avec les anciens navigateurs n'est pas nécessaire.
OWASP :
- A6:2017-Mauvaise configuration de la sécurité
- A05:2021-Mauvaise configuration de la sécurité
rules_lgpl_javascript_headers_rule-header-xss-lusca¶
Résumé :
Vérification de sécurité mal implémentée pour la norme
Gravité : Moyenne
CWE : CWE-358
Description :
L'application désactive explicitement la protection contre les XSS dans le middleware de sécurité Lusca en utilisant lusca.xssProtection(false) ou lusca({ xssProtection: false }), ce qui empêche l'en-tête X-XSS-Protection d'être défini ou le définit à 0. Lusca est un middleware de sécurité qui fournit plusieurs mécanismes de protection, et désactiver la protection XSS supprime une couche de défense importante contre les attaques de cross-site scripting réfléchi sur les anciens navigateurs. Alors que les navigateurs modernes ont déprécié X-XSS-Protection au profit de la Politique de Sécurité du Contenu, le fait de la désactiver explicitement dans la configuration du middleware laisse les utilisateurs de navigateurs obsolètes vulnérables. Cette configuration suggère un choix délibéré de supprimer la protection XSS au niveau du navigateur sans avoir nécessairement une alternative CSP complète en place.
Remédiation :
Envisagez de supprimer le paramètre xssProtection: false de votre configuration Lusca pour permettre la définition de l'en-tête XSS de protection par défaut. Lusca active X-XSS-Protection par défaut, vous pouvez donc simplement omettre cette option ou définir explicitement lusca({ xssProtection: true }). Si vous le désactivez à cause de conflits avec la Politique de Sécurité du Contenu, assurez-vous d'avoir une mise en œuvre robuste du CSP avant de supprimer les filtres XSS du navigateur. La meilleure pratique consiste à utiliser à la fois la protection XSS par défaut de Lusca et à mettre en œuvre une Politique de Sécurité du Contenu stricte avec des directives telles que script-src 'self' pour fournir une défense en couches. Si vous utilisez Helmet en même temps que Lusca, coordonnez le middleware pour éviter les conflits tout en maintenant une protection maximale. Gardez à l'esprit que les anciens navigateurs s'appuient toujours sur X-XSS-Protection, donc maintenir cette option activée offre une compatibilité ascendante et une défense en profondeur même lorsque CSP est votre principal mécanisme de prévention des XSS.
OWASP :
- A6:2017-Misconfiguration de la sécurité
- A05:2021-Misconfiguration de la sécurité
rules_lgpl_javascript_headers_rule-helmet-feature-disabled¶
Résumé :
Contrôle de sécurité mal implémenté pour le standard
Sévérité : Moyenne
CWE : CWE-358
Description :
L'application désactive explicitement une ou plusieurs fonctionnalités de sécurité dans le middleware Helmet.js en définissant des options telles que frameguard: false, contentSecurityPolicy: false, hsts: false, noSniff: false ou xssFilter: false. Helmet.js fournit par défaut des en-têtes de sécurité essentiels, et désactiver ces fonctionnalités supprime des protections critiques contre des vulnérabilités web courantes. Chaque fonctionnalité désactivée représente un vecteur d'attaque spécifique : frameguard empêche le clickjacking, contentSecurityPolicy bloque les attaques XSS, hsts empêche l'attaque par stripping SSL, noSniff arrête les attaques de sniffing de type MIME, et xssFilter active la protection XSS du navigateur. Définir ces paramètres sur false indique une décision consciente de supprimer des contrôles de sécurité, ce qui est rarement justifié et augmente considérablement la surface d'attaque.
Remédiation :
Envisagez de retirer les paramètres explicites false de votre configuration Helmet et de permettre aux en-têtes de sécurité par défaut d'être définis. Si vous devez désactiver des fonctionnalités spécifiques, documentez la justification commerciale ou technique dans les commentaires du code et limitez la désactivation à des routes spécifiques plutôt qu'à l'échelle globale. Pour le Content Security Policy, si la politique par défaut est trop stricte, personnalisez-la avec des directives appropriées plutôt que de la désactiver complètement, comme contentSecurityPolicy: { directives: { defaultSrc: ["'self'"], scriptSrc: ["'self'", "'unsafe-inline'"] } }. Pour frameguard, utilisez frameguard: { action: 'sameorigin' } si vous devez permettre le framing de même origine. Passez en revue chaque fonctionnalité désactivée et implémentez le contrôle de sécurité de la manière la moins permissive possible. Envisagez d'utiliser des configurations Helmet spécifiques aux routes si certaines routes ont des exigences de sécurité différentes. Privilégiez toujours la personnalisation des politiques plutôt que la désactivation complète des fonctionnalités de sécurité.
OWASP :
- A6:2017-Misconfiguration de sécurité
- A05:2021-Misconfiguration de sécurité
rules_lgpl_javascript_headers_rule-host-header-injection¶
Résumé :
Utilisation d'une source moins fiable
Gravité : Moyenne
CWE : CWE-348
Description :
L'application utilise la valeur non fiable req.host ou req.headers.host provenant de l'en-tête HTTP Host pour construire des URL, généralement en la concaténant avec des chaînes de protocole comme 'http://' ou 'https://'. L'en-tête Host est complètement contrôlé par l'attaquant et peut être manipulé pour injecter des domaines malveillants. Cela conduit à l'empoisonnement du cache web, où les réponses mises en cache contiennent des URL contrôlées par l'attaquant, à l'empoisonnement des réinitialisations de mot de passe, où les liens de réinitialisation pointent vers des serveurs contrôlés par l'attaquant, et à des opportunités de falsification de requêtes côté serveur (SSRF). Ces attaques sont particulièrement graves lorsque les URL générées sont intégrées dans des e-mails, stockées dans des bases de données ou mises en cache par des CDN, permettant aux attaquants de compromettre des utilisateurs qui n'ont jamais interagi directement avec la requête malveillante.
Remédiation :
Envisagez d'utiliser un nom de domaine codé en dur ou basé sur une configuration au lieu de compter sur l'en-tête Host pour la génération d'URL. Définissez le domaine canonique de l'application dans des variables d'environnement ou des fichiers de configuration, tels que const baseUrl = process.env.APP_BASE_URL || 'https://example.com' et utilisez ceci pour construire des URL. Si vous devez utiliser l'en-tête Host, appliquez une validation stricte par rapport à une liste blanche de domaines autorisés et rejetez toute requête avec des valeurs Host inattendues. Pour les applications Express.js, vous pouvez utiliser un middleware pour valider l'en-tête Host tôt dans le pipeline de requête. Lors du déploiement derrière des proxys inversés ou des équilibres de charge, configurez-les pour supprimer ou valider l'en-tête Host avant qu'il n'atteigne votre application. Pour les scénarios de réinitialisation de mot de passe et d'e-mail, utilisez toujours le domaine de l'application configuré plutôt que de refléter l'en-tête Host. Envisagez d'utiliser req.protocol avec un domaine configuré au lieu de req.host pour la construction d'URL.
OWASP :
- A1:2017-Injection
- A03:2021-Injection
rules_lgpl_javascript_ssrf_rule-wkhtmltoimage-ssrf¶
Résumé :
Falsification de requêtes côté serveur (SSRF)
Sévérité : Moyenne
CWE : CWE-918
Description :
Cette règle a détecté des URLs contrôlées par l'utilisateur passées à la fonction wkhtmltoimage.generate() sans validation. La bibliothèque wkhtmltoimage utilise un moteur WebKit sans interface graphique pour rendre des pages web sous forme d'images, et lorsque l'entrée de l'utilisateur contrôle le paramètre URL, des vulnérabilités de falsification de requêtes côté serveur (SSRF) apparaissent. Les attaquants peuvent en profiter pour forcer le serveur à accéder à des ressources internes, à des points de terminaison de métadonnées cloud (169.254.169.254), ou à analyser des services réseau internes. Cela peut exposer des APIs internes, des interfaces administratives, des fichiers sensibles via des URLs file://, ou permettre une cartographie du réseau qui contourne les protections de pare-feu et la segmentation du réseau.
Remédiation :
Envisagez de mettre en œuvre une liste blanche d'URLs stricte qui valide l'entrée de l'utilisateur par rapport aux domaines approuvés avant de passer les URLs à wkhtmltoimage.generate(). Utilisez le parsing d'URL Node.js avec new URL() pour valider le schéma, le nom d'hôte et le port, et rejetez toute URL qui ne correspond pas à la liste blanche. Limitez les protocoles autorisés à http:// et https:// uniquement, en refusant explicitement file://, data://, et d'autres schémas dangereux qui pourraient permettre l'accès à des fichiers locaux. Mettez en œuvre une protection contre le rebinding DNS en résolvant les noms d'hôte en adresses IP et en bloquant les plages d'adresses IP privées (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) et les adresses de métadonnées cloud (169.254.169.254). Les défenses au niveau du réseau peuvent inclure l'exécution de wkhtmltoimage dans un environnement sandbox avec des règles de filtrage sortant pour empêcher les connexions aux réseaux internes. Envisagez d'utiliser une approche de mappage côté serveur où l'entrée de l'utilisateur fournit des clés qui mappent à des URLs sûres préconfigurées plutôt que d'accepter des URLs arbitraires.
OWASP :
- A1:2017-Injection
- A10:2021-Falsification de Requêtes Côté Serveur
rules_lgpl_javascript_traversal_rule-admzip-path-overwrite¶
Résumé :
Limitation incorrecte d'un chemin d'accès à un répertoire restreint ('Traversée de chemin')
Sévérité : Moyenne
CWE : CWE-22
Description :
Cette application extrait des archives ZIP en utilisant le package adm-zip avec fs.createWriteStream(), fs.writeFile() ou fs.writeFileSync() sans sanitiser correctement les chemins d'accès des entrées. Des archives ZIP malveillantes peuvent contenir des entrées avec des séquences de traversée de chemin (par exemple, ../../etc/passwd) qui permettent aux attaquants de remplacer des fichiers arbitraires en dehors du répertoire d'extraction prévu, ce qui peut potentiellement mener à une injection de code ou à un compromis du système.
Remédiation :
Considérez la possibilité de valider tous les chemins d'accès des entrées avant l'extraction en vérifiant les séquences de traversée de chemin à l'aide de entry.entryName.indexOf('..') ou en normalisant les chemins avec path.basename(). Il est recommandé de combiner path.join() avec path.basename() lors de la construction des chemins d'extraction, garantissant que les fichiers sont écrits uniquement dans le répertoire prévu. Par exemple, utilisez fs.createWriteStream(path.join(extractDir, path.basename(entry.entryName))) au lieu d'utiliser directement entry.entryName. De plus, envisagez d'utiliser la méthode adm-zip extractEntryTo() qui fournit une validation de chemin intégrée, ou mettez en œuvre une liste blanche d'extensions de fichiers autorisées pour restreindre l'extraction aux types de fichiers sûrs uniquement.
OWASP :
- A5:2017-Contrôle d'accès rompu
- A01:2021-Contrôle d'accès rompu
rules_lgpl_javascript_traversal_rule-express-lfr¶
Résumé :
Traversée de chemin relative
Gravité : Moyenne
CWE : CWE-23
Description :
Cette application transmet des entrées de l'utilisateur non fiables provenant de req.body, req.params, req.query, req.cookies, ou d'autres propriétés de la requête directement à la fonction Express res.render(). Lors de l'utilisation de moteurs de modèle comme Handlebars (hbs), Pug ou EJS, cela permet des vulnérabilités de lecture de fichiers locaux où des attaquants peuvent créer des entrées malveillantes contenant des séquences de traversée de chemin (par exemple, ../../etc/passwd) pour accéder à des fichiers arbitraires sur le système de fichiers en dehors du répertoire de modèle prévu.
Remédiation :
Envisagez d'utiliser une approche de liste blanche où les noms de modèle sont mappés à des valeurs codées en dur plutôt que d'accepter directement les entrées de l'utilisateur. Par exemple, créez un objet de mappage comme { home: 'index', profile: 'user-profile' } et utilisez res.render(templateMap[req.query.page]) au lieu de res.render(req.query.page). Il est recommandé de valider l'entrée de l'utilisateur par rapport à un modèle strict (par exemple, uniquement alphanumérique) en utilisant des expressions régulières avant de la transmettre à render(). Si la sélection dynamique de modèles est nécessaire, normalisez les chemins en utilisant path.basename() pour éliminer les séquences de traversée de répertoires, bien que la liste blanche soit l'approche la plus sécurisée. De plus, configurez votre moteur de modèle pour restreindre la résolution des modèles à un répertoire spécifique et désactivez l'accès au système de fichiers en dehors de cette limite lorsque cela est possible.
OWASP :
- A5:2017-Contrôle d'accès rompu
- A01:2021-Contrôle d'accès rompu
rules_lgpl_javascript_traversal_rule-express-lfr-warning¶
Résumé :
Traversée de chemin relative
Gravité : Moyenne
CWE : CWE-23
Description :
Cette application utilise Express avec la fonction res.render() et passe des entrées utilisateur non fiables provenant de req.query, req.body, ou d'autres sources de requête en tant que paramètres de modèle ou noms de vues. Associé au moteur de templating Handlebars (hbs), ce modèle peut permettre des vulnérabilités de lecture de fichiers locaux où les attaquants exploitent les mécanismes de résolution de modèles pour accéder à des fichiers en dehors du répertoire de vues prévu via des séquences de traversée de chemin.
Remédiation :
Envisagez de mettre en œuvre une liste blanche stricte des noms de modèles autorisés et utilisez un objet d'énumération ou de mappage pour traduire les entrées utilisateur en chemins de modèles sûrs. Par exemple, au lieu de res.render(req.query.view, data), utilisez une recherche comme const validViews = { home: 'index', about: 'about-us' }; et res.render(validViews[req.query.view] || 'default', data). Il est recommandé d'éviter de passer les entrées utilisateur comme paramètre de vue entièrement lorsque cela est possible. Si des données de modèle dynamiques sont nécessaires, assurez-vous que les entrées utilisateur ne sont utilisées que dans l'objet de données passé en tant que deuxième paramètre à render(), jamais en tant que chemin de vue lui-même. De plus, configurez les paramètres du moteur de vue Express pour restreindre la résolution des modèles à un répertoire spécifique en utilisant app.set('views', path.join(__dirname, 'views')) et envisagez d'utiliser des chemins absolus.
OWASP :
- A5:2017-Contrôle d'accès rompu
- A01:2021-Contrôle d'accès rompu
rules_lgpl_javascript_traversal_rule-generic-path-traversal¶
Résumé :
Traversée de chemin relative
Sévérité : Moyenne
CWE : CWE-23
Description :
Cette application transmet des entrées utilisateur non fiables provenant d'objets de requête directement aux fonctions du système de fichiers Node.js, notamment fs.readFile(), fs.readFileSync(), fs.readFileAsync() ou fs.createReadStream(). Cela permet des attaques par traversée de répertoire où des attaquants créent des entrées malveillantes contenant des séquences de traversée de chemin (par exemple, ../../../../etc/passwd) pour lire des fichiers arbitraires en dehors du répertoire prévu, exposant potentiellement des fichiers de configuration sensibles, des identifiants, du code source ou des fichiers système.
Remédiation :
Envisagez de mettre en œuvre une liste blanche de noms de fichiers ou de chemins de fichiers autorisés plutôt que d'accepter des entrées d'utilisateur arbitraires. Par exemple, utilisez un objet de mappage pour traduire les entrées utilisateur en chemins sûrs, ou validez que le fichier demandé correspond à un modèle attendu. Il est recommandé d'utiliser path.basename() pour supprimer toute composante de répertoire de l'entrée utilisateur, combiné avec path.join() pour construire le chemin complet relatif à un répertoire de base sûr. Par exemple, utilisez fs.readFile(path.join(safeDir, path.basename(userInput))) pour garantir que les fichiers ne sont accessibles que dans safeDir. De plus, utilisez path.resolve() pour normaliser le chemin construit et vérifiez qu'il commence par votre répertoire sûr à l'aide de startsWith() pour prévenir les attaques de traversée. Envisagez de mettre en œuvre une validation des extensions de fichier pour restreindre l'accès à des types de fichiers spécifiques uniquement.
OWASP :
- A5:2017-Contrôle d'accès brisé
- A01:2021-Contrôle d'accès brisé
règles_lgpl_javascript_règle-de-parcours-join-résoudre-chemin-traversée¶
Résumé :
Limitation inadéquate d'un chemin d'accès à un répertoire restreint ('Traversée de chemin')
Gravité : Moyenne
CWE : CWE-22
Description :
Cette application construit des chemins de fichiers en utilisant path.join() ou path.resolve() avec des entrées non fiables de req.body, req.query ou d'autres sources de requête. Bien que ces fonctions du module de chemin normalisent les chemins, elles ne préviennent pas intrinsèquement les attaques de traversée de chemin. Les attaquants peuvent fournir des entrées contenant des séquences de traversée (par ex., ../../etc/passwd) qui, lorsqu'elles sont joints ou résolus, peuvent échapper au répertoire prévu et accéder à des fichiers arbitraires sur le système de fichiers lors d'opérations de fichiers ultérieures.
Remédiation :
Envisagez de sanitiser l'entrée de l'utilisateur avant de la passer à path.join() ou path.resolve() en utilisant path.basename() pour supprimer tout composant de répertoire. Par exemple, utilisez path.join(baseDir, path.basename(userInput)) plutôt que path.join(baseDir, userInput) pour vous assurer que seule la portion du nom de fichier est utilisée. Il est recommandé de mettre en œuvre une liste blanche de noms de fichiers ou de motifs autorisés et de valider l'entrée de l'utilisateur par rapport à cette liste avant la construction du chemin. Après avoir construit le chemin, vérifiez que le chemin absolu résolu commence par votre répertoire de base prévu en utilisant path.resolve() et startsWith() pour attraper toute tentative de traversée. Par exemple, const fullPath = path.resolve(baseDir, sanitizedInput); if (!fullPath.startsWith(baseDir)) throw error. De plus, envisagez d'utiliser path.normalize() avec précaution car il ne prévient pas à lui seul les attaques de traversée.
OWASP :
- A5:2017-Contrôle d'accès rompu
- A01:2021-Contrôle d'accès rompu
règles_lgpl_javascript_règle-parcours-tar-chemin-surcharge¶
Résumé :
Limitation inappropriée d'un chemin d'accès à un répertoire restreint ('Traversée de chemin')
Sévérité : Moyenne
CWE : CWE-22
Description :
Cette application extrait des archives TAR en utilisant le package tar-stream avec fs.createWriteStream(), fs.writeFile() ou fs.writeFileSync() dans un gestionnaire d'événements 'entry' sans correctement assainir les chemins d'accès des entrées. Des archives TAR malveillantes peuvent contenir des entrées avec des séquences de traversée de chemin (par exemple, ../../etc/cron.d/backdoor) qui permettent aux attaquants d'écrire des fichiers arbitraires en dehors du répertoire d'extraction prévu, ce qui peut potentiellement mener à une injection de code, à une compromission du système ou à une élévation de privilèges en écrasant des fichiers système critiques.
Remédiation :
Envisagez de valider tous les chemins d'entrée dans le gestionnaire d'événements 'entry' en vérifiant les séquences de traversée de chemin à l'aide de header.name.indexOf('..') !== -1 avant d'écrire des fichiers. Il est recommandé de normaliser les chemins avec path.basename() pour supprimer les composants de répertoire et de les combiner avec path.join() lors de la construction des chemins d'extraction. Par exemple, utilisez fs.createWriteStream(path.join(extractDir, path.basename(header.name))) au lieu d'utiliser directement header.name. De plus, utilisez path.resolve() pour obtenir le chemin absolu et vérifiez qu'il commence par votre répertoire d'extraction prévu avant l'écriture, en rejetant toute entrée qui dépasse la limite. Envisagez de mettre en œuvre une liste blanche d'extensions de fichiers autorisées et de rejeter les archives contenant des liens symboliques ou des liens physiques qui pourraient être utilisés pour des attaques de traversée.
OWASP :
- A5:2017-Contrôle d'accès compromis
- A01:2021-Contrôle d'accès compromis
règles_lgpl_règle_traversée_javascript-chemin-zip-surcharge¶
Résumé :
Limitations inappropriées d'un chemin d'accès à un répertoire restreint ('Traversée de chemin')
Gravité : Moyenne
CWE : CWE-22
Description :
Cette application extrait des archives ZIP en utilisant le package unzipper avec fs.createWriteStream(), fs.writeFile() ou fs.writeFileSync() dans un gestionnaire d'événements 'entry' sans bien nettoyer les chemins d'entrée. Le modèle détecte les cas où entry.path est utilisé directement pour écrire des fichiers sans validation en utilisant path.basename() ou en vérifiant les séquences de traversée de chemin avec indexOf(). Les archives ZIP malveillantes peuvent contenir des entrées avec des séquences de traversée (par exemple, ../../var/www/shell.php) qui permettent aux attaquants d'écrire des fichiers arbitraires en dehors du répertoire d'extraction prévu, ce qui peut mener à une exécution de code à distance ou à une compromission du système.
Remédiation :
Envisagez de nettoyer tous les chemins d'entrée avant d'écrire des fichiers en validant d'abord avec entry.path.indexOf('..') pour détecter les séquences de traversée et rejeter les entrées malveillantes. Il est recommandé d'utiliser path.basename(entry.path) pour extraire uniquement le composant du nom de fichier, puis de le combiner avec un répertoire d'extraction sûr en utilisant path.join(extractDir, path.basename(entry.path)). Pour préserver la structure des répertoires en toute sécurité, normalisez le chemin et vérifiez qu'il reste dans les limites en utilisant path.resolve() pour obtenir le chemin absolu et en vérifiant s'il commence par votre répertoire d'extraction. Par exemple : const safePath = path.resolve(extractDir, entry.path); if (!safePath.startsWith(extractDir)) rejeter. De plus, mettez en œuvre une liste blanche des extensions de fichiers autorisées et envisagez de valider le contenu de l'archive avant l'extraction pour prévenir les vulnérabilités d'upload de fichiers non restreints.
OWASP :
- A5:2017-Control d'accès rompu
- A01:2021-Control d'accès rompu
rules_lgpl_javascript_headers_rule-cookie-session-default¶
Résumé :
Identifiants insuffisamment protégés
Sévérité : Info
CWE : CWE-522
Description :
L'application utilise les middleware cookie-session ou express-session avec
le nom de cookie par défaut (typiquement 'connect.sid' pour express-session ou
'session' pour cookie-session), ce qui fournit des informations inutiles aux
attaquants potentiels concernant la pile technologique utilisée. Cette divulgation
d'informations permet aux attaquants d'identifier le serveur et d'adapter les
attaques spécifiquement aux vulnérabilités connues dans les frameworks ou
versions de middleware détectés. Bien que cela ne soit pas directement exploitable,
cela réduit l'effort requis pour la reconnaissance lors des attaques ciblées.
Remédiation :
Envisagez de définir un nom de cookie personnalisé en utilisant l'option name dans la
configuration de votre middleware de session, comme session({ name: 'sid' }) ou
un autre identifiant non descriptif. Choisissez un nom générique qui ne révèle pas
d'informations sur votre pile technologique ou votre approche de gestion des sessions.
C'est une mesure de défense en profondeur qui complique la reconnaissance pour
les attaquants. Notez que changer le nom du cookie à lui seul ne fournit pas une
sécurité forte, donc assurez-vous que d'autres contrôles de sécurité de session comme
les drapeaux secure, httpOnly et sameSite sont correctement configurés. Certains
scanners et audits de sécurité requièrent des noms de cookies personnalisés dans le
cadre de leurs critères de conformité.
OWASP :
- A2:2017-Authentication Brisée
- A07:2021-Échecs d'Identification et d'Authentification
règles_lgpl_javascript_headers_rule-cookie-session-no-domain¶
Résumé :
Informations sur des identifiants insuffisamment protégés
Gravité : Info
CWE : CWE-522
Description :
L'application utilise le middleware cookie-session ou express-session sans
configurer explicitement l'attribut domain dans les options de cookie, ce qui
signifie que le cookie par défaut sera associé au domaine exact qui l'a défini. Bien que ce
comportement par défaut soit souvent sécurisé pour les applications à domaine unique, il peut
entraîner des problèmes dans des environnements à plusieurs sous-domaines où le partage
ou l'isolement de session n'est pas clairement défini. Ne pas définir l'attribut de domaine peut
provoquer des comportements inattendus lorsque les applications s'étendent sur plusieurs
sous-domaines ou lors de la migration entre différentes configurations de domaine.
Remédiation :
Envisagez de définir explicitement l'attribut domain dans votre configuration de
middleware de session en fonction des besoins de votre application. Pour les
applications à domaine unique, vous pouvez définir domain: 'example.com' pour restreindre
les cookies à ce domaine spécifique. Pour les applications qui ont besoin de partager des
sessions entre sous-domaines, utilisez domain: '.example.com' (avec un point au début)
pour permettre aux cookies d'être envoyés à tous les sous-domaines. Soyez prudent avec le
partage entre sous-domaines, car cela peut augmenter la surface d'attaque si un sous-domaine
est compromis. Pour les applications qui ne doivent pas partager des sessions entre
sous-domaines, soit omettez l'attribut de domaine, soit définissez-le explicitement sur le
sous-domaine actuel. Documentez votre choix de configuration de domaine dans le code afin
d'éviter des problèmes de sécurité lors des changements d'infrastructure.
OWASP :
- A2:2017-Authentification compromise
- A07:2021-Échecs d'identification et d'authentification
rules_lgpl_javascript_headers_rule-cookie-session-no-maxage¶
Résumé :
Expiration de session insuffisante
Sévérité : Info
CWE : CWE-613
Description :
L'application utilise le middleware cookie-session ou express-session sans
configurer l'attribut maxAge dans les options de cookie, ce qui entraîne des
cookies de session persistants comme des cookies de session de navigateur qui
sont supprimés lorsque le navigateur se ferme. Bien que ce comportement par défaut
fournisse une certaine sécurité en limitant la durée de vie de la session, cela
peut entraîner une mauvaise expérience utilisateur avec des demandes fréquentes de
ré-authentification et ne fournit pas de contrôle explicite sur la durée de la
session. Sans un maxAge défini, la gestion de la durée de vie de la session
dépend entièrement du comportement du navigateur, qui varie selon les différents
navigateurs et configurations utilisateur.
Remédiation :
Envisagez de définir une valeur appropriée pour maxAge en millisecondes dans la
configuration de votre middleware de session, comme session({ cookie: { maxAge: 3600000
} }) pour une session d'1 heure. La valeur appropriée dépend des exigences de sécurité
de votre application et des besoins d'expérience utilisateur - des durées plus courtes
(15-30 minutes) sont plus sécurisées pour les applications sensibles, tandis que des
durées plus longues (heures ou jours) peuvent être acceptables pour des applications à
risque plus faible. N'oubliez pas que maxAge est spécifié en millisecondes, donc
utilisez des constantes ou des calculs comme 24 * 60 * 60 * 1000 pour plus de clarté.
Pour les applications à haute sécurité, envisagez de mettre en œuvre une expiration de
session glissante en mettant à jour le maxAge à chaque demande. Envisagez également
d'implémenter à la fois un délai d'inactivité (maxAge) et un délai de session absolu
pour une défense en profondeur.
OWASP :
- A2:2017-Authentification rompue
- A07:2021-Échecs d'identification et d'authentification
règles_lgpl_javascript_headers_rule-cookie-session-no-path¶
Résumé :
Identifiants insuffisamment protégés
Gravité : Info
CWE : CWE-522
Description :
L’application utilise le middleware cookie-session ou express-session sans configurer explicitement l’attribut path dans les options du cookie, qui par défaut est '/' et rend le cookie accessible à tous les chemins du domaine. Bien que ce paramètre par défaut soit souvent approprié pour les applications où l'authentification s'applique à l'ensemble du site, il peut entraîner des problèmes de sécurité dans des environnements d'hébergement partagé ou lorsque plusieurs applications fonctionnent sur différents chemins du même domaine. Ne pas définir explicitement l'attribut path peut entraîner l'envoi inutile de cookies de session avec des requêtes vers des chemins d'application non liés, augmentant l'exposition aux attaques inter-applications.
Remédiation :
Envisagez de définir explicitement l'attribut path dans la configuration de votre middleware de session en fonction du modèle de déploiement de votre application. Pour la plupart des applications, utiliser path: '/' (le par défaut) est approprié et devrait être défini explicitement pour plus de clarté, comme session({ cookie: { path: '/' } }). Pour les applications montées sur des préfixes de chemin spécifiques (par exemple, '/app'), définissez path: '/app' pour restreindre la portée du cookie uniquement à ce chemin et à ses sous-chemins. Cela empêche le cookie d'être envoyé à d'autres applications sur le même domaine. Soyez prudent lors de la modification de l'attribut path en production, car cela peut rendre les sessions existantes inaccessibles. Documentez votre choix de configuration de chemin, en particulier dans les environnements où plusieurs applications partagent un domaine ou lors de l'utilisation de proxys inverses avec un routage basé sur le chemin.
OWASP :
- A2:2017-Authentification cassée
- A07:2021-Failles d'identification et d'authentification
rules_lgpl_javascript_xss_rule-xss-disable-mustache-escape¶
Résumé :
Aucun
Gravité : Avertissement
Description :
L'application définit escapeMarkup = false, ce qui désactive l'échappement des entités HTML dans les bibliothèques de rendu de templates comme Select2, Typeahead, ou d'autres composants UI qui utilisent cette option de configuration. Lorsque escapeMarkup est défini sur false, le contenu contrôlé par l'utilisateur est rendu directement dans le DOM sans convertir les caractères dangereux tels que <, >, et " en leurs équivalents d'entités HTML. Cela permet aux attaquants d'injecter du JavaScript malveillant via des champs de saisie, des options de menu déroulant ou des suggestions de saisie semi-automatique. La vulnérabilité est particulièrement dangereuse dans les interfaces de recherche et de saisie semi-automatique où l'entrée de l'utilisateur est immédiatement renvoyée dans l'UI. Les attaques XSS via ces vecteurs peuvent voler des jetons d'authentification, détourner des sessions utilisateur, ou effectuer des actions au nom de la victime.
Remédiation :
Envisagez de supprimer la configuration escapeMarkup: false et de vous fier au comportement d'échappement HTML par défaut de la bibliothèque, qui protège contre les XSS. Si vous devez rendre du contenu formaté dans des options de menu déroulant ou des résultats de typeahead, utilisez une approche plus sûre, comme fournir une fonction de template personnalisée qui sanitise explicitement les parties contrôlées par l'utilisateur tout en permettant une structure HTML sûre : templateResult: function(data) { return $('<div>').text(data.userInput).html(); }. Pour les bibliothèques comme Select2, utilisez la fonction escapeMarkup avec DOMPurify pour assainir le HTML tout en préservant le formatage : escapeMarkup: function(markup) { return DOMPurify.sanitize(markup); }. Implémentez des en-têtes de Content Security Policy (CSP) pour limiter l'impact XSS et validez toutes les entrées utilisateur côté serveur avant de les stocker ou de les afficher.