Aller au contenu

Règles Semgrep pour Java


java_password_rule-ConstantDBPassword

Résumé :

Utilisation de mots de passe codés en dur

Gravité : Critique

CWE : CWE-259

Description :

L'application utilise java.sql.DriverManager.getConnection() avec un mot de passe codé en dur en tant que chaîne littérale dans le troisième paramètre. Les mots de passe codés en dur intégrés directement dans le code source créent des risques de sécurité significatifs car ils ne peuvent pas être renouvelés sans modifications du code, sont visibles dans l'historique de contrôle de version et rendent impossible l'audit d'accès. Si le code source est compromis ou exposé par inadvertance, les informations d'identification de la base de données sont immédiatement accessibles aux attaquants. Ce schéma est particulièrement dangereux pour les connexions à la base de données car il fournit un accès direct aux magasins de données sensibles.

Remédiation :

Envisagez de charger les informations d'identification de la base de données à partir de sources externes sécurisées plutôt que de les coder en dur dans l'application. Pour les applications de production, il est recommandé d'utiliser un Système de Gestion de Clés (KMS) qui fournit des audits, des contrôles d'accès et une rotation simplifiée des informations d'identification. Pour Google Cloud Platform, utilisez Cloud Key Management (https://cloud.google.com/kms/docs) ; pour AWS, utilisez AWS Secrets Manager ou AWS KMS (https://aws.amazon.com/kms/) ; pour des solutions sur site ou agnostiques au cloud, envisagez HashiCorp Vault (https://www.vaultproject.io/). Alternativement, des variables d'environnement ou des fichiers de configuration sécurisés avec des permissions de système de fichiers restreintes peuvent être utilisés pour des déploiements plus simples. Lors de l'utilisation de Spring Boot, tirez parti des configurations application.properties ou application.yml avec des valeurs externalisées et envisagez Spring Cloud Config pour la gestion centralisée des informations d'identification à travers plusieurs services.

OWASP :

  • A2:2017-Authentication Brisée
  • A07:2021-Echecs d'Identification et d'Authentification

java_password_rule-EmptyDBPassword

Résumé :

Authentification manquante pour une fonction critique (base de données)

Gravité : Critique

CWE : CWE-306

Description :

L'application utilise java.sql.DriverManager.getConnection() avec une chaîne vide comme paramètre de mot de passe, ce qui entraîne des connexions à la base de données sans authentification. Cela contourne complètement les mécanismes d'authentification de la base de données et permet un accès non restreint à la base de données depuis n'importe quel chemin de code qui peut invoquer cette connexion. Les connexions à la base de données sans authentification sont extrêmement dangereuses car elles ne fournissent aucun contrôle d'accès, aucune trace d'audit des opérations effectuées et aucune possibilité de révoquer l'accès sans modifications de code. Même dans les environnements de développement, les connexions non authentifiées devraient être évitées pour prévenir la propagation de modèles non sécurisés aux déploiements en production.

Remédiation :

Il est recommandé de configurer le serveur de base de données pour exiger une authentification et de créer des utilisateurs de base de données dédiés avec les permissions minimales nécessaires pour l'application. Consultez la documentation de votre serveur de base de données pour la configuration de l'authentification (par exemple, pg_hba.conf de PostgreSQL, gestion des utilisateurs de MySQL, méthodes d'authentification d'Oracle). Une fois l'authentification activée, chargez les identifiants à partir de sources externes sécurisées, telles que des variables d'environnement, des fichiers de configuration sécurisés avec des permissions restreintes ou un Système de Gestion des Clés. Pour les environnements de production, envisagez d'utiliser AWS Secrets Manager, Google Cloud Secret Manager, Azure Key Vault ou HashiCorp Vault pour une gestion centralisée des identifiants avec des capacités de rotation automatique. Lors de l'utilisation de bibliothèques de mise en pool de connexions comme HikariCP ou Apache DBCP, configurez les identifiants via leurs propriétés DataSource plutôt que de les passer directement au DriverManager.

OWASP :

  • A2:2017-Autentification cassée
  • A07:2021-Échecs d'identification et d'authentification

règles_lgpl_java_webview_règle-webview-stockage-externe

Résumé :

Méthode ou fonction dangereuse exposée

Gravité : Critique

CWE : CWE-749

Description :

L'application appelle WebView.loadUrl() avec des chemins obtenus à partir de Environment.getExternalStorageDirectory() ou getExternalFilesDir(), chargeant des fichiers HTML ou JavaScript directement depuis le stockage externe dans un WebView. Le stockage externe sur Android est lisible et modifiable par toutes les applications ayant des autorisations de stockage (sur les appareils avant l'API 29) ou accessible par des applications malveillantes à travers des vulnérabilités de stockage scopé. Un attaquant peut remplacer des fichiers HTML/JS légitimes par un contenu malveillant qui s'exécute dans le contexte de sécurité du WebView, ce qui peut mener à des attaques XSS, au vol de credentials, ou à un accès non autorisé aux APIs accessibles via le WebView, y compris les interfaces JavaScript exposées via addJavascriptInterface().

Remédiation :

Envisagez de stocker le contenu web dans le stockage interne de l'application en utilisant Context.getFilesDir() ou emballez le contenu dans le répertoire d'actifs de l'application et chargez-le en utilisant des URLs file:///android_asset/. Le stockage interne est privé à l'application et protégé par les mécanismes de sandboxing d'Android, empêchant d'autres applications de modifier le contenu. Si vous devez charger du contenu fourni par l'utilisateur, il est recommandé d'utiliser un ContentProvider avec FileProvider pour servir des fichiers via des URIs content:// avec des autorisations explicites, ce qui fournit un accès contrôlé et empêche les modifications de fichiers arbitraires. Pour le contenu web dynamique qui change fréquemment, envisagez de charger depuis des points de terminaison HTTPS avec une validation de certificat appropriée et de mettre en œuvre des en-têtes Content Security Policy pour atténuer les risques d'injection. Ne jamais utiliser le stockage externe pour un contenu web sensible à la sécurité tel que des pages d'authentification, des formulaires de paiement ou des pages avec des interfaces JavaScript qui se rattachent à la fonctionnalité native d'Android.

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

Résumé :

Neutralisation inappropriée des séquences CRLF dans les en-têtes HTTP ('Séparation de réponse HTTP')

Gravité : Élevée

CWE : CWE-113

Description :

L'application transmet les entrées fournies par l'utilisateur à partir des méthodes HttpServletRequest telles que getParameter() ou getHeader() directement dans un constructeur javax.servlet.http.Cookie ou un appel à setValue() sans validation appropriée. La séparation de réponse HTTP se produit lorsque des caractères de retour chariot (CR \r) et de saut de ligne (LF \n) sont injectés dans les valeurs des cookies, permettant aux attaquants d'injecter la séquence \r\n pour manipuler les réponses HTTP. Cela pourrait permettre des attaques de pollution de cache ou de Cross-Site Scripting (XSS) en injectant des en-têtes supplémentaires ou des corps de réponse qui seront interprétés par le client ou les proxys de mise en cache intermédiaires.

Remédiation :

Envisagez de valider toutes les entrées fournies par l'utilisateur avant de les utiliser dans les valeurs de cookie en rejetant tous les caractères inférieurs à 0x21 ou les caractères : '"' ',' ';' '\' et 0x7f comme spécifié dans le RFC 6265. Les serveurs d'applications Java modernes tels qu'Apache Tomcat 8.0+ et les versions plus récentes de Jetty rejettent automatiquement les caractères \r et \n dans les cookies, mais une validation explicite fournit une défense en profondeur et assure la compatibilité entre les environnements. Il est recommandé d'implémenter une méthode de validation qui lance IllegalArgumentException pour les caractères invalides, ou d'utiliser org.apache.commons.text.StringEscapeUtils.escapeJava() pour échapper l'entrée avant de définir les valeurs de cookie. Soyez conscient que certains serveurs d'applications plus anciens peuvent ne pas fournir de protection automatique, rendant la validation des entrées critique pour la sécurité. Plus d'informations sur https://owasp.org/www-community/attacks/HTTP_Response_Splitting

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

Résumé :

Neutralisation incorrecte des séquences CRLF dans les en-têtes HTTP ('Fractionnement de la réponse HTTP')

Gravité : Élevée

CWE : CWE-113

Description :

L'application transmet directement les entrées fournies par l'utilisateur depuis des méthodes HttpServletRequest comme getParameter() ou getHeader() aux appels HttpServletResponse.setHeader() ou addHeader() sans validation appropriée. Le fractionnement de la réponse HTTP se produit lorsque les caractères de Retour Chariot (CR \r) et de Saut de Ligne (LF \n) sont injectés dans les en-têtes HTTP, permettant aux attaquants d'injecter la séquence \r\n pour diviser la réponse et injecter des en-têtes supplémentaires ou du contenu de réponse. Cela pourrait permettre des attaques de contamination du cache, de fixation de session, ou de Cross-Site Scripting (XSS) en manipulant la façon dont la réponse est interprétée par les clients ou les services de mise en cache en aval.

Remédiation :

Envisagez de valider toutes les entrées fournies par l'utilisateur avant de les utiliser dans les en-têtes de réponse HTTP en rejetant tous les caractères inférieurs à 0x21 ou les caractères : '"' ',' ';' '\' et 0x7f. Bien que certains serveurs d'applications Java comme Apache Tomcat encodent automatiquement les caractères CRLF en espace (0x20) dans les en-têtes de réponse, une validation explicite fournit une défense en profondeur et garantit la compatibilité entre différentes implémentations de serveur. Il est recommandé de mettre en œuvre une méthode de validation qui lance IllegalArgumentException pour les caractères invalides, ou d'utiliser org.apache.commons.text.StringEscapeUtils.escapeJava() pour sanitiser l'entrée avant d'appeler setHeader() ou addHeader(). Soyez conscient que certains anciens serveurs d'applications ou moins courants peuvent ne pas fournir de protection CRLF automatique, rendant la validation des entrées critique. Plus d'informations sur https://owasp.org/www-community/attacks/HTTP_Response_Splitting

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_inject_rule-CommandInjection

Résumé :

Neutralisation inappropriée des éléments spéciaux utilisés dans une commande OS ('Injection de Commande OS')

Gravité : Élevée

CWE : CWE-78

Description :

L'application utilise Runtime.exec(), ProcessBuilder.command(), ou le constructeur ProcessBuilder avec des entrées contrôlées par l'utilisateur, ce qui permet des attaques par injection de commandes OS. Cette vulnérabilité critique permet aux adversaires d'exécuter des commandes système arbitraires, pouvant mener à une compromission totale du système, une exfiltration de données, ou une déni de service. L'injection de commandes peut se produire lorsque l'entrée utilisateur est intégrée dans des chaînes de commandes, des arguments de commande, ou même des noms de fichiers passés à ces API Java sans validation ou assainissement appropriés.

Remédiation :

Envisagez d'utiliser ProcessBuilder avec une approche basée sur une liste d'arguments où chaque argument est un élément séparé du tableau, ce qui empêche l'interprétation du shell et l'injection de méta-caractères. Ne jamais passer les entrées utilisateur directement dans les chaînes de commandes ou utiliser la concaténation de chaînes pour construire des commandes. Lorsque des noms de fichiers provenant de téléchargements d'utilisateur doivent être traités, générez des noms de fichiers aléatoires en utilisant UUID.randomUUID() et conservez le nom de fichier original séparément dans une base de données ou un fichier de métadonnées. Il est fortement recommandé d'utiliser des bibliothèques Java natives au lieu de faire appel à des commandes externes chaque fois que possible, afin d'éliminer complètement la surface d'attaque. Si les commandes OS sont inévitables, utilisez des chemins absolus vers les binaires (par exemple, /usr/bin/convert au lieu de convert) pour prévenir les vulnérabilités de recherche de chemin non fiable (CWE-426). Envisagez de mettre en œuvre une liste blanche de commandes et d'arguments autorisés, et validez toutes les entrées contre des modèles stricts avant utilisation. Plus de détails sur https://cheatsheetseries.owasp.org/cheatsheets/OS_Command_Injection_Defense_Cheat_Sheet.html

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_inject_rule-DemandeDeDiffusionDeFichier

Résumé :

Fichiers ou répertoires accessibles aux parties externes

Gravité : Élevée

CWE : CWE-552

Description :

L'application utilise HttpServletRequest.getRequestDispatcher() suivi de RequestDispatcher.include() ou RequestDispatcher.forward() avec une entrée contrôlée par l'utilisateur, ce qui peut exposer des fichiers sensibles dans le contexte de l'application web. Ces méthodes résolvent et retournent tout fichier accessible à l'application, y compris les fichiers de configuration web.xml, les fichiers .class compilés, le code source JSP, les archives JAR/WAR et d'autres ressources qui devraient rester internes. Cette vulnérabilité de divulgation de fichiers permet aux adversaires de lire le code source de l'application, d'extraire les identifiants de base de données des fichiers de configuration, de découvrir la structure de l'application et de rassembler des informations pour des attaques ultérieures.

Remédiation :

Envisagez d'utiliser une approche de table de recherche où l'entrée utilisateur est validée par rapport à une HashMap ou à une énumération de noms de vues autorisés, puis mappée à des chemins de ressources codés en dur avant d'appeler getRequestDispatcher(). Ne jamais passer les entrées de l'utilisateur directement à getRequestDispatcher() ou autoriser les segments de chemin contrôlés par l'utilisateur. En alternative, utilisez HttpServletResponse.sendRedirect() pour effectuer des redirections HTTP 301/302 qui sont plus sûres que les transferts internes car elles n'exposent pas la structure interne de l'application et forcent un nouveau cycle de requête. Lors de l'utilisation d'une table de recherche, utilisez HashMap.getOrDefault() pour fournir une vue de secours sûre lorsque l'entrée de l'utilisateur ne correspond à aucune valeur autorisée. Pour les applications Spring MVC, reposez-vous sur le mécanisme de résolution des vues du framework avec des méthodes de contrôleur retournant des noms de vues logiques plutôt que de construire directement des chemins. Envisagez de mettre en œuvre une validation stricte de liste blanche qui n'autorise que les caractères alphanumériques pour tout identifiant de vue fourni par l'utilisateur, et enregistrez toutes les tentatives d'accès à des ressources en dehors de l'ensemble autorisé pour le suivi de la sécurité.

OWASP :

  • A5:2017-Contrôle d'Accès Fissuré
  • A01:2021-Contrôle d'Accès Fissuré

java_inject_rule-FinDeFichierSpringFramework

Résumé :

Fichiers ou répertoires accessibles aux parties externes

Sévérité : Élevée

CWE : CWE-552

Description :

L'application utilise le constructeur org.springframework.web.servlet.ModelAndView ou la méthode ModelAndView.setViewName() avec une entrée contrôlée par l'utilisateur, ce qui peut exposer des fichiers JSP restreints et d'autres ressources de vue. La classe ModelAndView de Spring résout les noms de vue via des ViewResolvers configurés, en recherchant généralement des fichiers .jsp ou d'autres ressources de template. Lorsque les noms de vue sont dérivés d'une entrée utilisateur sans validation, des adversaires peuvent manipuler le chemin pour accéder aux fichiers JSP, fichiers de configuration ou autres ressources qui ne devraient pas être accessibles directement. Cette vulnérabilité est particulièrement critique dans les applications Spring MVC où le mécanisme de résolution de vue pourrait permettre un traversal de répertoire ou l'accès à des vues internes de l'application qui ne sont pas destinées aux utilisateurs externes.

Remédiation :

Envisagez d'utiliser le modèle standard de contrôleur de Spring MVC où les méthodes retournent des noms de vue logiques qui sont résolus via des ViewResolvers configurés, et utilisez une table de recherche ou une énumération pour mapper l'entrée de l'utilisateur aux noms de vue autorisés avant de construire des objets ModelAndView. Ne passez jamais directement l'entrée utilisateur au constructeur ModelAndView ou à la méthode setViewName(). Lorsque différentes vues doivent être sélectionnées en fonction de l'entrée de l'utilisateur, validez l'entrée par rapport à une liste blanche d'identifiants de vue autorisés en utilisant HashMap.getOrDefault() ou une instruction switch avec seulement des noms de vue sûrs connus. Envisagez d'utiliser des préfixes de redirection comme redirect:/path dans les noms de vue pour effectuer des redirections HTTP plutôt que des transferts internes, ce qui offre une meilleure isolation. Pour les applications utilisant Thymeleaf, FreeMarker ou d'autres moteurs de template, assurez-vous que la configuration du ViewResolver restreint la résolution des templates à des répertoires spécifiques et n'autorise pas les séquences de traversal de chemin. Implémentez une journalisation des demandes de noms de vue invalides pour détecter d'éventuelles tentatives d'exploitation. Les applications Spring modernes devraient envisager d'utiliser @ResponseBody avec des points de terminaison REST et un routage côté client plutôt que la résolution de vue côté serveur pour améliorer la sécurité et l'architecture.

OWASP :

  • A5:2017-Contrôle d'Accès Rompu
  • A01:2021-Contrôle d'Accès Rompu

java_inject_rule-OgnlInjection

Résumé :

Injection d'expressions (OGNL)

Sévérité : Élevée

CWE : CWE-917

Description :

L'application utilise les méthodes d'évaluation du langage de navigation dans les graphiques d'objets (OGNL) des packages Apache Struts2 tels que OgnlUtil.getValue(), OgnlUtil.setValue(), OgnlUtil.compile(), TextParseUtil.translateVariables(), ValueStack.findValue(), OgnlReflectionProvider.setProperty(), ou StrutsUtil.findValue() avec des entrées contrôlées par l'utilisateur, ce qui permet des attaques par injection OGNL. OGNL est un langage d'expression puissant utilisé par Struts2 pour accéder aux objets et propriétés Java dans le ActionContext, mais lorsque l'entrée de l'utilisateur est évaluée comme des expressions OGNL, cela permet aux adversaires d'exécuter du code Java arbitraire, y compris des commandes OS, par le biais de la réflexion et de la manipulation à l'exécution. Cette classe de vulnérabilité a été responsable de nombreuses exploits critiques d'exécution de code à distance dans les applications Struts2 et doit être considérée comme extrêmement dangereuse.

Remédiation :

Envisagez d'utiliser des balises Struts2 standard et des opérations sur la pile de valeurs au lieu de méthodes d'évaluation OGNL de bas niveau. Ne passez jamais directement l'entrée de l'utilisateur aux fonctions d'évaluation OGNL des packages com.opensymphony.xwork2.ognl, com.opensymphony.xwork2.util, com.opensymphony.xwork2.util.reflection, ou org.apache.struts2.util. En suivant les directives de sécurité officielles de Struts2, évitez d'utiliser des expressions brutes ${} dans les pages JSP et les modèles avec des données fournies par l'utilisateur. Lorsque l'accès dynamique aux propriétés est nécessaire, utilisez des setters et getters d'Action avec des noms de propriétés validés à partir d'une liste d'autorisation plutôt que d'évaluer des expressions OGNL arbitraires. Assurez-vous d'exécuter la dernière version corrigée de Struts2, car de nombreuses vulnérabilités d'injection OGNL ont été traitées par des mises à jour de framework et des correctifs de sécurité. Envisagez de migrer vers des frameworks plus modernes comme Spring MVC ou Jakarta EE qui ne reposent pas sur l'évaluation des expressions OGNL. Si vous devez prendre en charge des expressions dynamiques, mettez en œuvre une validation stricte des entrées et utilisez les fonctionnalités SecurityMemberAccess dans Struts2 pour restreindre l'accès aux classes et méthodes via OGNL. Plus d'informations sur https://struts.apache.org/security/#do-not-use-incoming-untrusted-user-input-in-forced-expression-evaluation

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_ldap_rule-AnonymousLDAP

Résumé :

Authentification manquante pour une fonction critique (LDAP)

Gravité : Élevée

CWE : CWE-306

Description :

L'application configure l'authentification LDAP anonyme en définissant Context.SECURITY_AUTHENTICATION sur "none" dans l'environnement de contexte JNDI. Cela désactive l'authentification lors de la communication avec le serveur LDAP, permettant à tout client de se connecter sans identifiants. L'accès LDAP anonyme expose le répertoire à des requêtes non autorisées et à une possible exfiltration de données, car il n'y a aucun contrôle d'accès pour restreindre quelles informations peuvent être récupérées ou quelles opérations peuvent être effectuées. Cette configuration viole le principe du moindre privilège et crée un risque de sécurité significatif, surtout lorsque le répertoire LDAP contient des données sensibles des utilisateurs, des identifiants ou des informations organisationnelles.

Remédiation :

Envisagez de configurer des identifiants d'authentification appropriés lors de l'établissement de connexions LDAP utilisant JNDI. Il est recommandé d'utiliser Context.SECURITY_PRINCIPAL et Context.SECURITY_CREDENTIALS pour spécifier le nom distinctif (DN) et le mot de passe pour l'authentification, plutôt que de définir Context.SECURITY_AUTHENTICATION sur "none". Envisagez de récupérer les identifiants LDAP à partir d'un magasin d'identifiants sécurisé ou d'un système de gestion de clés (KMS) plutôt que de les coder en dur. De plus, il est recommandé d'utiliser des arguments de recherche paramétrés avec InitialDirContext.search() pour prévenir les attaques par injection LDAP lors du traitement des entrées fournies par les utilisateurs.

Exemple de connexion LDAP sécurisée avec authentification et traitement de requêtes sûr :

// Créer des propriétés pour la configuration de la connexion LDAP
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
props.put(Context.PROVIDER_URL, "ldap://ldap.example.org:3889");

// Configurer les identifiants d'authentification (récupérer depuis un magasin sécurisé)
props.put(Context.SECURITY_PRINCIPAL, "cn=admin,dc=example,dc=org");
String ldapPassword = getAccountPasswordFromSecureStoreOrKMS();
props.put(Context.SECURITY_CREDENTIALS, ldapPassword);

// Établir une connexion LDAP authentifiée
InitialDirContext ldapContext = new InitialDirContext(props);

// Configurer les paramètres de recherche
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);

// Utiliser des requêtes paramétrées pour éviter l'injection LDAP
String userQuery = someUserInput;
Object[] searchArguments = new Object[]{userQuery};

// Exécuter la recherche avec encodage des paramètres automatique
NamingEnumeration answer = ldapContext.search(
  "dc=example,dc=org",
  "(cn={0})",
  searchArguments,
  searchControls
);

Pour plus d'informations sur les meilleures pratiques de sécurité LDAP, consultez : LDAP_Injection_Prevention_Cheat_Sheet.html

OWASP :

  • A2:2017-Authentification cassée
  • A07:2021-Failles d'identification et d'authentification

java_password_rule-HardcodePassword

Résumé :

Utilisation de mots de passe en dur

Sévérité : Élevée

CWE : CWE-259

Description :

L'application utilise des chaînes de caractères de mots de passe en dur avec des API Java sensibles à la sécurité, y compris java.security.KeyStore.PasswordProtection(), KeyStore.load(), KeyManagerFactory.init(), javax.security.auth.callback.PasswordCallback.setPassword(), javax.crypto.spec.PBEKeySpec, java.net.PasswordAuthentication, javax.security.auth.kerberos.KerberosKey, java.sql.DriverManager.getConnection(), io.vertx.ext.web.handler.CSRFHandler.create(), et des méthodes génériques setPassword(). Les mots de passe en dur créent de nombreuses vulnérabilités de sécurité : ils sont visibles dans les dépôts de code source et l'historique de contrôle de version, ne peuvent pas être changés sans redéployer l'application, rendent impossible la tenue de registres d'audit, et ne fournissent aucun mécanisme de révocation d'accès. Ce modèle affecte des composants de sécurité critiques, y compris le chiffrement des keystores, la gestion des certificats SSL/TLS, l'authentification des bases de données, l'authentification Kerberos et les systèmes de chiffrement basés sur des mots de passe.

Remédiation :

Envisagez de charger les identifiants à partir de sources de configuration externes sécurisées plutôt que de les intégrer dans le code source. Pour les environnements de production, il est recommandé d'utiliser un système de gestion des clés (KMS) qui fournit des audits des identifiants, des contrôles d'accès et une rotation automatisée - comme AWS Secrets Manager, Google Cloud Secret Manager, Azure Key Vault ou HashiCorp Vault. Pour des déploiements plus simples, utilisez des variables d'environnement accessibles via System.getenv() ou des fichiers de propriétés sécurisées avec des permissions de système de fichiers restreintes chargées via java.util.Properties. Lorsque vous travaillez avec des keystores et des certificats SSL/TLS, envisagez d'utiliser le type de keystore JCEKS de Java avec des mots de passe externalisés, et tirez parti d'outils comme keytool pour une gestion sécurisée des keystores. Pour les identifiants de base de données dans les applications Spring, utilisez la configuration externalisée de Spring Boot avec des propriétés chiffrées via Jasypt ou Spring Cloud Config Server. Pour le chiffrement PBE, dérivez les clés à partir de phrases de passe fournies par l'utilisateur à l'exécution plutôt que de les coder en dur. Important : assurez-vous que tout plan de migration inclut la rotation de tous les identifiants précédemment codés en dur, car ils doivent être considérés comme compromis dès qu'ils sont engagés dans le contrôle de version.

OWASP :

  • A2:2017-Authentification rompue
  • A07:2021-Failles d'identification et d'authentification

java_rule_sql_injection

Résumé :

Requête SQL non sécurisée avec des paramètres non paramétrés en Java

Sévérité : Élevée

CWE : CWE-89

Description :

Une vulnérabilité d'injection SQL a été détectée où des entrées contrôlées par l'utilisateur sont intégrées de manière non sécurisée dans une requête SQL par concaténation de chaînes (en utilisant +), formatage de chaînes (en utilisant .format() ou .formatted()), ou espaces réservés entre guillemets ('%s'). La requête est exécutée à l'aide de méthodes telles que executeQuery(), executeUpdate(), execute(), ou d'autres fonctions d'exécution SQL similaires dans JDBC, Spring JdbcTemplate, ou d'autres API de base de données. L'injection SQL se produit lorsque des données non fiables sont directement intégrées dans des déclarations SQL sans une désinfection ou une paramétrisation appropriée, permettant aux attaquants de manipuler la logique de la requête, de contourner l'authentification, d'extraire des données sensibles, de modifier ou de supprimer des enregistrements, ou d'exécuter des commandes SQL arbitraires contre la base de données.

Remédiation :

Envisagez d'utiliser des requêtes paramétrées (également connues sous le nom de déclarations préparées) avec des espaces réservés de paramètres positionnels (?) ou nommés (:param) au lieu de méthodes de concaténation de chaînes ou de formatage de chaînes. Il est recommandé d'utiliser des frameworks établis qui offrent une protection intégrée contre les injections SQL, tels que JDBC PreparedStatement, Spring JdbcTemplate, JPA/Hibernate Query API, ou d'autres bibliothèques ORM réputées. Ces frameworks traitent les entrées utilisateurs séparément de la structure de commande SQL, garantissant que les données utilisateurs sont correctement échappées et ne peuvent pas altérer la logique de la requête. Envisagez de valider et de désinfecter toutes les entrées contrôlées par l'utilisateur avant utilisation, même en utilisant des requêtes paramétrées, comme mesure de défense supplémentaire en profondeur.

Exemple de requête SQL sécurisée utilisant JDBC PreparedStatement avec des paramètres positionnels :

// Non sécurisé : La concaténation de chaînes permet l'injection SQL
// String query = "SELECT * FROM users WHERE username = '" + username + "'";

// Sécurisé : Utilisez PreparedStatement avec des paramètres positionnels
String query = "SELECT * FROM users WHERE username = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, username);
ResultSet results = stmt.executeQuery();

Exemple de requête SQL sécurisée utilisant Spring JdbcTemplate avec des paramètres positionnels :

// Non sécurisé : La concaténation de chaînes ou .format()
// String query = String.format("INSERT INTO EMPLOYEE VALUES ('%s', '%s')",
//                              id, name);

// Sécurisé : Utilisez des paramètres positionnels avec JdbcTemplate
jdbcTemplate.update(
  "INSERT INTO EMPLOYEE VALUES (?, ?, ?, ?)",
  id, "Bill", "Gates", "USA"
);

Exemple de requête SQL sécurisée utilisant JPA avec des paramètres nommés :

// Sécurisé : Utilisez des paramètres nommés dans les requêtes JPA
String jpql = "SELECT u FROM User u WHERE u.username = :username";
TypedQuery<User> query = entityManager.createQuery(jpql, User.class);
query.setParameter("username", username);
List<User> results = query.getResultList();

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_script_rule-InjectionDeScript

Résumé :

Contrôle inapproprié de la génération de code ('Injection de Code')

Sévérité : Élevée

CWE : CWE-94

Description :

Les entrées contrôlées par l'utilisateur sont passées aux méthodes javax.script.ScriptEngine.eval() ou javax.script.Invocable sans une sanitation appropriée. Cela permet aux attaquants d'exécuter du code arbitraire, y compris des commandes système via des expressions comme java.lang.Runtime.getRuntime().exec('/bin/sh'), conduisant à un compromis complet du système.

Remédiation :

Ne jamais passer directement des entrées fournies par l'utilisateur aux méthodes ScriptEngine.eval() ou Invocable. Envisagez de coder en dur tout le contenu du script ou d'utiliser une table de correspondance pour mapper les entrées de l'utilisateur à des valeurs sûres prédéfinies. Si des valeurs dynamiques sont nécessaires, il est recommandé d'utiliser javax.script.Bindings pour passer les entrées de l'utilisateur en tant que données plutôt qu'en tant que code (par exemple, bindings.put("name", userInput); eval(script, bindings)). Cela garantit que les entrées de l'utilisateur sont traitées comme des données de chaîne et ne peuvent pas être exécutées en tant que code.

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_script_rule-SpringSpelExpressionParser

Résumé :

Neutralisation incorrecte des éléments spéciaux utilisés dans une déclaration de langage d'expression ('Injection de langage d'expression')

Sévérité : Élevée

CWE : CWE-917

Description :

L'entrée contrôlée par l'utilisateur est transmise aux méthodes SpelExpressionParser.parseExpression() ou parseRaw() du Spring Framework sans validation appropriée. Cela permet aux attaquants d'injecter et d'exécuter des expressions SpEL arbitraires, accédant potentiellement à des objets Java sensibles à l'exécution, invoquant des méthodes et exécutant des commandes système, ce qui peut mener à un compromis total du système.

Remédiation :

Ne jamais transmettre directement l'entrée fournie par l'utilisateur aux méthodes parseExpression() ou parseRaw(). Envisagez d'utiliser une table de correspondance pour mapper l'entrée utilisateur à des expressions sûres prédéfinies. Si une évaluation dynamique est nécessaire, il est recommandé d'utiliser SimpleEvaluationContext (Spring 4.3+) au lieu de StandardEvaluationContext lors de l'appel à getValue() sur des expressions analysées (par exemple, parsedExpr.getValue(SimpleEvaluationContext.forReadOnlyDataBinding().build())). Notez qu' même avec SimpleEvaluationContext, les attaquants peuvent accéder aux propriétés publiques des objets liés, donc utilisez avec prudence et minimisez les données exposées.

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_templateinjection_rule-TemplateInjection

Résumé :

Contrôle inadéquat de la génération de code ('Injection de Code')

Gravité : Élevée

CWE : CWE-94

Description :

L'application permet de contrôler les chaînes de modèles en passant dynamiquement les entrées utilisateur aux méthodes Velocity.evaluate(), getTemplate() ou process(). Cela permet aux adversaires d'exécuter du code Java arbitraire, y compris des commandes système OS, par le biais d'attaques par injection de template.

Remédiation :

Considérez l'utilisation d'un objet VelocityContext pour lier en toute sécurité les données fournies par l'utilisateur au lieu de les passer directement dans les chaînes de modèles. N'appelez jamais Velocity.evaluate() avec les entrées utilisateur dans le paramètre de modèle. Il est recommandé d'utiliser context.put(key, value) pour passer les données utilisateur, ce qui les traite comme des données plutôt que comme du code de modèle exécutable. Pour les moteurs FreeMarker et Pebble, utilisez des noms de modèles codés en dur avec getTemplate("fixed-name") et passez les entrées utilisateur uniquement par le biais du contexte de données.

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_xml_rule-XmlDecoder

Résumé :

Désérialisation de données non fiables

Sévérité : Élevée

CWE : CWE-502

Description :

L'application utilise java.beans.XMLDecoder.readObject() pour désérialiser des données XML, ce qui est vulnérable aux attaques d'exécution de code arbitraire. XMLDecoder interprète le XML comme du code Java exécutable en utilisant les conventions JavaBeans, permettant aux adversaires de créer des XML malveillants qui instancient des classes arbitraires et invoquent des méthodes lors de la désérialisation. Cela peut conduire à une exécution de code à distance, car les attaquants peuvent appeler des constructeurs ou des méthodes de définition qui déclenchent des opérations dangereuses. Contrairement à la désérialisation Java standard, XMLDecoder traite le XML non fiable directement lors de l'instanciation d'objets sans protections intégrées, ce qui le rend particulièrement dangereux pour le traitement des entrées contrôlées par l'utilisateur. Des exploits publics existent (comme ysoserial) qui peuvent générer automatiquement des charges utiles pour exploiter les vulnérabilités de XMLDecoder.

Remédiation :

Envisagez de migrer complètement de XMLEncoder et XMLDecoder, car ces API sont intrinsèquement non sécurisées et obsolètes pour des raisons de sécurité. Les alternatives recommandées incluent des bibliothèques de sérialisation JSON comme Jackson ou Gson, qui fournissent une désérialisation sûre en type avec des restrictions configurables sur les classes autorisées. Si vous devez continuer à utiliser XMLDecoder temporairement, implémentez un ClassLoader personnalisé qui met explicitement sur liste blanche uniquement les classes de bean spécifiques dont votre application a besoin, rejetant toutes les autres tentatives de chargement de classe. Même avec un ClassLoader personnalisé, soyez conscient qu'il s'agit d'une mesure de défense en profondeur et non d'une solution complète, car des vulnérabilités subtiles peuvent encore exister. Assurez-vous de ne jamais désérialiser vers des types de base comme Object, de toujours caster vers le type exact attendu, et envisagez de créer des DTO intermédiaires avec uniquement les champs nécessaires pour se protéger contre les attaques de masse d'attribution. Des conseils supplémentaires sont disponibles dans la OWASP Deserialization Cheat Sheet à l'adresse suivante : https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html

OWASP :

  • A8:2017-Désérialisation non sécurisée
  • A08:2021-Failles d'intégrité logicielle et des données

java_xss_injection

Résumé :

Vulnérabilité XSS dans une application web Java

Gravité : Élevée

CWE : CWE-79

Description :

Une vulnérabilité de type Cross-Site Scripting (XSS) a été détectée où des données non fiables transitent des variables dérivées de la requête vers les API de rendu côté serveur sans échapper ou encoder correctement. La règle détecte le flux de contamination depuis des sources telles que les annotations @RequestParam et @PathVariable de Spring, les paramètres FacesContext de JSF, les paramètres ActionContext de Struts, les méthodes Window.Location de GWT, et les méthodes standards de requête de servlet vers des puits incluant les méthodes HttpServletResponse.getWriter(), JSF ResponseWriter.write(), les attributs de modèle Spring MVC, les constructeurs HTML/HTMLPanel de GWT, et les setters de propriétés JavaBeans dans les beans gérés. Sans un encodage de sortie contextuel, les attaquants peuvent injecter des scripts JavaScript malveillants qui s’exécutent dans les navigateurs des victimes, pouvant conduire à un détournement de session, un vol d'identifiants, du phishing ou une prise de contrôle complète du compte.

Remédiation :

Envisagez d'utiliser des fonctions d'encodage de sortie spécifiques au framework appropriés au contexte de rendu. Pour les applications Spring, utilisez HtmlUtils.htmlEscape() lors de l'ajout de données aux attributs de modèle. Pour les applications JSF, assurez-vous que l'auto-échappement est activé (c'est par défaut) et évitez d'utiliser h:outputText escape="false". Pour les réponses de servlet simples, utilisez org.apache.commons.text.StringEscapeUtils.escapeHtml4() ou Encode.forHtml() de OWASP Java Encoder. Pour les applications GWT, utilisez SafeHtmlUtils.fromString() au lieu de construire des objets HTML/HTMLPanel directement à partir de chaînes. Lorsque des données seront intégrées dans des contextes JavaScript, utilisez Encode.forJavaScript(), pour CSS utilisez Encode.forCssString(), et pour les URLs utilisez Encode.forUriComponent(). Les moteurs de template modernes comme Thymeleaf offrent un échappement automatique contextuel et devraient être préférés à la construction manuelle de chaînes. Implémentez des en-têtes Content Security Policy (CSP) avec des directives restrictives comme défense en profondeur.

OWASP :

- A03:2021-Injection

java_crypto_rule-BlowfishKeySize

Résumé :

Force de chiffrement inadéquate

Gravité : Moyenne

CWE : CWE-326

Description :

L'application utilise KeyGenerator.getInstance("Blowfish") avec une taille de clé inférieure à 128 bits, ce qui peut rendre le texte chiffré vulnérable aux attaques par birthday. L'algorithme de chiffrement Blowfish a été créé en 1993 comme un remplacement direct du DES et a une taille de bloc de 64 bits. Cette taille de bloc limitée signifie que Blowfish ne doit jamais être utilisé pour chiffrer des fichiers de plus de 4 Go, car les attaques par birthday deviennent pratiques avec environ 32 Go de données chiffrées sous la même clé. Les applications modernes nécessitant un chiffrement fort devraient migrer complètement de Blowfish en raison de ces limitations fondamentales.

Remédiation :

Envisagez de migrer vers KeyGenerator.getInstance("AES") avec une taille de clé d'au moins 256 bits pour les besoins de chiffrement symétrique moderne. AES fournit une taille de bloc de 128 bits qui est résistante aux attaques par birthday et est largement supportée à travers les versions de Java. Lors de l'initialisation du KeyGenerator, utilisez keyGenerator.init(256) pour spécifier la taille de la clé. Pour les applications qui doivent absolument continuer à utiliser Blowfish temporairement, augmentez la taille de clé à au moins 256 bits en appelant keyGenerator.init(256) après avoir obtenu l'instance du KeyGenerator Blowfish. Plus d'informations sur la cryptographie Java sont disponibles sur : java-cryptography-architecture-jca-reference-guide.html

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Failles cryptographiques

java_crypto_rule-CipherDESInsecure

Résumé :

Force de chiffrement inadéquate

Gravité : Moyenne

CWE : CWE-326

Description :

L'application utilise Cipher.getInstance("DES/...") qui implémente le Standard de Chiffrement de Données (DES), un algorithme cryptographique obsolète. DES a une taille de clé de 56 bits et une taille de bloc de 64 bits, ce qui le rend vulnérable aux attaques par force brute et aux attaques par anniversaire. La puissance de calcul moderne peut casser le chiffrement DES en quelques heures ou jours, et il a été officiellement déclaré obsolète par le NIST depuis 2005. DES et ses variantes manquent d'intégrité des messages intégrée, ce qui signifie que la falsification du texte chiffré ne peut pas être détectée, permettant potentiellement aux adversaires de manipuler les données chiffrées sans détection.

Remédiation :

Envisagez de migrer vers Cipher.getInstance("ChaCha20-Poly1305/None/NoPadding") qui offre un chiffrement authentifié avec intégrité des messages intégrée. ChaCha20-Poly1305 est plus rapide que l'AES-GCM sur les systèmes sans accélération matérielle AES et est plus facile à utiliser correctement. Pour les applications nécessitant une compatibilité AES, utilisez Cipher.getInstance("AES/GCM/NoPadding") avec au moins une clé de 256 bits et assurez-vous que des nonces uniques sont générés pour chaque opération de chiffrement en utilisant SecureRandom. Lors de l'utilisation de l'AES-GCM, le réutilisation de nonce entraîne des échecs de sécurité catastrophiques qui peuvent exposer la clé de chiffrement. Pour la génération de nombres aléatoires, privilégiez SecureRandom.getInstance("DRBG") avec des DrbgParameters appropriés pour une sécurité renforcée. Plus d'informations disponibles sur : java-cryptography-architecture-jca-reference-guide.html

OWASP :

  • A3:2017-Exposition de Données Sensibles
  • A02:2021-Failles Cryptographiques

java_crypto_rule-CipherDESedeInsecure

Résumé :

Utilisation d'un algorithme cryptographique obsolète ou risqué

Gravité : Moyenne

CWE : CWE-327

Description :

L'application utilise Cipher.getInstance("DESede/...") qui met en œuvre Triple DES (3DES), un algorithme cryptographique obsolète. Bien que le 3DES applique DES trois fois avec des clés différentes pour atteindre une sécurité effective de 112 bits ou 168 bits, il souffre toujours de la limitation fondamentale de la taille de bloc de 64 bits de DES. Cette petite taille de bloc rend le 3DES vulnérable aux attaques d'anniversaire après avoir chiffré environ 32 Go de données sous la même clé. Le NIST a obsolète le 3DES pour de nouvelles applications et prévoit de l'interdire complètement. De plus, le 3DES manque d'intégrité de message intégrée, ce qui signifie que la falsification du texte chiffré ne peut pas être détectée.

Remédiation :

Envisagez de migrer vers Cipher.getInstance("ChaCha20-Poly1305/None/NoPadding") qui fournit un chiffrement authentifié avec des performances supérieures et une protection intégrée de l'intégrité des messages. ChaCha20-Poly1305 est recommandé pour les applications Java modernes car il est plus rapide que AES-GCM sur la plupart des matériels et plus simple à implémenter correctement. Pour les applications nécessitant une compatibilité AES, utilisez Cipher.getInstance("AES/GCM/NoPadding") avec au moins des clés de 256 bits et assurez-vous que des nonces uniques de 12 octets sont générées à l'aide de SecureRandom pour chaque opération de chiffrement. Lors de la génération de nonces ou d'IVs, utilisez SecureRandom.getInstance("DRBG") avec des paramètres Drbg configurés pour une force de sécurité appropriée (au moins 256 bits). Plus d'informations sur : java-cryptography-architecture-jca-reference-guide.html

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Failles cryptographiques

java_crypto_rule-CipherECBMode

Résumé :

Utilisation d'un algorithme cryptographique cassé ou risqué.

Gravité : Moyenne

CWE : CWE-327

Description :

L'application utilise Cipher.getInstance() avec le mode ECB (Electronic Codebook), tel que "AES/ECB/PKCS5Padding" ou "DES/ECB/NoPadding". Le mode ECB est fondamentalement non sécurisé car il chiffre des blocs de texte en clair identiques en blocs de texte chiffrés identiques, révélant ainsi des motifs dans les données chiffrées. Cela rend le mode ECB inadapté pour chiffrer des données plus grandes qu'un seul bloc, car les attaquants peuvent analyser les motifs du texte chiffré pour inférer des informations sur la structure du texte en clair. De plus, le mode ECB ne fournit aucune protection d'intégrité des messages, permettant ainsi aux adversaires de falsifier le texte chiffré sans détection.

Remédiation :

Envisagez de migrer vers Cipher.getInstance("ChaCha20-Poly1305/None/NoPadding"), qui fournit un chiffrement authentifié avec une intégrité de message intégrée et élimine le besoin de configuration manuelle des modes. ChaCha20-Poly1305 est recommandé pour les applications modernes car il est plus simple à utiliser correctement et plus rapide que l'AES-GCM sur la plupart des matériels. Pour les applications nécessitant l'AES, utilisez Cipher.getInstance("AES/GCM/NoPadding"), qui fournit un chiffrement authentifié avec des tailles de bloc de 128 bits. Lors de l'utilisation d'AES-GCM, assurez-vous que des nonces uniques de 12 octets sont générées pour chaque chiffrement à l'aide de SecureRandom, car la réutilisation des nonces compromet catastrophiquement la sécurité. Évitez le mode CBC à moins qu'il ne soit spécifiquement requis, car il nécessite une gestion soigneuse des IV et ne fournit pas d'intégrité des messages. Plus d'informations à : java-cryptography-architecture-jca-reference-guide.html

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Échecs cryptographiques

java_crypto_rule-CipherIntegrity

Résumé :

Utilisation d'un algorithme cryptographique cassé ou risqué

Sévérité : Moyenne

CWE : CWE-327

Description :

L'application utilise Cipher.getInstance() avec des modes de chiffrement qui manquent de protection intégrée de l'intégrité des messages, y compris les modes CBC, CTR, CFB, OFB et ECB avec les algorithmes AES, DES, DESede ou RC4. Sans intégrité des messages, des adversaires peuvent falsifier le texte chiffré sans détection, ce qui peut conduire à des attaques de récupération de texte en clair ou à la compromission de la clé de chiffrement. Des modes comme CBC avec remplissage sont également vulnérables aux attaques par oracle de remplissage, tandis que le mode ECB révèle des motifs dans le texte en clair. Ces anciennes configurations de chiffrements nécessitent une mise en œuvre manuelle du chiffrement authentifié, ce qui est sujet à erreurs et souvent mal exécuté.

Remédiation :

Envisagez de migrer vers Cipher.getInstance("ChaCha20-Poly1305/None/NoPadding") qui fournit un chiffrement authentifié avec des données associées (AEAD) et une intégrité des messages intégrée. ChaCha20-Poly1305 est recommandé car il fonctionne bien sur toutes les plateformes matérielles et est plus simple à mettre en œuvre correctement que les alternatives. Pour les applications nécessitant une compatibilité AES, utilisez Cipher.getInstance("AES/GCM/NoPadding") avec des clés d'au moins 256 bits. Lors de l'utilisation du mode GCM, générez des nonce uniques de 12 octets pour chaque opération de chiffrement en utilisant SecureRandom.getInstance("DRBG") et ne réutilisez jamais les nonce avec la même clé, car cela entraîne des échecs de sécurité catastrophiques. Évitez de mettre en œuvre des schémas manuels MAC-then-encrypt ou encrypt-then-MAC, car ceux-ci sont difficiles à mettre en œuvre de manière sécurisée. Plus d'informations sur : java-cryptography-architecture-jca-reference-guide.html

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Failles cryptographiques

java_crypto_rule-CipherPaddingOracle

Résumé :

Utilisation d'un algorithme cryptographique cassé ou risqué

Gravité : Moyenne

CWE : CWE-327

Description :

L'application utilise Cipher.getInstance() avec le mode CBC et PKCS5Padding ou PKCS7Padding, comme "AES/CBC/PKCS5Padding" ou "DES/CBC/PKCS5Padding". Cette combinaison est vulnérable aux attaques par oracle de padding, où des adversaires peuvent déchiffrer le texte chiffré en observant si le padding est valide ou invalide lors des tentatives de déchiffrement. Les applications divulguent souvent cette information à travers des messages d'erreur distincts, des différences de temps de réponse ou différents codes de statut HTTP en cas d'erreurs de padding par rapport à d'autres échecs de déchiffrement. Les attaques réussies par oracle de padding permettent une récupération complète du texte en clair sans connaître la clé de chiffrement.

Remédiation :

Envisagez de migrer vers Cipher.getInstance("ChaCha20-Poly1305/None/NoPadding") qui élimine complètement le padding et fournit un chiffrement authentifié intégré. ChaCha20-Poly1305 est recommandé car il est plus simple à utiliser correctement, plus rapide sur la plupart des matériels et immunisé contre les attaques par oracle de padding. Pour les applications requérant une compatibilité AES, utilisez Cipher.getInstance("AES/GCM/NoPadding") qui élimine également le padding tout en garantissant l'intégrité des messages. Lors de l'utilisation du mode GCM, assurez-vous que des nonces uniques de 12 octets sont générés pour chaque opération de chiffrement en utilisant SecureRandom. Si le mode CBC doit être utilisé temporairement, assurez-vous que toutes les erreurs de déchiffrement retournent des messages d'erreur identiques et des temps de réponse similaires, et envisagez de mettre en œuvre une vérification HMAC supplémentaire avant de tenter le déchiffrement. Plus d'informations sur les attaques par oracle de padding sur https://en.wikipedia.org/wiki/Padding_oracle_attack et sur la cryptographie Java à https://docs.oracle.com/en/java/javase/15/security/java-cryptography-architecture-jca-reference-guide.html

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Failles cryptographiques

java_crypto_rule-CustomMessageDigest

Résumé :

Utilisation d'un algorithme cryptographique défaillant ou risqué

Gravité : Moyenne

CWE : CWE-327

Description :

L'application implémente une classe personnalisée qui étend java.security.MessageDigest, créant une fonction de hachage cryptographique personnalisée. Implémenter correctement des fonctions de hachage cryptographique nécessite une expertise approfondie en cryptanalyse et est extrêmement sujet aux erreurs. Les implémentations de hachage personnalisées contiennent presque toujours des défauts subtils qui les rendent vulnérables aux attaques par collision, attacks par préimage, ou autres faiblesses cryptographiques. Même des erreurs mineures d'implémentation peuvent compromettre complètement les propriétés de sécurité d'une fonction de hachage.

Remédiation :

Envisagez d'utiliser un algorithme de hachage standard en appelant MessageDigest.getInstance() avec un algorithme recommandé par le NIST tel que "SHA-256", "SHA-384", ou "SHA-512". Ces algorithmes ont été soumis à une analyse cryptographique exhaustive et sont correctement implémentés dans la bibliothèque standard Java. Pour la plupart des applications, SHA-256 offre une sécurité adéquate avec une bonne performance, tandis que SHA-384 ou SHA-512 offrent des marges de sécurité plus élevées pour des applications sensibles. Évitez d'utiliser des algorithmes obsolètes comme MD5 ou SHA-1 même à travers la bibliothèque standard, car ils sont cryptographiquement défaillants. La méthode MessageDigest.update() peut être appelée plusieurs fois pour hacher de grandes données de manière incrémentale, et MessageDigest.digest() produit la valeur de hachage finale. Plus d'informations sur : java-cryptography-architecture-jca-reference-guide.html

OWASP :

  • A6:2017-Misconfiguration de la sécurité
  • A04:2021-Conception peu sécurisée

java_crypto_rule-HazelcastSymmetricEncryption

Résumé :

Force de chiffrement inadéquate

Gravité : Moyenne

CWE : CWE-326

Description :

L'application utilise new com.hazelcast.config.SymmetricEncryptionConfig() pour configurer les communications réseau de Hazelcast avec un chiffrement symétrique obsolète. La classe SymmetricEncryptionConfig de Hazelcast a été dépréciée car elle ne fournit que la confidentialité sans authentification, la rendant vulnérable aux attaques de l'homme du milieu où des adversaires peuvent intercepter et modifier les communications du cluster. L'absence d'authentification mutuelle signifie que les membres du cluster ne peuvent pas vérifier l'identité de leurs pairs, ce qui permet à des nœuds non autorisés de rejoindre le cluster.

Remédiation :

Envisagez de migrer vers une configuration TLS/SSL pour les communications du cluster Hazelcast en utilisant la classe SSLConfig, qui offre à la fois le chiffrement et l'authentification mutuelle entre les membres du cluster. TLS protège contre les attaques de l'homme du milieu et garantit que seuls les nœuds autorisés peuvent rejoindre le cluster. Configurez TLS en mettant en place SSLConfig avec des keystores et truststores appropriés contenant des certificats valides. Utilisez TLS 1.2 ou supérieur et assurez-vous que les certificats sont correctement validés. Hazelcast prend également en charge l'intégration avec le JSSE de Java (Java Secure Socket Extension) pour une configuration TLS standardisée. Plus d'informations sur la configuration de TLS/SSL pour Hazelcast sont disponibles à : tls-ssl

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Failures cryptographiques

java_crypto_rule-InsufficientKeySizeRsa

Résumé :

Force de chiffrement inadéquate

Sévérité : Moyenne

CWE : CWE-326

Description :

L'application utilise KeyPairGenerator.getInstance("RSA") ou RSAKeyGenParameterSpec avec une taille de clé inférieure à 2048 bits, typiquement 1024 bits ou moins. Les clés RSA en dessous de 2048 bits sont vulnérables à des attaques de factorisation utilisant des ressources informatiques modernes. Le NIST a déconseillé l'utilisation de clés RSA de 1024 bits en décembre 2010, et les avancées en puissance de calcul et en algorithmes de factorisation continuent à rendre les clés RSA plus petites de plus en plus vulnérables. La force des clés RSA se dégrade avec le temps à mesure que la puissance de calcul augmente, rendant les tailles de clés insuffisantes une vulnérabilité critique en matière de sécurité.

Remédiation :

Envisagez de migrer vers KeyPairGenerator.getInstance("Ed25519"), qui fournit une cryptographie moderne par courbe elliptique avec une force de sécurité d'environ 128 bits, des tailles de clés plus petites, et des opérations plus rapides par rapport à RSA. Ed25519 utilise automatiquement des paramètres sécurisés et ne nécessite pas de configuration manuelle de la taille de la clé, réduisant ainsi le risque de mauvaise configuration. Si RSA est nécessaire pour la compatibilité, utilisez keyPairGenerator.initialize(2048) ou plus (clés de 3072 bits ou 4096 bits pour des marges de sécurité plus élevées) lors de l'initialisation du KeyPairGenerator. Pour de nouvelles applications, Ed25519 est fortement recommandé car il offre de meilleures performances et sécurité avec une mise en œuvre plus simple. Plus d'informations sur Ed25519 à http://ed25519.cr.yp.to/ et la cryptographie Java à : java-cryptography-architecture-jca-reference-guide.html

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Failles cryptographiques

java_crypto_rule-NullCipher

Résumé :

Utilisation d'un algorithme cryptographique défectueux ou risqué

Gravité : Moyenne

CWE : CWE-327

Description :

L'application crée une instance de new javax.crypto.NullCipher(), qui ne fournit aucune forme de chiffrement. NullCipher implémente l'interface Cipher mais effectue une transformation d'identité, ce qui signifie que toutes les données passées à ses méthodes doFinal() ou update() sont renvoyées inchangées en texte clair. Cela annule complètement l'objectif du chiffrement et expose des données sensibles. NullCipher est destiné uniquement aux tests ou comme espace réservé pendant le développement, et ne doit jamais être présent dans le code de production traitant des informations sensibles.

Remédiation :

Envisagez de remplacer NullCipher par Cipher.getInstance("ChaCha20-Poly1305/None/NoPadding") qui fournit un chiffrement authentifié fort avec une intégrité de message intégrée. ChaCha20-Poly1305 est recommandé pour les applications Java modernes car il offre d'excellentes caractéristiques de sécurité et de performance. Initialisez le chiffre avec une clé secrète de 256 bits et des nonces uniques de 12 octets générés à l'aide de SecureRandom.getInstance("DRBG") avec des DrbgParameters appropriés. Pour les applications nécessitant la compatibilité AES, utilisez Cipher.getInstance("AES/GCM/NoPadding") avec des clés d'au moins 256 bits. Assurez-vous que des pratiques de gestion de clé appropriées sont mises en œuvre, y compris la génération, le stockage et la rotation sécurisés des clés. Plus d'informations sur la cryptographie Java sont disponibles à : java-cryptography-architecture-jca-reference-guide.html

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Failles cryptographiques

java_crypto_rule-RsaNoPadding

Résumé :

Utilisation de l'algorithme RSA sans OAEP

Sévérité : Moyenne

CWE : CWE-780

Description :

L'application utilise javax.crypto.Cipher.getInstance() avec un chiffrement RSA configuré sans remplissage (par exemple, "RSA/ECB/NoPadding"), ce qui n'incorpore pas le Remplissage Optimal pour le Chiffrement Asymétrique (OAEP). Sans un remplissage adéquat, RSA devient vulnérable aux attaques par texte en clair choisi, où un attaquant peut manipuler des messages chiffrés pour obtenir des informations sur le texte en clair. Cette vulnérabilité est particulièrement dangereuse car le chiffrement RSA standard est déterministe, ce qui signifie que le même texte en clair produit toujours le même texte chiffré, ce qui peut dévoiler des informations par analyse de motif.

Mesures correctives :

Envisagez d'utiliser RSA avec remplissage OAEP en spécifiant "RSA/ECB/OAEPWithSHA-256AndMGF1Padding" lors de l'appel à Cipher.getInstance(). Le remplissage OAEP ajoute de l'aléa au processus de chiffrement, garantissant que des textes en clair identiques produisent des chiffrés différents et empêchant les attaques par texte en clair choisi. Pour garantir la compatibilité avec des systèmes plus anciens qui peuvent ne pas prendre en charge SHA-256, vous pouvez utiliser "RSA/ECB/OAEPWithSHA-1AndMGF1Padding", bien que SHA-256 soit recommandé pour de nouvelles applications. Soyez conscient que le chiffrement RSA est coûteux en calcul et ne devrait généralement être utilisé que pour chiffrer des clés symétriques plutôt que de grandes quantités de données directement. Pour plus d'informations sur OAEP, consultez https://en.wikipedia.org/wiki/Optimal_asymmetric_encryption_padding et le guide sur l'Architecture de Cryptographie Java à https://docs.oracle.com/en/java/javase/15/security/java-cryptography-architecture-jca-reference-guide.html

OWASP :

  • A3:2017-Exposition de Données Sensibles
  • A02:2021-Échecs Cryptographiques

java_crypto_rule-WeakMessageDigest

Résumé :

Utilisation d'un algorithme cryptographique brisé ou risqué (SHA1/MD5)

Sévérité : Moyenne

CWE : CWE-327

Description :

L'application utilise java.security.MessageDigest.getInstance() ou java.security.Signature.getInstance() avec des algorithmes cryptographiques faibles tels que MD2, MD4, MD5 ou SHA-1. Ces algorithmes de hachage sont cryptographiquement brisés et vulnérables aux attaques par collision, où deux entrées différentes peuvent produire la même sortie de hachage. Les collisions MD5 sont exploitables depuis 2004, et les collisions SHA-1 ont été démontrées en 2017 avec l'attaque SHAttered. Pour le stockage des mots de passe, ces fonctions de hachage rapides sont également vulnérables aux attaques par force brute, même sans collisions, les rendant inadaptées à la protection des identifiants des utilisateurs.

Remédiation :

Pour le hachage général et la vérification de l'intégrité des données, envisagez de migrer vers SHA-256 ou SHA-384 en appelant MessageDigest.getInstance("SHA-256") ou MessageDigest.getInstance("SHA-384"). Ces algorithmes font partie de la famille SHA-2 et restent sécurisés contre les attaques par collision. Pour le stockage des mots de passe, les hachages cryptographiques standard sont insuffisants - utilisez plutôt des algorithmes de hachage de mots de passe spécialement conçus comme Argon2id, bcrypt ou PBKDF2, qui incluent le salage et l'étirement de clé pour résister aux attaques par force brute. Java fournit PBKDF2 de manière native via SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"), tandis qu'Argon2id et bcrypt nécessitent des bibliothèques tierces telles que Bouncy Castle ou Spring Security Crypto. Pour les signatures numériques, migrez de MD5withRSA ou SHA1withRSA vers SHA256withRSA ou SHA384withRSA. Consultez la fiche de triche OWASP sur le stockage des mots de passe pour des conseils détaillés : Password_Storage_Cheat_Sheet.html

OWASP :

  • A6:2017-Misconfiguration de sécurité
  • A04:2021-Conception non sécurisée

java_crypto_rule-WeakTLSProtocol-DefaultHttpClient

Résumé :

Validation de certificat incorrecte

Gravité : Moyenne

CWE : CWE-295

Description :

L'application utilise org.apache.http.impl.client.DefaultHttpClient, une classe obsolète des Apache HttpComponents qui ne vérifie pas les noms d'hôtes lors des connexions TLS par défaut. Cette vulnérabilité permet à un attaquant réalisant une attaque de type homme du milieu de présenter un certificat pour n'importe quel domaine, et le client l'acceptera sans validation. Même si le certificat de l'attaquant est valide pour un autre domaine, la connexion se poursuivra, permettant l'interception de données sensibles ou l'injection de contenu malveillant. La classe DefaultHttpClient a été dépréciée dans HttpClient 4.3 (publiée en 2013) spécifiquement en raison de ces préoccupations de sécurité.

Remédiation :

Pour les applications fonctionnant sur Java 11 ou ultérieur, envisagez de migrer vers l'API moderne java.net.http.HttpClient qui a été introduite dans Java 9 et standardisée dans Java 11. Ce client HTTP intégré effectue une vérification correcte des noms d'hôtes et une validation des certificats par défaut sans nécessiter de configuration supplémentaire. Créez des instances en utilisant HttpClient.newHttpClient() ou HttpClient.newBuilder() pour une configuration personnalisée. Si vous devez continuer à utiliser Apache HttpComponents, migrez vers la bibliothèque moderne HttpClient 5.x et utilisez HttpClients.createDefault() ou HttpClients.custom() qui permettent tous deux une vérification appropriée des noms d'hôtes. Pour HttpClient 4.x, utilisez HttpClientBuilder.create().build() à la place de DefaultHttpClient. Soyez conscient que toute configuration SSL personnalisée doit explicitement maintenir la vérification des noms d'hôtes - ne la désactivez jamais dans des environnements de production car cela annule complètement les garanties de sécurité TLS.

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Failles cryptographiques

java_crypto_rule-WeakTLSProtocol-SSLContext

Résumé :

Validation des certificats incorrecte

Gravité : Moyenne

CWE : CWE-295

Description :

L'application initialise un contexte SSL/TLS en utilisant javax.net.ssl.SSLContext.getInstance() avec des versions de protocole non sécurisées telles que "SSL", "SSLv2" ou "SSLv3". Ces protocoles hérités contiennent des défauts de conception fondamentaux et des vulnérabilités connues, y compris les attaques POODLE, BEAST, et les attaques par oracle de remplissage. SSLv2 et SSLv3 ne valident pas correctement les certificats par défaut et utilisent des suites de chiffrement faibles qui sont facilement exploitables avec la puissance de calcul moderne. De plus, ces protocoles sont susceptibles à des attaques de rétrogradation où un attaquant peut forcer la connexion à utiliser la version de protocole la plus faible prise en charge à la fois par le client et le serveur, même si des versions plus robustes sont disponibles.

Remédiation :

Envisagez d'utiliser SSLContext.getInstance("TLSv1.3") ou SSLContext.getInstance("TLSv1.2") pour exiger explicitement les versions modernes de TLS. TLS 1.3 est recommandé car il supprime le support pour les suites de chiffrement héritées, simplifie le processus de négociation, et chiffre davantage de données de négociation. Si vous devez supporter des clients plus anciens, TLS 1.2 est acceptable mais devrait être la version minimale autorisée. Vous pouvez également utiliser SSLContext.getInstance("TLS") qui négociera la version de protocole la plus élevée disponible, bien que cela soit moins explicite et puisse se comporter différemment selon les versions de Java. Pour les protocoles basés sur les datagrammes, utilisez "DTLSv1.2" ou "DTLSv1.3" à la place. Après avoir créé le SSLContext, vous pouvez également restreindre davantage les protocoles activés en utilisant SSLEngine.setEnabledProtocols() ou SSLSocket.setEnabledProtocols() pour appliquer votre politique de sécurité. Pour plus d'informations, consultez le guide de test OWASP : 01-Testing_for_Weak_SSL_TLS_Ciphers_Insufficient_Transport_Layer_Protection

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Failles cryptographiques

java_crypto_rule-VersionDeProtocoleTLSFaible

Résumé :

Force de chiffrement inadéquate

Sévérité : Moyenne

CWE : CWE-326

Description :

L'application active des versions de protocole TLS non sécurisées telles que TLS 1.0 ou TLS 1.1 via SSLContext.getInstance() ou en appelant setEnabledProtocols() sur un SSLEngine ou un SSLSocket. TLS 1.0 et 1.1 contiennent de nombreuses faiblesses cryptographiques, y compris la vulnérabilité aux attaques BEAST, des suites de chiffrement faibles, et une protection insuffisante contre les attaques de dégradation. Ces protocoles ont été formellement dépréciés par les principaux fournisseurs de navigateurs en 2020 et ne sont plus conformes aux exigences PCI DSS depuis juin 2018. Les applications utilisant ces versions exposent les communications à des attaques de l'homme du milieu où des adversaires peuvent intercepter la connexion et forcer une dégradation vers des versions de protocole plus faibles ou des suites de chiffrement. Notez que bien que les versions Java plus récentes (Java 8u291+ et Java 11.0.11+) désactivent TLS 1.0 et 1.1 par défaut, compter sur les valeurs par défaut du système est insuffisant pour la conformité lorsque les applications peuvent être déployées dans divers environnements avec des versions et configurations Java variées.

Remédiation :

Envisagez de configurer explicitement votre SSLContext pour n'utiliser que TLS 1.2 et TLS 1.3 en appelant SSLContext.getInstance("TLSv1.3") ou en créant un contexte TLS générique puis en restreignant les protocoles activés avec setEnabledProtocols(new String[] {"TLSv1.2", "TLSv1.3"}) sur le SSLEngine ou le SSLSocket. TLS 1.3 est recommandé car il offre une sécurité et une performance améliorées par rapport à TLS 1.2, y compris la confidentialité persistante par défaut et des négociations plus rapides. Si vous devez prendre en charge des clients plus anciens, TLS 1.2 devrait être la version minimale autorisée. Pour les protocoles de datagrammes, utilisez des équivalents DTLSv1.2 ou DTLSv1.3. Définir explicitement la configuration du protocole assure une posture de sécurité cohérente dans tous les environnements de déploiement, quelles que soient la version de Java ou les valeurs par défaut du système. Après avoir effectué ce changement, testez minutieusement avec tous les clients pour garantir la compatibilité, car certains systèmes hérités peuvent ne pas prendre en charge les versions modernes de TLS et échouer à se connecter. Consultez la documentation SSLContext à l'adresse https://docs.oracle.com/en/java/javase/11/docs/api/java.base/javax/net/ssl/SSLContext.html et le guide des attaques MiTM d'OWASP à l'adresse https://owasp.org/www-community/attacks/Manipulator-in-the-middle_attack

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Failles cryptographiques

java_endpoint_rule-HostnameVerifier

Résumé :

Validation de certificat inadéquate

Gravité : Moyenne

CWE : CWE-295

Description :

La méthode HostnameVerifier.verify() a été implémentée pour retourner systématiquement true, ce qui désactive efficacement la validation des noms d'hôtes lors de la vérification des certificats TLS/SSL. Cette implémentation permet d'accepter n'importe quel nom d'hôte, même s'il ne correspond pas aux champs Subject Alternative Names (SAN) ou Common Name (CN) du certificat. Cela pourrait permettre à un adversaire positionné entre l'application et l'hôte cible de lancer une attaque de type Man-in-the-Middle (MITM), interceptant des informations potentiellement sensibles ou injectant du contenu malveillant dans le flux de communication.

Remédiation :

Envisagez d'utiliser le HostnameVerifier par défaut fourni par l'environnement d'exécution Java plutôt que d'implémenter un personnalisé qui contourne la validation. Le vérificateur par défaut peut être obtenu via HttpsURLConnection.getDefaultHostnameVerifier() et valide correctement que le nom d'hôte du certificat du serveur correspond au nom d'hôte demandé conformément aux normes RFC 2818. Pour les applications utilisant HttpsURLConnection, évitez simplement d'appeler setHostnameVerifier() ou définissez-le explicitement sur le défaut : connection.setHostnameVerifier( HttpsURLConnection.getDefaultHostnameVerifier()). Si vous devez absolument mettre en œuvre une logique de vérification de nom d'hôte personnalisée pour des exigences métier spécifiques, assurez-vous que l'implémentation effectue une correspondance de caractères génériques appropriée et vérifie les entrées SAN du certificat, en lançant une exception en cas d'échec de la validation plutôt que de retourner true sans condition. Pour plus d'informations sur la sécurité TLS, consultez https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html

OWASP :

  • A6:2017-Misconfiguration de sécurité
  • A05:2021-Misconfiguration de sécurité

java_endpoint_rule-X509TrustManager

Résumé :

Validation de certificat incorrecte

Sévérité : Moyenne

CWE : CWE-295

Description :

L'implémentation personnalisée de X509TrustManager a des implémentations vides des méthodes checkClientTrusted() ou checkServerTrusted(), ou retourne null depuis getAcceptedIssuers(). Cela désactive efficacement la validation de la chaîne de certificats, acceptant tous les certificats indépendamment de leur authenticité ou de leur chaîne de confiance. Cette implémentation permet à un adversaire positionné entre l'application et l'hôte cible de présenter des certificats frauduleux et de lancer des attaques de type Man-in-the-Middle (MITM), permettant l'interception d'informations sensibles ou l'injection de contenus malveillants dans le flux de communication.

Remédiation :

Envisagez d'utiliser le TrustManagerFactory par défaut fourni par l'environnement d'exécution Java au lieu d'implémenter un X509TrustManager personnalisé. Le gestionnaire de confiance par défaut peut être obtenu via TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) et valide correctement les chaînes de certificats contre les certificats CA de confiance du système. Initialisez-le avec trustManagerFactory.init((KeyStore) null) pour utiliser le magasin de clés système par défaut, puis passez les gestionnaires de confiance résultants à SSLContext.init() lors de la création de connexions TLS. Si vous devez implémenter une validation de certificat personnalisée pour des exigences spécifiques (comme le certificat pinning), assurez-vous que les méthodes checkServerTrusted() et checkClientTrusted() effectuent une validation réelle et lèvent une CertificateException lorsque les certificats sont invalides au lieu d'accepter silencieusement tous les certificats. Il est recommandé d'étendre le gestionnaire de confiance par défaut et d'ajouter des contrôles supplémentaires plutôt que de remplacer complètement la validation. Pour les scénarios de pinning de certificats, envisagez d'utiliser des bibliothèques établies comme le CertificatePinner d'OkHttp qui fournissent des abstractions plus sûres. Pour plus d'informations, voir https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html

OWASP :

  • A6:2017-Misconfiguration de sécurité
  • A05:2021-Misconfiguration de sécurité

java_inject_rule-HttpParameterPollution

Résumé :

Neutralisation incorrecte des délimiteurs d'arguments dans une commande ('Injection d'Argument')

Gravité : Moyenne

CWE : CWE-88

Description :

L'application utilise des classes Apache HttpClient telles que org.apache.http.client.methods.HttpGet ou org.apache.commons.httpclient.methods.GetMethod.setQueryString() avec des entrées contrôlées par l'utilisateur, ce qui permet la Pollution des Paramètres HTTP (HPP) et potentiellement des attaques de Détournement de Requête côté Serveur (SSRF). Lorsque les entrées utilisateur sont incorporées dans la construction de l'URL sans encodage ni validation appropriés, des adversaires peuvent injecter des délimiteurs de chaînes de requête encodés comme &, =, ou %26 pour ajouter ou remplacer des paramètres d'URL, manipulant la logique des requêtes de backend. Cette vulnérabilité devient particulièrement sévère lorsqu'elle permet SSRF, permettant aux attaquants d'effectuer des requêtes vers des services internes, des points de terminaison de métadonnées cloud ou des systèmes externes arbitraires en utilisant le serveur d'application comme un proxy.

Remédiation :

Envisagez d'utiliser une approche par table de correspondance où les entrées utilisateur sont validées par rapport à un HashMap de valeurs de paramètres autorisées, puis n'utilisez que ces valeurs validées lors de la construction des requêtes HTTP. Ne laissez jamais les entrées utilisateur contrôler l'URL de base ou le chemin d'URL complet - codez toujours en dur l'hôte et le chemin de destination, en utilisant les entrées utilisateur uniquement pour les valeurs de paramètres validées. Lorsque les entrées utilisateur doivent être incluses dans les URL, utilisez java.net.URLEncoder.encode() avec StandardCharsets.UTF_8 pour correctement échapper tous les caractères spéciaux avant la construction de l'URL. Pour les applications modernes, envisagez d'utiliser des classes de construction d'URI comme URIBuilder d'Apache HttpClient ou UriComponentsBuilder de Spring qui offrent une gestion des paramètres plus sûre avec un encodage automatique. Mettez en œuvre une validation stricte de la liste blanche pour toute entrée contrôlée par l'utilisateur utilisée dans les requêtes HTTP, et ne faites jamais confiance aux entrées utilisateur pour fournir des URL complètes ou des hôtes. Pour la prévention du SSRF, maintenez une liste blanche des hôtes de destination autorisés et validez que toutes les URL construites résolvent vers des cibles approuvées. Envisagez de faire des requêtes HTTP sortantes de manière asynchrone dans des threads séparés ou en utilisant des files d'attente de messages pour les isoler du contexte de traitement des requêtes. Plus d'informations sur https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_inject_rule-LDAPInjection

Résumé :

Neutralisation incorrecte des éléments spéciaux utilisés dans une requête LDAP ('Injection LDAP')

Sévérité : Moyenne

CWE : CWE-90

Description :

L'application utilise des méthodes de requête LDAP telles que InitialDirContext.search(), DirContext.lookup(), LdapContext.search(), LdapTemplate.search(), ou LDAPConnection.search() avec des entrées contrôlées par l'utilisateur, ce qui permet des attaques par injection LDAP. Les exploits d'injection LDAP permettent aux adversaires de manipuler la syntaxe des filtres LDAP en injectant des caractères spéciaux comme des parenthèses, des astérisques ou des octets nuls, contournant potentiellement l'authentification, accédant à des entrées d'annuaire non autorisées ou extrayant des informations sensibles. La vulnérabilité est particulièrement critique lors de la construction de filtres LDAP ou de noms distingués (DN) en utilisant la concaténation de chaînes avec des entrées utilisateur non assainies, car cela permet aux attaquants de modifier la structure logique des requêtes LDAP.

Remédiation :

Envisagez d'utiliser la méthode à quatre arguments InitialDirContext.search(Name name, String filterExpr, Object[] filterArgs, SearchControls cons) qui encode automatiquement le paramètre filterArgs pour prévenir les injections. Lors de l'utilisation de cette méthode, utilisez des espaces réservés comme {0}, {1} dans l'expression de filtre et passez les entrées utilisateur via le tableau filterArgs plutôt que de concaténer des chaînes. Pour les applications qui ne peuvent pas utiliser la méthode paramétrée, encodez manuellement les caractères spéciaux LDAP : échappez les barres obliques inverses en \5c, les octets nuls en \00, les parenthèses en \28 et \29, et les astérisques en \2a (notez que la barre oblique inverse doit d'abord être échappée). Les méthodes LdapEncoder.nameEncode() et LdapEncoder.filterEncode() de Spring LDAP offrent un encodage intégré pour les composants DN et filtre respectivement. Envisagez de mettre en œuvre une validation par liste autorisée pour les noms d'attributs LDAP et les DN de base, et évitez de construire des DN à partir des entrées utilisateur lorsque cela est possible. Pour le SDK LDAP UnboundID, utilisez Filter.create() avec un échappement adéquat des arguments ou les méthodes de construction de la classe Filter qui gèrent l'encodage automatiquement. Plus de conseils disponibles sur https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_inject_rule-SpotbugsPathTraversalAbsolute

Résumé :

Limitation incorrecte d'un chemin d'accès à un répertoire restreint ('Path Traversal')

Sévérité : Moyenne

CWE : CWE-22

Description :

L'application utilise des APIs de système de fichiers telles que new File(), new FileReader(), new FileInputStream(), new FileOutputStream(), Files.newBufferedReader(), Paths.get(), ou ClassLoader.getResourceAsStream() avec des entrées contrôlées par l'utilisateur, ce qui permet des attaques par traversée de chemin. Lorsque l'entrée utilisateur est utilisée pour construire des chemins de fichiers sans validation appropriée, les adversaires peuvent injecter des séquences de traversée de chemin comme ../ ou des chemins absolus pour accéder à des fichiers en dehors du répertoire souhaité, lire des fichiers de configuration sensibles, accéder aux données d'autres utilisateurs, ou écraser des fichiers système critiques. Cette vulnérabilité est particulièrement dangereuse lors du traitement des noms de fichiers téléchargés par l'utilisateur ou lorsque des chemins de fichiers sont construits à partir de paramètres HTTP, car les attaquants peuvent traverser à des emplacements arbitraires dans le système de fichiers.

Remédiation :

Envisagez de générer des noms de fichiers aléatoires en utilisant UUID.randomUUID() et de stocker le nom de fichier fourni par l'utilisateur à l'origine séparément dans une base de données ou un fichier de métadonnées, puis d'utiliser uniquement le nom de fichier généré pour les opérations sur le système de fichiers. Lorsque l'entrée utilisateur doit influencer les chemins de fichiers, utilisez Path.resolve() pour construire le chemin complet à partir d'un répertoire de base codé en dur et de l'entrée utilisateur, puis validez que fullPath.startsWith(basePath) pour garantir que le chemin résolu reste dans le répertoire prévu. Pour extraire uniquement le nom de fichier de l'entrée utilisateur, utilisez org.apache.commons.io.FilenameUtils.getName() qui supprime les composants de répertoire et empêche la traversée. Ne jamais utiliser la concaténation de chaînes pour construire des chemins de fichiers avec l'entrée utilisateur. Envisagez d'utiliser Path.normalize() pour résoudre les séquences .., mais notez que cela à lui seul est insuffisant - vous devez également valider que le chemin normalisé reste dans les limites. Pour les opérations de fichiers temporaires, utilisez Files.createTempFile() avec un préfixe/suffixe plutôt que des noms contrôlés par l'utilisateur. Implémentez une validation stricte en liste blanche si vous devez supporter des noms de fichiers spécifiés par l'utilisateur, en ne permettant que des caractères alphanumériques et un ensemble limité de caractères sûrs. Envisagez d'utiliser un chroot jail ou une containerisation pour limiter la portée d'accès au système de fichiers. Plus de détails sur https://owasp.org/www-community/attacks/Path_Traversal

OWASP :

  • A5:2017-Contrôle d'Accès Rompu
  • A01:2021-Contrôle d'Accès Rompu

java_perm_rule-DangerousPermissions

Résumé :

Attribution incorrecte des autorisations pour une ressource critique

Gravité : Moyenne

CWE : CWE-732

Description :

Autorisations dangereuses détectées accordées via PermissionCollection.add(). Accorder RuntimePermission("createClassLoader") permet à une application compromise d'instancier des chargeurs de classes arbitraires et de charger des classes malveillantes, contournant ainsi les contrôles de sécurité. Accorder ReflectPermission("suppressAccessChecks") désactive les vérifications d'accès du langage Java, permettant un accès illimité aux membres privés et protégés de n'importe quelle classe via la réflexion.

Remédiation :

Envisagez de supprimer ces autorisations hautement privilégiées de votre politique de sécurité. Si le chargement de classes ou l'accès par réflexion est nécessaire, mettez en œuvre des contrôles de sécurité granulaires en utilisant un SecurityManager personnalisé et en restreignant les autorisations à des chemins de code de confiance spécifiques. Il est recommandé d'appliquer le principe du moindre privilège en accordant uniquement les autorisations minimales nécessaires au fonctionnement légitime. Évitez d'ajouter ces autorisations à PermissionCollection à moins que cela ne soit absolument requis par l'architecture de sécurité de votre application.

OWASP :

  • A5:2017-Contrôle d'accès rompu
  • A01:2021-Contrôle d'accès rompu

java_perm_rule-OverlyPermissiveFilePermissionInline

Résumé :

Attribution de permissions incorrectes pour une ressource critique

Sévérité : Moyenne

CWE : CWE-732

Description :

Des permissions de fichier excessivement permissives ont été détectées via Files.setPosixFilePermissions() avec "autres" ayant un accès en lecture, écriture ou exécution. Cela permet à tout utilisateur sur le système d'accéder au fichier, exposant potentiellement des données sensibles ou permettant des modifications non autorisées. Accorder des permissions lisibles ou modifiables par tous viole le principe du moindre privilège et crée des vulnérabilités de sécurité.

Remédiation :

Envisagez de restreindre les permissions de fichier uniquement au propriétaire du fichier en utilisant PosixFilePermissions.fromString() avec des motifs tels que "rw-------" (lecture/écriture uniquement pour le propriétaire) ou "r--------" (lecture seule pour le propriétaire). Il est recommandé d'éviter d'accorder toute permission au groupe "autres" (les trois derniers caractères devraient être "---"). Si l'accès groupal est nécessaire, limitez-le au minimum requis (par exemple, "rw-r-----" pour un accès en lecture du groupe). Passez en revue les besoins d'accès aux fichiers de votre application et appliquez les permissions les plus restrictives qui maintiennent la fonctionnalité.

OWASP :

  • A5:2017-Contrôle d'accès brisé
  • A01:2021-Contrôle d'accès brisé

java_smtp_rule-InsecureSmtp

Résumé :

Validation inadéquate du certificat avec une correspondance d'hôte incorrecte

Sévérité : Moyenne

CWE : CWE-297

Description :

Le client Apache Commons Email n'active pas par défaut la vérification de l'identité du serveur SSL lorsqu'il utilise les classes SimpleEmail, MultiPartEmail, HtmlEmail ou ImageHtmlEmail. Sans appel à setSSLCheckServerIdentity(true), l'application accepte tout certificat présenté par le serveur SMTP, permettant aux attaquants de type homme du milieu d'intercepter ou de modifier les communications par e-mail contenant potentiellement des informations sensibles.

Remédiation :

Envisagez d'activer la vérification de l'identité du serveur SSL pour prévenir les attaques de type homme du milieu sur les connexions SMTP. Après avoir appelé setSSLOnConnect(true) sur votre instance Email, appelez immédiatement setSSLCheckServerIdentity(true) pour vous assurer que le certificat du serveur correspond au nom d'hôte. Il est recommandé d'utiliser les deux méthodes ensemble : email.setSSLOnConnect(true); email.setSSLCheckServerIdentity(true);. Cela valide que le certificat du serveur SMTP est de confiance et correspond au nom d'hôte attendu, protégeant ainsi contre les attaques de substitution de certificat.

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Achats cryptographiques 실패

java_ssrf_rule-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 entrées contrôlées par l'utilisateur utilisées pour construire des connexions réseau Java via java.net.URL, java.net.URI, ou java.net.InetSocketAddress sans validation appropriée. Les motifs identifient les cas où des valeurs non littérales sont passées à des constructeurs comme new URL(), new URI(), ou new InetSocketAddress(), suivis de méthodes telles que connect(), openConnection(), openStream(), ou getContent(). Lorsque l'entrée utilisateur contrôle des URL ou des noms d'hôtes dans ces opérations réseau, des vulnérabilités de falsification de requêtes côté serveur (SSRF) peuvent survenir, permettant aux attaquants de forcer le serveur à accéder à des ressources internes, à des points de terminaison de métadonnées cloud (169.254.169.254), à des interfaces administratives, ou d'effectuer des analyses réseau qui contournent les protections de pare-feu et la segmentation réseau.

Remédiation :

Envisagez de mettre en œuvre une liste blanche stricte d'URL qui valide l'entrée de l'utilisateur par rapport aux domaines approuvés avant de construire des objets URL ou URI. Utilisez la classe java.net.URI de Java pour analyser et valider les composants de schéma, d'hôte et de port, en rejetant toute URL qui ne correspond pas à la liste blanche. Implémentez une protection contre le rebind DNS en résolvant les noms d'hôtes à l'aide de InetAddress.getByName() et en bloquant les connexions vers des 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 des adresses de métadonnées cloud (169.254.169.254). Pour les applications utilisant Apache HttpClient, configurez des gestionnaires de connexion personnalisés ou des usines de sockets qui appliquent un filtrage des adresses IP au niveau du réseau. Les défenses au niveau réseau peuvent inclure l'exécution de l'application avec des privilèges d'utilisateur restreints ou dans des segments de réseau isolés avec des règles de filtrage sortant. Envisagez d'utiliser une approche de mappage 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 URLs arbitraires. Pour plus d'informations, consultez OWASP : Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html

OWASP :

  • A1:2017-Injection
  • A10:2021-Falsification de requêtes côté serveur

java_strings_rule-FormatStringManipulation

Résumé :

Utilisation de chaînes de format contrôlées de manière externe

Gravité : Moyenne

CWE : CWE-134

Description :

L'application utilise des entrées utilisateur non fiables provenant de HttpServletRequest.getParameter() pour construire des chaînes de format passées à String.format(), Formatter.format(), PrintStream.printf(), ou PrintStream.format(). Cela permet aux attaquants d'injecter des spécificateurs de format arbitraires, ce qui peut entraîner un déni de service via des exceptions, consommer des ressources excessives via des bombes de format, ou potentiellement divulguer des informations sensibles à travers des chaînes de format soigneusement élaborées. Les vulnérabilités liées aux chaînes de format se produisent lorsque la chaîne de format elle-même (le premier paramètre) contient des données contrôlées par l'utilisateur, et non lorsque les données de l'utilisateur sont passées en toute sécurité comme arguments de format.

Remédiation :

Il est recommandé d'utiliser toujours des chaînes de format codées en dur, avec les entrées utilisateur passées uniquement comme arguments de format, jamais concaténées dans la chaîne de format elle-même. Par exemple, utilisez String.format("Utilisateur fourni : %s", userInput) au lieu de String.format("Utilisateur fourni : " + userInput, args). Envisagez d'utiliser une simple concaténation de chaînes ou StringBuilder lorsque les spécificateurs de format ne sont pas réellement nécessaires, car cela élimine complètement la surface d'attaque des chaînes de format. Si des modèles de chaînes dynamiques sont nécessaires, envisagez d'utiliser une bibliothèque de modèles sûre comme StringSubstitutor d'Apache Commons Text qui n'interprète pas les spécificateurs de format. Pour les scénarios de journalisation, préférez utiliser des frameworks de journalisation paramétrés comme SLF4J où les espaces réservés sont sûrs par conception : logger.info("Action de l'utilisateur : {}", userInput).

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_xml_rule-SAMLIgnoreComments

Résumé :

Authentification faible

Gravité : Moyenne

CWE : CWE-1390

Description :

L'application appelle BasicParserPool.setIgnoreComments(false) lors de la configuration de l'analyse XML OpenSAML, ce qui permet le traitement des commentaires XML au sein des attestations SAML. SAML analyse les attestations comme des documents XML, et en traitant les commentaires XML, les adversaires peuvent insérer des balises de commentaire XML pour fragmenter des champs critiques tels que les noms d'utilisateur ou les assertions. Cela permet aux attaquants de contourner les vérifications d'autorisation ou d'authentification en manipulant la façon dont la réponse SAML est interprétée, ce qui peut potentiellement conduire à des vulnérabilités de contournement d'authentification, comme le montre CVE-2017-11427 et CVE-2018-0489.

Remédiation :

Envisagez de supprimer l'appel explicite à setIgnoreComments(false) lors de la configuration de org.opensaml.xml.parse.BasicParserPool, car la valeur par défaut de ignoreComments est vraie, ce qui est la configuration sécurisée. Si vous devez configurer explicitement le traitement des commentaires, utilisez setIgnoreComments(true) pour vous assurer que les commentaires XML sont supprimés lors de l'analyse et ne peuvent pas être utilisés pour manipuler les assertions SAML. Pour une sécurité SAML complète, assurez-vous également de valider les signatures avant de traiter les assertions, de canoniser le XML avant la vérification de la signature et de mettre en œuvre une validation appropriée des certificats. Des conseils supplémentaires sont disponibles dans la feuille de triche OWASP SAML Security à l'adresse https://cheatsheetseries.owasp.org/cheatsheets/SAML_Security_Cheat_Sheet.html et des détails sur cette vulnérabilité spécifique à https://developer.okta.com/blog/2018/02/27/a-breakdown-of-the-new-saml-authentication-bypass-vulnerability

OWASP :

  • A5:2017-Contrôle d'accès rompu
  • A01:2021-Contrôle d'accès rompu

java_xml_rule-XsltTransform

Résumé :

Injection XML (aussi appelé injection XPath aveugle)

Gravité : Moyenne

CWE : CWE-91

Description :

L'application effectue des transformations XSLT en utilisant TransformerFactory.newTransformer() ou Transformer.transform() avec des sources d'entrée potentiellement non fiables. Lorsque des adversaires peuvent influencer la feuille de style XSL chargée, ils peuvent exploiter la vaste fonctionnalité de XSLT pour exécuter un code arbitraire via des fonctions d'extension, lire des fichiers locaux via des appels document(), ou déclencher des attaques d'entité XML externe (XXE) qui exfiltrent des données sensibles vers des serveurs contrôlés par l'attaquant. XSLT est un langage complet de Turing avec des capacités puissantes, y compris l'accès au système de fichiers et les opérations réseau, rendant les feuilles de style contrôlées par l'utilisateur particulièrement dangereuses. Même des transformations apparemment bénignes peuvent être utilisées à des fins malveillantes lorsque les attaquants contrôlent le modèle XSL.

Remédiation :

Envisagez de migrer complètement loin de XSLT si possible, en utilisant des alternatives plus sûres telles que des moteurs de modèles (Thymeleaf, Velocity) ou des bibliothèques modernes de traitement XML qui n'exécutent pas de code. Si le traitement XSLT est absolument nécessaire, ne traitez jamais les feuilles de style XSL fournies par l'utilisateur en aucune circonstance. Pour les opérations XSLT requises, assurez-vous d'activer FEATURE_SECURE_PROCESSING en appelant transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true) avant de créer des transformateurs, ce qui limite les fonctions d'extension et restreint l'accès aux ressources. De plus, désactivez explicitement la résolution d'entités externes et le traitement DTD sur votre TransformerFactory en définissant les propriétés ACCESS_EXTERNAL_DTD et ACCESS_EXTERNAL_STYLESHEET sur des chaînes vides. Conservez toutes les feuilles de style XSL en tant que ressources d'application codées en dur, ne les chargez jamais à partir de l'entrée utilisateur ou de sources externes, et validez que les chemins des fichiers ne peuvent pas être manipulés par la traversée de chemin. Plus de détails sur la sécurité XML sont disponibles à https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#java

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_xss_rule-WicketXSS

Résumé :

Neutralisation incorrecte des entrées lors de la génération de pages web ('Cross-site Scripting')

Sévérité : Moyenne

CWE : CWE-79

Description :

L'application désactive l'échappement HTML intégré d'Apache Wicket en appelant Component.setEscapeModelStrings(false) sur les composants Wicket. Cela crée une vulnérabilité de type Cross-Site Scripting (XSS) lorsque le composant affiche des données fournies par l'utilisateur, car du JavaScript malveillant ou un balisage HTML sera rendu directement dans le navigateur sans être assaini. L'auto-évasion par défaut de Wicket protège contre les XSS en encodant les caractères spéciaux HTML, et désactiver cette protection supprime un contrôle de sécurité critique. Cela est particulièrement dangereux dans les composants Label, les panneaux dynamiques ou tout composant qui rend des entrées utilisateur dans des pages web.

Remédiation :

Envisagez de maintenir l'auto-évasion par défaut de Wicket activée en veillant à ce que Component.setEscapeModelStrings(true) soit utilisé ou en vous reposant sur le comportement par défaut qui échappe automatiquement le HTML. Si vous devez rendre du contenu HTML enrichi provenant de sources de confiance, envisagez d'utiliser le composant Label de Wicket avec une validation de modèle explicite plutôt que de désactiver l'évasion globalement. Pour le contenu généré par l'utilisateur qui doit inclure un formatage, utilisez une bibliothèque de purification HTML basée sur une liste blanche comme OWASP Java HTML Sanitizer ou Jsoup avec une liste d'autorisation restrictive avant de transmettre le contenu aux composants Wicket. En outre, mettez en œuvre des en-têtes de Politique de Sécurité de Contenu (CSP) pour fournir une défense en profondeur contre les XSS même si l'évasion est contournée. Consultez la documentation de l'API des composants Wicket à l'adresse https://nightlies.apache.org/wicket/apidocs/9.x/org/apache/wicket/Component.html pour un usage approprié des fonctionnalités d'évasion.

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_xss_rule-XSSReqParamToServletWriter

Résumé :

Neutralisation inadéquate des entrées lors de la génération de pages web ('Cross-site Scripting')

Gravité : Moyenne

CWE : CWE-79

Description :

L'application écrit des données fournies par l'utilisateur à partir des paramètres de requête HTTP directement dans la réponse HTTP via HttpServletResponse.getWriter().write(), HttpServletResponse.getWriter().print(), ou des méthodes similaires de l'écrivain de servlet. Cela crée une vulnérabilité de type Cross-Site Scripting (XSS) réfléchie, où les attaquants peuvent injecter du JavaScript malveillant en créant des paramètres de requête qui sont renvoyés dans la réponse HTTP sans encodage HTML. Ce modèle détecte le flux de contamination depuis des sources telles que HttpServletRequest.getParameter(), les entrées de fichiers, les ensembles de résultats de base de données, et d'autres sources de données non fiables vers les éviers de sortie de servlet. Sans un encodage de sortie approprié, des scripts malveillants intégrés dans les paramètres de requête s'exécuteront dans les navigateurs des victimes, entraînant potentiellement un vol de session, un vol d'identifiants ou des attaques de défiguration.

Remédiation :

Envisagez d'utiliser un encodage de sortie sensible au contexte avant d'écrire dans la réponse du servlet. Pour les contextes HTML, utilisez org.apache.commons.text.StringEscapeUtils.escapeHtml4() ou Encode.forHtml() de l'OWASP Java Encoder pour échapper l'entrée utilisateur avant de la passer à l'écrivain. Si vous écrivez des réponses en texte brut, définissez le Content-Type sur text/plain et l'encodage de caractères sur UTF-8 avec response.setContentType("text/plain; charset=UTF-8") pour empêcher les navigateurs d'interpréter la sortie comme du HTML. Pour les applications modernes, privilégiez l'utilisation de moteurs de templates comme JSP, Thymeleaf ou FreeMarker qui offrent une échappement automatique sensible au contexte plutôt que d'écrire manuellement dans les flux de sortie de servlet. Pour les contextes JavaScript, CSS ou URL, utilisez des fonctions d'encodage spécialisées de l'OWASP Java Encoder (Encode.forJavaScript(), Encode.forCssString(), Encode.forUriComponent()). Implémentez des en-têtes Content Security Policy (CSP) comme une couche de défense supplémentaire.

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_xxe_rule-XMLRdr

Résumé :

Restriction inappropriée de la référence d'entité externe XML ('XXE')

Sévérité : Moyenne

CWE : CWE-611

Description :

L'application utilise XMLReaderFactory.createXMLReader() pour créer un parser XML sans désactiver le traitement des entités externes, ce qui la rend vulnérable aux attaques d'entité externe XML (XXE). Lorsque qu'un parser XML traite des entrées XML non fiables avec le support des entités externes activé, les attaquants peuvent en profiter pour lire des fichiers arbitraires depuis le serveur, effectuer des attaques de falsification de requêtes côté serveur (SSRF) sur des systèmes internes, exfiltrer des données sensibles, ou provoquer des dénis de service par le biais d'attaques de "billion laughs". La classe XMLReaderFactory a été dépréciée et doit être remplacée par SAXParserFactory, qui offre de meilleures options de configuration de sécurité.

Remédiation :

Migrer vers SAXParserFactory à la place de l'obsolète XMLReaderFactory et le configurer pour désactiver complètement les déclarations DOCTYPE en utilisant setFeature("http://apache.org/xml/features/disallow-doctype-decl", true). Cette fonctionnalité empêche les attaques XXE, les attaques d'expansion d'entités, et les vulnérabilités de déni de service par milliards de rires en bloquant tout traitement de DTD. En alternative, activez XMLConstants.FEATURE_SECURE_PROCESSING pour appliquer plusieurs restrictions de sécurité. Exemple : SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); SAXParser parser = factory.newSAXParser(); parser.parse(inputStream, handler); Des conseils de sécurité supplémentaires sont disponibles à l'adresse suivante : https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#java

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

rules_lgpl_java_webview_rule-ignore-ssl-certificate-errors

Résumé :

Validation de certificat incorrecte

Sévérité : Moyenne

CWE : CWE-295

Description :

L'implémentation de WebViewClient de l'application appelle SslErrorHandler.proceed() dans le callback onReceivedSslError(), ce qui contourne la validation des certificats SSL/TLS. Cela permet au WebView d'accepter des certificats invalides, auto-signés, expirés ou contrôlés par un attaquant, rendant l'application vulnérable aux attaques Man-in-the-Middle (MitM) où un attaquant peut intercepter et manipuler toute communication entre l'application et le serveur. Toute donnée sensible transmise via le WebView, y compris les informations d'identification, les jetons de session ou les informations personnelles, peut être compromise lorsque la validation SSL est contournée.

Remédiation :

Envisagez d'appeler handler.cancel() au lieu de handler.proceed() dans le callback onReceivedSslError() pour rejeter les connexions avec des certificats invalides. L'approche recommandée consiste à remplacer onReceivedSslError() et à appeler handler.cancel() pour toutes les erreurs SSL (SSL_UNTRUSTED, SSL_EXPIRED, SSL_IDMISMATCH, SSL_NOTYETVALID, etc.), ce qui empêche le WebView de charger du contenu via des connexions non sécurisées. Pour les environnements de développement nécessitant des tests avec des certificats auto-signés, il est recommandé d'utiliser un bon système de pinning de certificats ou d'ajouter des certificats de développement au magasin de confiance Android plutôt que de désactiver la validation dans le code de production. Si votre application doit traiter certains types d'erreurs SSL différemment, validez soigneusement chaque cas d'erreur et documentez la justification commerciale, en veillant à ce que les versions de production n'acceptent jamais de certificats non fiables.

OWASP :

  • A3:2017-Exposition de données sensibles
  • A02:2021-Failles cryptographiques

rules_lgpl_java_webview_rule-webview-debugging

Résumé :

Code de débogage actif

Sévérité : Moyenne

CWE : CWE-489

Description :

L'application appelle WebView.setWebContentsDebuggingEnabled(true), ce qui active le débogage à distance via Chrome DevTools pour toutes les instances de WebView dans l'application. Cette fonctionnalité permet à quiconque ayant un accès physique à l'appareil ou l'accès au pont de débogage (ADB) d'inspecter, de modifier et d'extraire des données des WebViews, y compris des informations sensibles telles que des jetons de session, des identifiants, des données personnelles et la logique métier. Un attaquant disposant d'un accès de débogage peut exécuter du JavaScript arbitraire, intercepter des requêtes réseau, vider le contenu du stockage local et manipuler le DOM pour contourner les contrôles de sécurité côté client.

Remédiation :

Il est recommandé d'appeler WebView.setWebContentsDebuggingEnabled(false) ou de supprimer complètement l'appel à cette méthode, car le débogage est désactivé par défaut au niveau API 19 (KitKat) et supérieur. Si le débogage doit être activé pour les versions de développement, envisagez d'utiliser des drapeaux BuildConfig pour l'activer conditionnellement uniquement dans les versions de débogage : if (BuildConfig.DEBUG) { WebView.setWebContentsDebuggingEnabled(true); }. Cela garantit que les APK de production publiés aux utilisateurs finaux n'ont jamais le débogage WebView activé. Pour résoudre les problèmes de production, il est recommandé de mettre en œuvre des mécanismes de journalisation appropriés et de signalement des plantages plutôt que de s'appuyer sur les capacités de débogage à distance. Notez que ce paramètre s'applique globalement à toutes les instances de WebView dans le processus de l'application, donc un appel unique affecte l'ensemble de la posture de sécurité de l'application.

OWASP :

  • A6:2017-Misconfiguration de la sécurité
  • A05:2021-Misconfiguration de la sécurité

rules_lgpl_java_webview_rule-webview-set-allow-file-access

Résumé :

Contrôle externe du nom ou du chemin du fichier

Gravité : Moyenne

CWE : CWE-73

Description :

L'application appelle WebSettings.setAllowFileAccess(true), ce qui permet au WebView de charger du contenu à partir des URL file://. Lorsque l'accès aux fichiers est activé, tout code JavaScript s'exécutant dans le WebView peut potentiellement accéder aux fichiers locaux sur le système de fichiers de l'appareil, y compris les fichiers dans le répertoire privé de l'application et le stockage externe (selon d'autres paramètres). Si un attaquant peut injecter du JavaScript malveillant via XSS ou charger un contenu web non fiable, il pourrait lire des fichiers sensibles tels que des bases de données, des préférences partagées, des identifiants mis en cache ou d'autres données de l'application en utilisant des URL file:// combinées avec des appels d'API XMLHttpRequest ou fetch.

Remédiation :

Il est recommandé d'appeler webView.getSettings().setAllowFileAccess(false) pour désactiver l'accès aux URL file:// dans le WebView. Notez qu'à partir d'Android 11 (niveau API 30), l'accès aux fichiers est désactivé par défaut, mais il reste activé par défaut sur les versions Android antérieures. Si votre application doit charger du contenu HTML local, envisagez de l'emballer dans le répertoire des ressources et d'utiliser des URL file:///android_asset/, qui fournissent un accès contrôlé aux ressources regroupées sans permettre un accès arbitraire au système de fichiers. Pour le contenu généré par l'utilisateur ou téléchargé, il est recommandé d'utiliser ContentProvider avec des URI content:// ou de charger du contenu via HTTPS à partir d'un serveur de confiance. De plus, assurez-vous que setAllowFileAccessFromFileURLs(false) et setAllowUniversalAccessFromFileURLs(false) sont définis pour empêcher les URL file:// d'accéder à d'autres fichiers locaux ou de faire des requêtes inter-origines, car ces paramètres fournissent une défense en profondeur même lorsque l'accès aux fichiers est activé.

OWASP :

  • A5:2017-Contrôle d'accès défectueux
  • A01:2021-Contrôle d'accès défectueux

scala_xml_rule-XsltTransform

Résumé :

Injection XML (également connue sous le nom d'injection XPath aveugle)

Sévérité : Moyenne

CWE : CWE-91

Description :

L'utilisation de TransformerFactory.newTransformer() ou Transformer.transform() avec des feuilles de style XSLT provenant de sources non fiables peut conduire à des vulnérabilités d'exécution de code à distance. Les processeurs XSLT prennent en charge les fonctions d'extension et le chargement de ressources externes que les attaquants peuvent exploiter pour exécuter du code arbitraire, lire des fichiers sensibles ou effectuer des attaques de falsification de requêtes côté serveur. Lorsque la source ou le contenu de la feuille de style est contrôlé par l'entrée utilisateur via la concaténation de chaînes ou des chemins de fichiers externes, les attaquants peuvent injecter des directives XSLT malveillantes pour compromettre l'application.

Remédiation :

Envisagez de mettre en œuvre une validation stricte des entrées et d'éviter la construction dynamique de chemins de feuilles de style XSLT à partir de l'entrée utilisateur. Il est recommandé d'utiliser une approche par liste blanche où seules les fichiers de feuilles de style prédéfinis et fiables peuvent être chargés à partir d'un répertoire sécurisé. Lors de la création de la TransformerFactory, désactivez le traitement des entités externes et les fonctions d'extension en définissant XMLConstants.FEATURE_SECURE_PROCESSING sur true et en utilisant TransformerFactory.setFeature() pour désactiver les fonctionnalités dangereuses. Pour les applications nécessitant des transformations dynamiques, envisagez d'utiliser des moteurs de template comme FreeMarker ou Thymeleaf qui offrent de meilleurs contrôles de sécurité. Si XSLT doit être utilisé avec du contenu fourni par l'utilisateur, mettez en œuvre des politiques de sécurité de contenu, exécutez les transformations dans des environnements isolés avec des permissions restreintes, et validez toute sortie avant de l'utiliser dans des contextes sensibles en matière de sécurité.

Résumé :

Cookie sensible dans une session HTTPS sans attribut 'Secure'

Sévérité : Faible

CWE : CWE-614

Description :

L'application crée un objet javax.servlet.http.Cookie sans appeler setSecure(true) avant de l'ajouter à la HttpServletResponse. L'attribut Secure lorsqu'il est défini sur true protège la valeur du cookie contre une transmission via des chemins de communication en texte clair tels que HTTP, garantissant que le cookie ne sera envoyé que par HTTPS. Sans cette protection, les cookies de session et d'autres données sensibles peuvent être interceptés par des attaquants effectuant des attaques d'écoute réseau.

Remédiation :

Envisagez d'appeler setSecure(true) sur tous les objets Cookie avant de les ajouter à la réponse via addCookie(). Cela garantit que les cookies ne sont transmit que sur des connexions HTTPS chiffrées. Par exemple : Cookie cookie = new Cookie("session", value); cookie.setSecure(true); response.addCookie(cookie);. En plus du drapeau Secure, les cookies de session doivent également être configurés avec setHttpOnly(true) pour empêcher l'accès par JavaScript et envisager d'utiliser des attributs SameSite pour atténuer les attaques CSRF. Pour les applications modernes Spring Boot, vous pouvez configurer cela globalement via server.servlet.session.cookie.secure=true dans les propriétés d'application. Plus de détails sur https://jakarta.ee/specifications/servlet/4.0/apidocs/javax/servlet/http/cookie#setSecure-boolean-

OWASP :

  • A6:2017-Misconfiguration de sécurité
  • A05:2021-Misconfiguration de sécurité

java_cors_rule-PermissiveCORSInjection

Résumé :

Politique de cross-domain permissive avec des domaines non fiables

Gravité : Faible

CWE : CWE-942

Description :

L'application permet à l'entrée fournie par l'utilisateur de contrôler la valeur de l'en-tête de réponse Access-Control-Allow-Origin via HttpServletResponse.setHeader ou HttpServletResponse.addHeader. Cet en-tête fait partie de la spécification Cross-Origin Resource Sharing (CORS) qui détermine quels domaines externes peuvent accéder aux ressources de ce serveur. En permettant à l'entrée utilisateur de spécifier des domaines de confiance, un attaquant pourrait exploiter cette faiblesse pour forcer les clients à envoyer des identifiants (comme des identifiants de session ou des cookies) au serveur de l'attaquant. Cette vulnérabilité devient exploitable lorsqu'elle est combinée à d'autres faiblesses telles que le Cross-Site Scripting (XSS), permettant aux attaquants de contourner les protections de la politique de même origine et de voler des données sensibles.

Remédiation :

Considérez d'éviter l'utilisation de l'entrée fournie par l'utilisateur lors de la définition de la valeur de l'en-tête Access-Control-Allow-Origin dans HttpServletResponse.setHeader ou HttpServletResponse.addHeader. Il est recommandé de maintenir une liste blanche codée en dur des domaines de confiance et d'utiliser un mécanisme de recherche pour valider et sélectionner le domaine approprié. Cette approche garantit que seuls les domaines explicitement approuvés peuvent être définis dans l'en-tête CORS, empêchant les attaquants d'injecter des origines malveillantes. Envisagez d'implémenter une validation des domaines en maintenant une Map ou un Set de domaines autorisés et en utilisant l'entrée utilisateur uniquement comme clé pour rechercher la valeur de confiance, plutôt que de l'insérer directement dans l'en-tête.

Exemple de mise en œuvre d'une configuration d'en-tête CORS basée sur une liste blanche sécurisée :

// Définir les domaines autorisés dans le constructeur ou à partir d'une source de configuration fiable
Map<String, String> allowedDomains = new HashMap();
allowedDomains.put("sub1", "sub1.example.com");
allowedDomains.put("sub2", "sub2.example.com");

// Utiliser l'entrée de l'utilisateur uniquement comme clé de recherche, avec une valeur de secours par défaut sûre
String headerValue = allowedDomains.getOrDefault(
  request.getParameter("allowedDomain"),
  allowedDomains.get("sub1")
);

// Définir l'en-tête avec une valeur de domaine validée et de confiance
response.addHeader("Access-Control-Allow-Origin", headerValue);

Pour plus d'informations sur la configuration sécurisée de CORS, voir : Access-Control-Allow-Origin

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_smtp_rule-SmtpClient

Résumé :

Neutralisation incorrecte des éléments spéciaux utilisés dans une commande

Sévérité : Faible

CWE : CWE-77

Description :

L'application appelle les méthodes MimeMessage (setSubject, addHeader, setDescription ou setDisposition) avec des données contrôlées par l'utilisateur qui peuvent contenir des séquences CRLF (\r\n). SMTP est un protocole basé sur du texte qui utilise des en-têtes pour contrôler le routage des e-mails et les métadonnées. Un attaquant peut injecter des séquences CRLF pour ajouter des en-têtes d'e-mail arbitraires (comme CC, BCC ou des destinataires supplémentaires), ce qui peut entraîner l'envoi de messages à des destinataires non voulus ou contourner les contrôles de sécurité.

Remédiation :

Envisagez de désinfecter toutes les entrées contrôlées par l'utilisateur avant de les transmettre aux méthodes MimeMessage pour prévenir les attaques par injection d'en-têtes d'e-mail. Il est recommandé de supprimer ou d'encoder les séquences CRLF (\r et \n) dans toute donnée non fiable utilisée dans setSubject(), addHeader(), setDescription() ou setDisposition(). Vous pouvez utiliser StringEscapeUtils.escapeJava() d'Apache Commons Text, ou mettre en œuvre une validation qui rejette les entrées contenant ces caractères. Cela empêche les attaquants d'injecter des en-têtes d'e-mail supplémentaires qui pourraient rediriger les messages.

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_unsafe_rule-ExternalConfigControl

Résumé :

Contrôle externe des paramètres système ou de configuration

Gravité : Faible

CWE : CWE-15

Description :

L'application utilise des entrées fournies par l'utilisateur dans les appels à java.sql.Connection.setCatalog(), permettant aux adversaires de fournir un catalogue de base de données différent pour la durée de la connexion. Le contrôle externe des paramètres système peut perturber le service ou causer un comportement imprévu et potentiellement malveillant de l'application.

Remédiation :

Envisagez d'utiliser des noms de catalogue de base de données codés en dur plutôt que d'accepter des entrées utilisateur pour les appels à setCatalog(). Il est recommandé de définir les noms de catalogue autorisés dans la configuration de l'application et de valider contre une liste blanche avant utilisation. Ne passez jamais les entrées fournies par l'utilisateur directement de HttpServletRequest.getParameter() à Connection.setCatalog(). Si une sélection dynamique de catalogue est requise, utilisez une énumération ou une table de correspondance pour traduire les entrées utilisateur en valeurs sûres et prédéfinies.

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_endpoint_rule-RédirectionNonValidée

Résumé :

Redirection d'URL vers un site non fiable ('Redirection ouverte')

Sévérité : Info

CWE : CWE-601

Description :

L'application utilise HttpServletResponse.sendRedirect() ou HttpServletResponse.addHeader("Location", ...) avec des entrées fournies par l'utilisateur à partir des méthodes HttpServletRequest telles que getParameter(), getHeader(), ou getRequestURI() sans validation appropriée. Cela crée une vulnérabilité de redirection non validée où un attaquant peut concevoir des URL malveillantes qui redirigent les utilisateurs vers des sites externes arbitraires. De telles vulnérabilités sont souvent exploitées dans des attaques de phishing, où les victimes croient naviguer vers un domaine de confiance mais sont en réalité redirigées vers un site contrôlé par l'attaquant, conçu pour voler des identifiants ou délivrer des logiciels malveillants.

Remédiation :

Envisagez d'implémenter une approche de liste blanche où les URL de redirection sont validées par rapport à une collection prédéfinie (comme List<String> ou Set<String>) de chemins de destination sûrs avant d'appeler sendRedirect(). Par exemple, maintenez une liste de cibles de redirection approuvées telles que /home, /dashboard, /user/profile et redirigez uniquement lorsque safeUrls.contains(redirectUrl) retourne vrai, sinon redirigez vers une page par défaut sécurisée. Il est recommandé d'utiliser des chemins relatifs (commençant par /) plutôt que des URL absolues pour éviter complètement les redirections vers des domaines externes. Si votre application doit prendre en charge des redirections dynamiques, validez que l'URL de destination appartient au domaine de votre application en analysant l'URL et en vérifiant que le nom d'hôte correspond à vos domaines attendus. Pour les applications utilisant Spring Security, envisagez d'utiliser RedirectStrategy avec validation de domaine ou d'utiliser l'annotation @Valid avec des validateurs personnalisés. Évitez d'utiliser directement les paramètres de requête dans les opérations de redirection sans une validation et une désinfection approfondies.

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_file_rule-FileUploadFileName

Résumé :

Limitation inadéquate d'un chemin d'accès à un répertoire restreint ('Traversée de chemin')

Gravité : Info

CWE : CWE-22

Description :

Le nom de fichier obtenu à partir de Part.getSubmittedFileName() ou FileItem.getName() peut être manipulé par le client, ce qui pourrait entraîner des vulnérabilités de traversée de chemin, un accès non autorisé aux fichiers ou une inclusion de fichiers arbitraires. Les noms de fichiers fournis par le client sont des entrées non fiables et peuvent contenir des caractères de chemin malveillants (tels que des barres obliques /, des barres obliques inverses \, ou des séquences de traversée de chemin ../ ou ..\) qui pourraient permettre aux attaquants d'écrire des fichiers en dehors du répertoire prévu ou d'accéder à des fichiers restreints.

Remédiation :

Envisagez de procéder à une validation rigoureuse des noms de fichiers fournis par les clients pour vous assurer qu'ils respectent une structure prédéfinie, qu'ils sont dépourvus de caractères potentiellement dangereux, et qu'ils correspondent uniquement à des fichiers autorisés. Les stratégies recommandées incluent : (1) Assainir les noms de fichiers en créant une fonction pour supprimer ou remplacer les caractères non autorisés, y compris les séquences de traversée de chemin (../ ou ..\). Par exemple, utilisez Paths.get(fileName).getFileName() pour stripper les composants de répertoire. (2) Implémentez une validation par liste blanche, autorisant uniquement les noms de fichiers qui correspondent à un motif spécifique tel que [a-zA-Z0-9._-]+. (3) Envisagez de générer des noms de fichiers uniques côté serveur en utilisant UUID.randomUUID() plutôt que de vous fier aux noms fournis par le client pour le stockage des fichiers. (4) Vérifiez les chemins des fichiers à l'aide de Path.resolve() et assurez-vous que les fichiers sont enregistrés dans le répertoire correct prévu afin d'éviter les redirections vers des répertoires non autorisés.

Exemple de remédiation :

public class FileUploadHandler {
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
          throws ServletException, IOException {

        Part filePart = request.getPart("file");
        String fileName = filePart.getSubmittedFileName();

        // Supprime toute information de chemin du nom de fichier
        String sanitizedFileName = sanitizeFileName(fileName);
        if (!isFileNameAllowed(sanitizedFileName)) {
            throw new SecurityException("Nom de fichier invalide");
        }

        // Générer un nom de fichier unique pour le stockage
        String storedFileName = UUID.randomUUID().toString() + ".txt";

        Path targetPath = Paths.get("uploads").resolve(storedFileName);
        Files.copy(filePart.getInputStream(), targetPath,
                   StandardCopyOption.REPLACE_EXISTING);
    }

    private String sanitizeFileName(String fileName) {
        return Paths.get(fileName).getFileName().toString();
    }

    private boolean isFileNameAllowed(String fileName) {
        return fileName.matches("[a-zA-Z0-9._-]+");
    }
}

OWASP :

  • A5:2017-Contrôle d'accès rompu
  • A01:2021-Contrôle d'accès rompu

java_file_rule-FilenameUtils

Résumé :

Limitation incorrecte d'un chemin d'accès à un répertoire restreint ('Traversée de chemin')

Sévérité : Info

CWE : CWE-22

Description :

Des entrées contrôlées par l'utilisateur sont transmises aux méthodes FilenameUtils d'Apache Commons IO telles que FilenameUtils.concat(), FilenameUtils.normalize() ou FilenameUtils.getFullPath() sans validation appropriée. Lorsque des données non fiables provenant de sources comme les paramètres HttpServletRequest sont utilisées pour construire des chemins de fichiers, des attaquants peuvent exploiter des séquences de traversée de chemin (par exemple, ../ ou ..\) pour accéder à des fichiers ou les manipuler en dehors du répertoire prévu. Cela peut conduire à un accès non autorisé aux fichiers, à la divulgation d'informations ou à des opérations de fichiers arbitraires sur des emplacements de système de fichiers restreints.

Remédiation :

Considérez le traitement de toutes les entrées de l'utilisateur comme potentiellement malveillantes et implémentez une stratégie de validation des entrées "accepter uniquement les bonnes connues". Les approches recommandées incluent : (1) Utiliser FilenameUtils.getName() pour extraire uniquement le composant du nom de fichier, ce qui supprime toute information de chemin de répertoire avant de l'utiliser avec FilenameUtils.concat() pour le combiner en toute sécurité avec un répertoire de base. (2) Envisagez de valider les chemins de fichiers en utilisant Path.resolve() associé à Path.startsWith() pour vérifier que le chemin résolu reste dans le répertoire de base prévu, en lançant une exception si la validation échoue. (3) Implémentez une validation par liste blanche pour garantir que les noms de fichiers correspondent à des modèles attendus et ne contiennent que des caractères autorisés. Par exemple, si l'application construit des chemins comme "images/userprofiles/" + username, une entrée malveillante telle que "../../../etc/passwd" pourrait permettre un accès non autorisé à des fichiers sensibles.

Exemple de limitation de la traversée de chemin en utilisant getName() :

protected void doPut(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

    String input = req.getHeader("input");

    // Extraire uniquement le nom de fichier, en supprimant tout composant de chemin
    input = FilenameUtils.getName(input);

    String safePath = FilenameUtils.concat(basePath, input);

    // Lire le contenu du fichier
    File file = new File(safePath);
}

Exemple de validation de chemin en utilisant resolve() et startsWith() :

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

    String userInput = req.getParameter("filename");
    Path basePath = Paths.get("/var/www/uploads");

    Path resolvedPath = basePath.resolve(userInput).normalize();

    if (!resolvedPath.startsWith(basePath)) {
        throw new SecurityException("Tentative de traversée de chemin détectée");
    }

    File file = resolvedPath.toFile();
}

OWASP :

  • A5:2017-Contrôle d'accès défaillant
  • A01:2021-Contrôle d'accès défaillant

java_inject_rule-ELInjection

Résumé :

Neutralisation incorrecte des éléments spéciaux utilisés dans une instruction de langage d'expression ('Injection de langage d'expression')

Gravité : Info

CWE : CWE-917

Description :

L'application utilise des méthodes de langage d'expression (EL) telles que ExpressionFactory.createValueExpression(), ExpressionFactory.createMethodExpression(), ELProcessor.eval(), ELProcessor.getValue(), ou ELProcessor.setValue() avec des entrées non codées en dur, ce qui permet des attaques par injection EL. Lorsque createValueExpression() crée un objet ValueExpression, il est évalué lors de l'appel des méthodes getValue(), setValue(), ou de Lambda invoke(). De même, createMethodExpression() crée un MethodExpression qui s'évalue lors des appels à invoke() ou getMethodInfo(). Ces méthodes d'évaluation peuvent permettre à des adversaires d'exécuter du code Java arbitraire, y compris des commandes système lorsque des expressions contrôlées par l'utilisateur sont traitées. L'injection EL est particulièrement dangereuse car les attaquants peuvent accéder à l'environnement d'exécution Java et exécuter des commandes système via la réflexion.

Remédiation :

Envisagez d'utiliser une approche basée sur une liste d'autorisation où les entrées utilisateur sont validées par rapport à un ensemble prédéfini de valeurs autorisées en utilisant Set.contains() ou une table de recherche avant toute traitement EL. Ne passez jamais directement des chaînes fournies par l'utilisateur aux méthodes d'évaluation EL. Lorsque un comportement dynamique est nécessaire, utilisez ELProcessor.defineBean() pour lier des objets de données pré-validés au contexte EL, puis référencez ces beans dans des expressions EL codées en dur plutôt que de construire des expressions à partir des entrées utilisateur. Pour afficher des données utilisateur dans des vues JSP ou JSF, utilisez des balises JSTL standard comme <c:out> qui échappent automatiquement la sortie, ou définissez les beans via des propriétés de bean gérées plutôt que d'évaluer des chaînes d'expressions fournies par l'utilisateur. Si vous devez prendre en charge une certaine configuration dynamique, implémentez un analyseur strict qui n'autorise l'accès qu'à des propriétés spécifiques des beans sans capacités d'invocation de méthodes. Assurez-vous que votre application utilise la dernière version de l'implémentation EL pour bénéficier des correctifs de sécurité et des fonctionnalités de confinement améliorées.

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_strings_rule-BadHexConversion

Résumé :

Conversion ou cast de type incorrect

Sévérité : Info

CWE : CWE-704

Description :

L'application utilise Integer.toHexString() pour convertir les tableaux d'octets de hachage provenant de MessageDigest.digest() en chaînes hexadécimales, ce qui peut donner des résultats incorrects lorsque les valeurs d'octets contiennent des zéros en tête. La méthode Integer.toHexString() omet les zéros en tête pour les valeurs d'octets inférieures à 0x10, aboutissant à des représentations hexadécimales à un caractère au lieu du format requis à deux caractères. Cela entraîne des chaînes de hachage mal formées qui ne peuvent pas être correctement comparées ou validées, ce qui peut causer des vulnérabilités de sécurité dans les systèmes d'authentification, de vérification d'intégrité ou de vérification de signatures.

Remédiation :

Envisagez de migrer vers java.util.HexFormat introduit dans Java 17, qui fournit une méthode fiable et efficace pour l'encodage hexadécimal avec un bon remplissage de zéros. Pour les applications fonctionnant sur des versions de Java antérieures à 17, les alternatives recommandées incluent javax.xml.bind.DatatypeConverter.printHexBinary() ou Hex.encodeHexString() de Apache Commons Codec. L'approche HexFormat.of().formatHex(byteArray) est préférée pour les applications modernes car elle gère correctement tous les cas particuliers et produit par défaut des chaînes hexadécimales en minuscules. Lors de l'utilisation de DatatypeConverter, sachez qu'il produit des chaînes hexadécimales en majuscules et a été déprécié dans Java 9, bien qu'il reste disponible dans Java 11. Pour une compatibilité maximale entre les versions de Java, Apache Commons Codec offre un comportement cohérent et est largement testé dans des environnements de production.

OWASP :

  • A6:2017-Mésconfiguration de Sécurité
  • A05:2021-Mésconfiguration de Sécurité

java_strings_rule-ModifyAfterValidation

Résumé :

Concentration des données dans une valeur non sécurisée

Gravité : Info

CWE : CWE-182

Description :

L'application valide une chaîne en utilisant Pattern.matcher() puis la modifie avec replace(), replaceAll(), replaceFirst(), ou concat() après la validation. Cela crée une vulnérabilité de type temps de vérification/temps d'utilisation où les attaquants peuvent concevoir une entrée qui passe la validation mais devient malveillante après modification. Par exemple, valider contre ../ puis le retirer permet à un attaquant de soumettre ..../, qui devient ../ après suppression, contournant ainsi le contrôle de sécurité. Ce modèle viole le principe de codage sécurisé IDS11-J des directives CERT de Carnegie Mellon et peut entraîner des traversées de chemin, des attaques par injection ou d'autres contournements de sécurité en fonction du contexte de validation.

Remédiation :

Envisagez toujours de procéder aux modifications de chaînes telles que replaceAll(), replace(), replaceFirst(), ou concat() avant d'appliquer la validation avec Pattern.matcher(). La séquence correcte est : (1) normaliser/sanitiser l'entrée, (2) valider le résultat, (3) utiliser la chaîne validée sans modification supplémentaire. Il est recommandé d'utiliser replaceAll() au lieu de replace() pour supprimer des motifs, car un remplacement en une seule passe peut laisser du contenu malveillant résiduel. Pour la prévention des traversées de chemin spécifiquement, évitez totalement la manipulation de chaînes et utilisez plutôt Path.normalize() suivi d'une validation pour s'assurer que le chemin normalisé reste dans les limites autorisées en utilisant Path.startsWith(). Dans la plupart des contextes critiques pour la sécurité, envisagez de rejeter les entrées contenant des caractères suspects plutôt que d'essayer de les sanitiser. Lorsqu'une modification est nécessaire, envisagez d'utiliser des fonctions d'encodage telles que URLEncoder.encode() ou un échappement approprié au contexte plutôt que la suppression, car l'encodage conserve l'intention tout en empêchant l'interprétation. Voir https://wiki.sei.cmu.edu/confluence/display/java/IDS11-J pour des conseils détaillés.

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection

java_strings_rule-NormalizeAfterValidation

Résumé :

Ordre de comportement incorrect : valider avant de normaliser

Gravité : Info

CWE : CWE-180

Description :

L'application effectue une validation en utilisant Pattern.matcher() puis appelle Normalizer.normalize() après que la validation a eu lieu. Cela crée une vulnérabilité de sécurité où les attaquants peuvent utiliser des équivalents Unicode ou des caractères de compatibilité pour contourner la validation. Par exemple, le caractère Unicode U+FE64 (﹤) se normalise en '<' sous la normalisation NFKC, permettant à un attaquant de contourner la validation des chevrons et d'injecter des balises HTML ou XML. Cela viole le principe de codage sécurisé IDS01-J des directives CERT de Carnegie Mellon et peut mener à des scripts intersites, des attaques d'injection, ou des contournements de contrôles de sécurité selon comment la chaîne validée est ensuite utilisée.

Remédiation :

Il est conseillé d'effectuer toujours Normalizer.normalize() avant la validation en utilisant Pattern.matcher() ou toute autre logique de validation. La séquence correcte est : (1) normaliser l'entrée en utilisant la forme NFKC ou NFC, (2) valider le résultat normalisé, (3) utiliser la chaîne validée. Envisagez d'utiliser Normalizer.Form.NFKC pour une normalisation de compatibilité qui convertit les caractères de compatibilité comme les variantes en pleine largeur et en demi-largeur en leurs formes canoniques, bien qu'il soit important de noter que cela soit plus agressif que Normalizer.Form.NFC. Pour des contextes critiques en matière de sécurité tels que la sortie HTML ou les requêtes SQL, envisagez d'utiliser des fonctions d'encodage appropriées au contexte provenant de bibliothèques telles que OWASP Java Encoder après normalisation, plutôt que de compter uniquement sur la validation des caractères. Soyez conscient que certains caractères Unicode n'ont pas d'équivalents normalisés et nécessitent un traitement explicite dans votre logique de validation. Consultez https://wiki.sei.cmu.edu/confluence/display/java/IDS01-J pour des conseils détaillés et des exemples supplémentaires de contournements de validation basés sur Unicode.

OWASP :

  • A1:2017-Injection
  • A03:2021-Injection