CWE-194: Unexpected Sign Extension(意外的符号扩展)

 ID: 194

类型:基础
结构:简单

状态:未完成

描述

软件对一个数字执行一个操作,当该数字转换为取值范围较大的数据类型时,该数字将被符号扩展。当原始数字为负数时,这可能会产生意外的值,导致产生弱点。

相关视图

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

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

引入模式

阶段

说明

实现

 

应用平台

语言

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

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

后果

范围

冲击

可能性

完整性
保密性
可利用性
其它

技术冲击: 内存读取; 修改内存; 其它

当直接在内存缓冲区(如大小值或内存索引)上操作的代码中出现意外的符号扩展时,它可能会导致程序在预期缓冲区的边界之外写入或读取。如果数字值与应用程序级资源(如电子商务站点中产品的数量或价格)关联,则符号扩展可以生成比应用程序允许范围高很多(或低很多)的值。

 

被利用的可能性:

示例

例1

以下代码读取最大大小,并对该大小执行健全性检查。然后它执行strncpy,假设它不会超过数组的边界。在这个特定的示例中,虽然强制使用“short s”,但short int经常用于实际代码中,例如处理结构化数据的代码

(问题代码)

Example Language:

int GetUntrustedInt () {

return(0x0000FFFF);

}

void main (int argc, char **argv) {

char path[256];
char *input;
int i;
short s;
unsigned int sz;

i = GetUntrustedInt();
s = i;
/* s is -1 so it passes the safety check - CWE-697 */
if (s > 256) {

DiePainfully("go away!\n");

}

/* s is sign-extended and saved in sz */
sz = s;

/* output: i=65535, s=-1, sz=4294967295 - your mileage may vary */
printf("i=%d, s=%d, sz=%u\n", i, s, sz);

input = GetUserInput("Enter pathname:");

/* strncpy interprets s as unsigned int, so it's treated as MAX_INT
(CWE-195), enabling buffer overflow (CWE-119) */
strncpy(path, input, s);
path[255] = '\0'; /* don't want CWE-170 */
printf("Path is: %s\n", path);

}

此代码首先展示了CWE-839的一个示例,允许“s”为负数。当短整形负数“s”转换为无符号整数时,它将成为一个非常大的正整数。当strncpy()使用此转换后的整数时,将导致缓冲区溢出(cwe-119)。

应对措施

阶段: 实现

如果不需要表示负值,请避免使用有符号变量。当需要负值时,请在将这些值保存到较大的数据类型之后,或在将它们传递给需要无符号值的函数之前,执行健全性检查。

种属

 

关系

类型

ID

名称

属于

998

SFP Secondary Cluster: Glitch in Computation

属于

1158

SEI CERT C Coding Standard - Guidelines 04. Integers (INT)

说明

维护

此条目与有符号到无符号转换错误(CWE-195)和其他数字错误密切相关。这些关系需要在CWE中更仔细地检查。

关联

符号扩展错误可能导致缓冲区溢出和其他基于内存的问题。它们也可能是其他弱点的因素,这些弱点不是基于内存操作,而是依赖于数值计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值