ID: 194 类型:基础 | 状态:未完成 |
描述
软件对一个数字执行一个操作,当该数字转换为取值范围较大的数据类型时,该数字将被符号扩展。当原始数字为负数时,这可能会产生意外的值,导致产生弱点。
相关视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
完整性 | 技术冲击: 内存读取; 修改内存; 其它 当直接在内存缓冲区(如大小值或内存索引)上操作的代码中出现意外的符号扩展时,它可能会导致程序在预期缓冲区的边界之外写入或读取。如果数字值与应用程序级资源(如电子商务站点中产品的数量或价格)关联,则符号扩展可以生成比应用程序允许范围高很多(或低很多)的值。 |
被利用的可能性:
高
示例
例1
以下代码读取最大大小,并对该大小执行健全性检查。然后它执行strncpy,假设它不会超过数组的边界。在这个特定的示例中,虽然强制使用“short s”,但short int经常用于实际代码中,例如处理结构化数据的代码
(问题代码)
Example Language: C
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 | ||
属于 | 1158 |
说明
维护
此条目与有符号到无符号转换错误(CWE-195)和其他数字错误密切相关。这些关系需要在CWE中更仔细地检查。
关联
符号扩展错误可能导致缓冲区溢出和其他基于内存的问题。它们也可能是其他弱点的因素,这些弱点不是基于内存操作,而是依赖于数值计算。