CodeQL 文档

表达式语言注入 (MVEL)

ID: java/mvel-expression-injection
Kind: path-problem
Security severity: 9.3
Severity: error
Precision: high
Tags:
   - security
   - external/cwe/cwe-094
Query suites:
   - java-code-scanning.qls
   - java-security-extended.qls
   - java-security-and-quality.qls

单击以在 CodeQL 存储库中查看查询

MVEL 是一种基于 Java 语法的表达式语言,提供许多功能,包括调用 JVM 中可用的方法。如果使用攻击者控制的数据构建 MVEL 表达式,然后对其进行评估,则可能允许攻击者运行任意代码。

建议

应避免在 MVEL 表达式中包含用户输入。

示例

在以下示例中,第一个示例使用不受信任的数据构建 MVEL 表达式,然后在默认上下文中运行它。在第二个示例中,使用自定义方法验证不受信任的数据,该方法检查表达式是否在评估之前包含意外代码。

public void evaluate(Socket socket) throws IOException {
  try (BufferedReader reader = new BufferedReader(
    new InputStreamReader(socket.getInputStream()))) {
  
    String expression = reader.readLine();
    // BAD: the user-provided expression is directly evaluated
    MVEL.eval(expression);
  }
}

public void safeEvaluate(Socket socket) throws IOException {
  try (BufferedReader reader = new BufferedReader(
    new InputStreamReader(socket.getInputStream()))) {
  
    String expression = reader.readLine();
    // GOOD: the user-provided expression is validated before evaluation
    validateExpression(expression);
    MVEL.eval(expression);
  }
}

private void validateExpression(String expression) {
  // Validate that the expression does not contain unexpected code.
  // For instance, this can be done with allow-lists or deny-lists of code patterns.
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私