ID: 192 类型:类 |
状态:未完成 |
描述
整数强制是指与原始数据类型的类型转换、扩展或截断相关的缺陷。
扩展描述
数个缺陷属于整数强制错误的范畴。在大多数情况下,这些错误本身只会导致可用性和数据完整性问题。但是,在某些情况下,它们可能会导致其他更复杂的安全相关缺陷,例如缓冲区溢出条件。
相关视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 |
说明 |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
Java (出现的可能性不确定)
C# (出现的可能性不确定)
后果
范围 |
冲击 |
可能性 |
可利用性 |
技术冲击: DoS: 资源消耗(CPU): DoS: 资源消耗 (内存):; DoS: 崩溃、退出或重启 整数强制转化通常会导致未定义的执行状态,从而导致无限循环或崩溃 |
|
完整性 |
技术冲击: 执行未获授权的代码或命令 在某些情况下,整数强制转换错误可能导致可利用的缓冲区溢出条件,从而导致执行任意代码。 |
|
完整性 |
技术冲击: 其它 整数强制转换错误导致为相关变量存储的值不正确。 |
被利用的可能性:
中等
示例
例1
以下代码用于从套接字读取传入数据包并提取一个或多个头。
(问题代码)
Example Language: C
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: 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 |
名称 |
属于 |
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)的表示,以及这些节点是否有足够的差异来进行拆分都有影响。