コンテンツにスキップ

Expression Language (EL) Injection

式言語 (EL) インジェクション

説明

式言語インジェクション (EL インジェクション) は、Web アプリケーションで一般的に利用される式言語内でのユーザー入力の不適切な処理に起因する重大な脆弱性です。これらの言語は、データに動的にアクセスして変更するために機能します。攻撃者は、これらの式に悪意のあるコードを挿入することで EL インジェクションを悪用します。この不正な改ざんにより、不正アクセス、データ侵害、さらにはリモートでのコード実行など、深刻な結果を招く可能性があります。

EL インジェクションは主に、JSP (JavaServer Pages)、JSF (JavaServer Faces)、Apache Struts、Thymeleaf、その他 Web アプリケーション開発で一般的に採用されているさまざまな式言語をサポートするフレームワークやテンプレート内で発生します。

  @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";
          }
      }

  }

推奨事項

式言語インジェクション (EL インジェクション) に対してアプリケーションを保護するには、以下の推奨事項を検討してください:

  • ユーザー入力の直接的な使用を避ける: 可能な限り、EL 式でユーザー入力を直接使用することは避けてください。代わりに、事前定義された安全な値のみを EL 式で使用できるようにするホワイトリストアプローチを推奨します。

  • 入力検証: ユーザー入力を EL 式で使用する前に、検証およびサニタイズを行います。期待されるデータ型とパターンのみを受け入れるように厳格な検証を実装してください。

  • コンテキスト固有のエンコーディング: フレームワークまたはライブラリによって提供されるエンコーディング関数 (JSP の \、JSTL の fn:escapeXml() など) を使用して、コンテキストを認識した出力エンコーディングを確実に行います。これにより、ユーザー入力がコードとして解釈されるのを防ぎます。

  @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;
      }
  }

リンク

標準

  • 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