CWE-783: Operator Precedence Logic Error(操作符优先级逻辑错误)

 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:

#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:

...

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

CWE Cross-section

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值