CWE-192: Integer Coercion Error(整数强制转换错误)

 ID: 192

类型:类
结构:简单

状态:未完成

描述

整数强制是指与原始数据类型的类型转换、扩展或截断相关的缺陷。

扩展描述

数个缺陷属于整数强制错误的范畴。在大多数情况下,这些错误本身只会导致可用性和数据完整性问题。但是,在某些情况下,它们可能会导致其他更复杂的安全相关缺陷,例如缓冲区溢出条件。

相关视图

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

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

引入模式

阶段

说明

实现

 

应用平台

语言

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

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

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

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

后果

 

范围

冲击

可能性

可利用性

技术冲击: DoS: 资源消耗(CPU): DoS: 资源消耗 (内存):; DoS: 崩溃、退出或重启

整数强制转化通常会导致未定义的执行状态,从而导致无限循环或崩溃

 

完整性
保密性
可利用性

技术冲击: 执行未获授权的代码或命令

在某些情况下,整数强制转换错误可能导致可利用的缓冲区溢出条件,从而导致执行任意代码。

 

完整性
Other

技术冲击: 其它

整数强制转换错误导致为相关变量存储的值不正确。

 

被利用的可能性:

中等

示例

例1

以下代码用于从套接字读取传入数据包并提取一个或多个头。

(问题代码)

Example Language:

DataPacket *packet;
int numHeaders;
PacketHeader *headers;

sock=AcceptSocketConnection();
ReadPacket(packet, sock);
numHeaders =packet->headers;

if (numHeaders > 100) {

ExitError("too many headers!");

}
headers = malloc(numHeaders * sizeof(PacketHeader);
ParsePacketHeaders(packet, headers);

代码执行检查以确保数据包不包含太多的头。但是,numHeaders被定义为带符号的int,因此它可能是负数。如果传入数据包指定了一个值,例如-3,那么malloc计算将生成一个负数(如果每个头最多可以有100个字节,则为-300)。当将此结果提供给malloc()时,首先将其转换为大小类型。然后,该转换会产生一个较大的值,如4294966996,这可能会导致malloc()失败或分配非常大的内存(CWE-195)。使用适当的负数,攻击者可以诱骗malloc()使用非常小的正数,然后分配比预期小得多的缓冲区,可能导致缓冲区溢出。

例2

以下代码读取最大大小,并对该大小执行健全性检查。然后它执行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

名称

属于

738

CERT C Secure Coding Standard (2008) Chapter 5 - Integers (INT)

属于

872

CERT C++ Secure Coding Section 04 - Integers (INT)

属于

1158

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

说明

维护

在C中,“强制”在语义上可能不同于“强制转换”,这可能取决于程序员是否直接指定转换,或者编译器是否隐式指定转换。这对这个节点和其他节点(如CWE-681)的表示,以及这些节点是否有足够的差异来进行拆分都有影响。

你可能感兴趣的:(漏洞检查)