CWE-478: Missing Default Case in Switch Statement(switch缺少default)

 ID: 478

类型:变量
结构:简单

状态:草稿

描述

代码在switch语句中没有defult,这可能导致复杂的逻辑错误和由此产生的弱点。

扩展描述

这个缺陷代表了软件开发中的一个常见问题,在这个问题中,并非所有变量的可能值都由给定的过程来考虑或处理。因此,进一步的决策是基于糟糕的信息和级联故障结果。这种级联故障可能导致任何数量的安全问题,并构成系统中的重大故障。

关联视图

与“研究层面”视图(CWE-1000)相关

与“开发层面”视图(CWE-699)相关

引入模式

阶段

说明

实现

 

应用平台

语言

C (出现的可能性不确定)

C++ (出现的可能性不确定)

Java (出现的可能性不确定)

C# (出现的可能性不确定)

后果

范围

冲击

可能性

完整性

技术冲击: 上下文相关; 修改执行逻辑

根据所涉及的逻辑情况,可能会导致任何后果:例如,保密性、认证、授权、可利用性、完整性、责任性或不可抵赖性问题。

 

示例

例1

如果安全检查函数在发生错误时返回-1值,则以下内容无法正确检查返回代码。如果攻击者可以提供将调用错误的数据,则攻击者可以绕过安全检查:

(问题代码)

Example Language:

#define FAILED 0
#define PASSED 1
int result;
...
result = security_check(data);
switch (result) {

case FAILED:

printf("Security check failed!\n");
exit(-1);
//Break never reached because of exit()
break;


case PASSED:

printf("Security check passed.\n");
break;

}
// program execution continues...
...

应该使用default语句处理未考虑到的情况:

(正确代码)

Example Language:

#define FAILED 0
#define PASSED 1
int result;
...
result = security_check(data);
switch (result) {

case FAILED:

printf("Security check failed!\n");
exit(-1);
//Break never reached because of exit()
break;


case PASSED:

printf("Security check passed.\n");
break;


default:

printf("Unknown error (%d), exiting...\n",result);
exit(-1);

}

之所以使用此标签,是因为无法假设所有可能的案例都已得到解释。一个好的实践是为错误处理保留默认情况。

例2

在下面的Java示例中,GETSeReStand方法检索抵押点的利率。输入参数中提供了点数,switch语句将根据点数设置要返回的利率值。

(问题代码)

Example Language: Java 

public static final String INTEREST_RATE_AT_ZERO_POINTS = "5.00";
public static final String INTEREST_RATE_AT_ONE_POINTS = "4.75";
public static final String INTEREST_RATE_AT_TWO_POINTS = "4.50";
...
public BigDecimal getInterestRate(int points) {

BigDecimal result = new BigDecimal(INTEREST_RATE_AT_ZERO_POINTS);

switch (points) {

case 0:

result = new BigDecimal(INTEREST_RATE_AT_ZERO_POINTS);
break;


case 1:

result = new BigDecimal(INTEREST_RATE_AT_ONE_POINTS);
break;


case 2:

result = new BigDecimal(INTEREST_RATE_AT_TWO_POINTS);
break;

}
return result;

}

但是,此代码假定Points输入参数的值始终为0、1或2,并且不检查传递给该方法的其他错误值。这可以通过在switch语句中提供一个默认标签轻松实现,该标签输出一条错误消息,指示Points输入参数的无效值,并返回一个空值。

(正确代码)

Example Language: Java 

public static final String INTEREST_RATE_AT_ZERO_POINTS = "5.00";
public static final String INTEREST_RATE_AT_ONE_POINTS = "4.75";
public static final String INTEREST_RATE_AT_TWO_POINTS = "4.50";
...
public BigDecimal getInterestRate(int points) {

BigDecimal result = new BigDecimal(INTEREST_RATE_AT_ZERO_POINTS);

switch (points) {

case 0:

result = new BigDecimal(INTEREST_RATE_AT_ZERO_POINTS);
break;


case 1:

result = new BigDecimal(INTEREST_RATE_AT_ONE_POINTS);
break;


case 2:

result = new BigDecimal(INTEREST_RATE_AT_TWO_POINTS);
break;


default:

System.err.println("Invalid value for points, must be 0, 1 or 2");
System.err.println("Returning null value for interest rate");
result = null;

}

return result;

}

应对措施

阶段: 实现

在根据给定变量的值调整流或值时,确保没有未计数的情况。在switch语句中,这可以通过使用默认标签来实现。

阶段: 实现

在switch样式语句的情况下,创建默认情况的非常简单的操作可以减轻这种情况(如果正确地完成)。然而,通常情况下,默认情况只是用来表示一个假定的选项,而不是作为对无效输入的检查。这是一种糟糕的做法,在某些情况下,这和完全忽略默认情况一样糟糕。

种属

关系

类型

ID

名称

属于

884

CWE Cross-section

属于

962

SFP Secondary Cluster: Unchecked Status Condition

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值