Aller au contenu

Expression Language (EL) Injection

Injection de Langage d'Expression (EL)

Description

L'injection de langage d'expression (EL Injection) est une vulnérabilité critique découlant de la mauvaise gestion des entrées utilisateur au sein des langages d'expression couramment utilisés dans les applications web. Ces langages servent à accéder et à modifier dynamiquement des données. Les attaquants exploitent l'EL Injection en injectant du code malveillant dans ces expressions. Cette altération non autorisée peut entraîner de graves conséquences, notamment un accès non autorisé, des violations de données ou même l'exécution de code à distance.

L'EL Injection se manifeste principalement dans les frameworks ou les modèles prenant en charge des langages d'expression tels que JSP (JavaServer Pages), JSF (JavaServer Faces), Apache Struts, Thymeleaf, et divers autres couramment employés dans le développement d'applications web.

Exemple

  @RestController
  public class MathExpressionController {

      private final ExpressionParser parser = new SpelExpressionParser();

      @GetMapping("/evaluate")
      public String evaluateExpression(@RequestParam String expression) {
          Expression exp = parser.parseExpression(expression);
          try {
              Object result = exp.getValue();
              return "Result: " + result.toString();
          } catch (Exception e) {
              return "Error: Invalid expression";
          }
      }

  }

Recommandation

Pour sécuriser l'application contre l'injection de langage d'expression (EL Injection), tenez compte des recommandations suivantes :

  • Éviter l'utilisation directe des entrées utilisateur : Dans la mesure du possible, évitez d'utiliser directement les entrées utilisateur dans les expressions EL. Privilégiez plutôt une approche par liste blanche où seules des valeurs prédéfinies et sûres sont autorisées à être utilisées dans les expressions EL.

  • Validation des entrées : Validez et nettoyez les entrées utilisateur avant de les utiliser dans les expressions EL. Mettez en œuvre une validation stricte pour n'accepter que les types de données et les modèles attendus.

  • Encodage spécifique au contexte : Utilisez les fonctions d'encodage fournies par votre framework ou vos bibliothèques (par exemple, \ dans JSP, fn:escapeXml() dans JSTL) pour garantir un encodage de sortie sensible au contexte. Cela empêche l'interprétation des entrées utilisateur en tant que code.

Exemple

  @RestController
  public class MathExpressionController {

      private final ExpressionParser parser = new SpelExpressionParser();

      @GetMapping("/evaluate")
      public String evaluateExpression(@RequestParam String expression) {
          String sanitizedExpression = sanitizeInput(expression);
          Expression exp = parser.parseExpression(sanitizedExpression);
          try {
              Object result = exp.getValue();
              return "Result: " + result.toString();
          } catch (Exception e) {
              return "Error: Invalid expression";
          }
      }

      private String sanitizeInput(String input) {
          // Implement your input sanitization logic here
          // For this example, allow only basic arithmetic operations and numbers
          input = input.replaceAll("[^0-9\\+\\-\\*/]", ""); // Allow only digits, +, -, *, /
          return input;
      }
  }

Liens

Normes

  • CWE_TOP_25:
    • CWE_20
  • GDPR:
    • ART_5
    • ART_32
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_3
    • REQ_11_3
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_3_4
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213
    • SECURITY255