ID: 783 类型:变量 | 状态:草稿 |
描述
程序使用一个表达式,其中运算符优先级导致使用不正确的逻辑。
扩展描述
虽然通常只是一个bug,但如果在安全关键代码中使用运算符优先级逻辑错误,例如进行身份验证决策,则会产生严重后果。
相关视图
"研究概念"视图 (CWE-1000)
Nature | Type | ID | Name |
ChildOf | 670 | 永假控制流 |
"开发概念"视图 (CWE-699)
Nature | Type | ID | Name |
MemberOf | 569 | 表达式相关 |
引入模式
阶段 | 说明 |
实现 | 与运算符优先级相关的逻辑错误甚至在正常操作期间也可能导致问题,因此在测试阶段很可能很快发现这些错误。如果测试不完整或严重依赖于对代码的手动检查,那么在部署软件之前可能不会发现这些错误。 |
应用平台
语言
C (很少发生)
C++ (很少发生)
Class: Language-Independent (很少发生)
后果
范围 | 冲击 | 可能性 |
保密性 | 技术冲击: 依赖上下文; 意外状态 根据围绕不正确优先级的上下文,结果会有所不同。在安全决策中,完整性或保密性是最可能的结果。否则,由于软件达到意外状态,可能会发生崩溃。 |
被利用的可能性:
低
示例
例1
在下面的示例中,方法validateuser调用另一个方法来验证用户的用户名和密码,并返回一个成功或失败代码。
(问题代码)
Example Language: C
#define FAIL 0
#define SUCCESS 1
...
int validateUser(char *username, char *password) {
int isUser = FAIL;
// call method to authenticate username and password
// if authentication fails then return failure otherwise return success
if (isUser = AuthenticateUser(username, password) == FAIL) {
return isUser;
}
else {
isUser = SUCCESS;
}
return isUser;
}
但是,验证用户名和密码的方法是在具有不正确的运算符优先逻辑的if语句中调用的。由于比较运算符“==”的优先级高于赋值运算符“=”,因此将首先计算比较运算符,如果方法返回失败,则比较将为真,返回变量将设置为真,并返回成功。通过在if语句的表达式中正确地使用括号,可以很容易地解决此运算符优先级逻辑错误,如下所示.
(正确代码)
Example Language: C
...
if ((isUser = AuthenticateUser(username, password)) == FAIL) {
...
例2
在本例中,该方法计算会计/财务应用程序的投资回报。投资回报率的计算方法是:从现值中减去初始投资成本,然后除以初始投资成本。
(问题代码)
Example Language: Java
public double calculateReturnOnInvestment(double currentValue, double initialInvestment) {
double returnROI = 0.0;
// calculate return on investment
returnROI = currentValue - initialInvestment / initialInvestment;
return returnROI;
}
但是,由于公式中的运算符优先逻辑不正确,投资回报率计算将无法产生正确的结果。除法运算符的优先级高于减法运算符,因此该公式将初始投资成本除以初始投资成本,后者将仅从当前值中减去一。同样,可以通过在公式中正确使用括号来解决此运算符优先级逻辑错误,如下所示。
(正确代码)
Example Language: Java
...
returnROI = (currentValue - initialInvestment) / initialInvestment;
...
请注意,本例中的initionvestment变量应该经过验证,以确保它大于零,以避免潜在的被零除错误(CWE-369)。
应对措施
阶段: 实现 定期将子表达式括在括号中,特别是在安全关键代码中。 |
种
关系 | 类型 | ID | 名称 |
属于 | 737 | CERT C Secure Coding Standard (2008) Chapter 4 - Expressions (EXP) | |
属于 | 884 |