算术表达式中的不受控数据¶
ID: java/uncontrolled-arithmetic
Kind: path-problem
Security severity: 8.6
Severity: warning
Precision: medium
Tags:
- security
- external/cwe/cwe-190
- external/cwe/cwe-191
Query suites:
- java-security-extended.qls
- java-security-and-quality.qls
对不受控制的数据执行计算可能会导致整数溢出,除非验证输入。
如果数据不受您的控制,并且可以取极大的值,即使通常会导致幅度略微变化的算术运算也可能导致溢出。
建议¶
始终通过执行以下操作之一来防止对不受控制的数据进行算术运算时的溢出
验证数据。
对算术表达式定义一个保护,以便仅在结果可以确定小于或等于类型的最大值时才执行运算,例如
MAX_VALUE
。使用更宽的类型,这样更大的输入值不会导致溢出。
示例¶
在此示例中,生成了一个随机整数。由于该值不受程序员控制,因此它可能非常大。因此,对该值执行算术运算可能会导致溢出。为了避免这种情况,该示例展示了如何在执行乘法之前执行检查。
class Test {
public static void main(String[] args) {
{
int data = (new java.security.SecureRandom()).nextInt();
// BAD: may overflow if data is large
int scaled = data * 10;
// ...
// GOOD: use a guard to ensure no overflows occur
int scaled2;
if (data < Integer.MAX_VALUE/10)
scaled2 = data * 10;
else
scaled2 = Integer.MAX_VALUE;
}
}
}
参考资料¶
SEI CERT Oracle Java 编码标准:NUM00-J. 检测或防止整数溢出.
常见弱点枚举:CWE-190.
常见弱点枚举:CWE-191.