表达式语言注入 (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
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.
}