CWE

普遍的弱点

社区开发的软件和硬件弱点类型清单

2021 CWE最重要的硬件弱点
CWE前25个最危险的弱点
>CWE列表> cwe-单个字典定义(4.10)
ID

CWE-195:签名到未签名的转换错误

弱点ID:195
抽象:变体
结构:简单的
查看自定义信息:
+描述
该产品使用签名的原始性,并对未签名的原始性执行铸件,如果无法使用无符号的原始性表示签名的原始词的值,则可能会产生意外的值。
+扩展描述

依靠签名数字和未签名数字之间的隐式演员是危险的,因为结果可能会产生意外的价值并违反该程序的假设。

通常,函数会返回负值以表示故障。当函数的结果用作大小参数时,使用这些负返回值可能会产生意外的结果。例如,如果负尺寸值传递给标准内存副本或分配函数,它们将被隐式地投入到大型无符号值中。这可能会导致可利用的缓冲区溢出或底流条件。

+关系
部分帮助该表显示了与该弱点相关的弱点和高级类别。这些关系定义为childof,parentof,ementof,并深入了解可能存在于较高和较低抽象水平的类似项目。此外,定义了诸如Peerof和Canalsobe之类的关系,以显示用户可能想要探索的类似弱点。
+与观点“研究概念”相关(CWE-1000)
自然 类型 ID 姓名
Childof 根据基础 - 仍然主要独立于资源或技术的弱点,但有足够的细节来提供特定的检测和预防方法。基本水平的弱点通常用以下维度的2或3来描述问题:行为,财产,技术,语言和资源。 681 数字类型之间的不正确转换
可以按照 根据基础 - 仍然主要独立于资源或技术的弱点,但有足够的细节来提供特定的检测和预防方法。基本水平的弱点通常用以下维度的2或3来描述问题:行为,财产,技术,语言和资源。 839 数字范围比较没有最小检查
canpreceede 班级班级 - 以非常抽象的方式描述的弱点,通常与任何特定的语言或技术无关。比支柱弱点更具体,但比基本弱点更一般。班级弱点通常用以下维度的1或2来描述问题:行为,属性和资源。 119 内存缓冲区范围内操作的不当限制
部分帮助该表显示了与该弱点相关的弱点和高级类别。这些关系定义为childof,parentof,ementof,并深入了解可能存在于较高和较低抽象水平的类似项目。此外,定义了诸如Peerof和Canalsobe之类的关系,以显示用户可能想要探索的类似弱点。
+与“ CISQ质量措施(2020)”相关(CWE-1305)
自然 类型 ID 姓名
Childof 根据基础 - 仍然主要独立于资源或技术的弱点,但有足够的细节来提供特定的检测和预防方法。基本水平的弱点通常用以下维度的2或3来描述问题:行为,财产,技术,语言和资源。 681 数字类型之间的不正确转换
部分帮助该表显示了与该弱点相关的弱点和高级类别。这些关系定义为childof,parentof,ementof,并深入了解可能存在于较高和较低抽象水平的类似项目。此外,定义了诸如Peerof和Canalsobe之类的关系,以显示用户可能想要探索的类似弱点。
+与“ CISQ数据保护措施”(CWE-1340)有关
自然 类型 ID 姓名
Childof 根据基础 - 仍然主要独立于资源或技术的弱点,但有足够的细节来提供特定的检测和预防方法。基本水平的弱点通常用以下维度的2或3来描述问题:行为,财产,技术,语言和资源。 681 数字类型之间的不正确转换
+介绍模式
部分帮助引言的不同模式提供了有关如何以及何时引入这种弱点的信息。该阶段识别可能发生介绍的生命周期中的一个点,而音符提供了与给定阶段中引言有关的典型情况。
阶段 笔记
执行
+适用的平台
部分帮助该清单显示了可能出现的弱点的可能区域。这些可能适用于特定的命名语言,操作系统,体系结构,范式,技术或一类此类平台。该平台与给定弱点出现在该实例的频率一起列出。

语言

C(不确定的患病率)

C ++(不确定的患病率)

+常见后果
部分帮助该表指定与弱点相关的不同个人后果。该范围确定了违反的应用程序安全区域,而影响描述了如果对手成功利用这一弱点,就会产生负面的技术影响。其可能性提供了有关预期相对于列表中其他后果的特定后果的可能性的信息。例如,可能会利用弱点来实现一定的影响,但很可能会利用它来实现不同的影响。
范围 影响 可能性
正直

技术影响:意外状态

签名值和未签名值之间的转换可能导致各种错误,但是从安全角度来看,最常见的是与整数溢出和缓冲区溢出漏洞相关联。
+示例的例子

示例1

在此示例中,可变数量在返回时可以容纳负值。由于该函数被声明返回未签名的int,因此金额将被隐式转换为未签名。

(不良代码)
示例语言:C
unsigned int readdata(){
INT MANTE = 0;
...
如果(结果==错误)
金额= -1;
...
退货金额;
}

如果满足上述代码中的错误条件,则在使用32位整数的系统上,ReadData()的返回值将为4,294,967,295。

示例2

在此示例中,取决于ACCECSSMAINFRAME()的返回值,变量金额在返回时可以保持负值。由于该函数被声明为返回未签名的值,因此金额将被隐式投入到无符号数字中。

(不良代码)
示例语言:C
unsigned int readdata(){
INT MANTE = 0;
...
量= AccessMainFrame();
...
退货金额;
}

如果AccessMainFrame()的返回值为-1,则在使用32位整数的系统上,ReadData()()的返回值将为4,294,967,295。

示例3

以下代码旨在从插座读取传入数据包并提取一个或多个标题。

(不良代码)
示例语言:C
DataPacket *数据包;
int numheaders;
PackeTheader *标题;

sock = acceptSocketConnection();
ReadPacket(数据包,袜子);
numheaders =数据包 - >标题;

如果(Numheaders> 100){
Exiterror(“标题太多!”);
}
标头= malloc(numheaders * sizeof(packEtheader);
ParsepackeTheaders(数据包,标头);

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

示例4

此示例处理由一系列可变长度结构组成的用户输入。输入的前两个字节决定要处理的结构的大小。

(不良代码)
示例语言:C
char* processnext(char* strm){
char buf [512];
短len = *(短 *)strm;
strm += sizeof(len);
如果(len <= 512){
memcpy(Buf,Strm,Len);
过程(BUF);
返回strm + len;
}
别的 {
返回-1;
}
}

程序员已将上限设置为结构大小:如果大于512,则不会处理输入。问题在于Len是一个签名的短片,因此使用签名值进行了针对最大结构长度的检查,但是Len转换为呼叫Memcpy()的无符号整数,负数将扩展到导致A无符号整数的巨大价值。如果LEN为负,则看起来该结构具有适当的大小(如果将分支占用),但是Memcpy()复制的内存量将很大,并且攻击者将能够溢出堆栈与Strm中的数据。

示例5

在下面的示例中,有可能要求memcpy移动比假设的更大的内存段:

(不良代码)
示例语言:C
int returnChunksize(void *){

/*如果块信息有效,请返回可用内存的大小,

*否则,返回-1表示错误

*/
...
}
int main(){
...
memcpy(destbuf,srcbuf,(returnChunksize(destbuf)-1));
...
}

如果returnChunksize()碰巧遇到错误,则会返回-1。请注意,在memcpy操作之前未检查退货值(CWE-252),因此-1可以作为大小参数传递给memcpy()()()()CWE-805)。因为memcpy()假设该值未签名,所以它将被解释为maxint-1(CWE-195),因此,将复制的内存远远超过目标缓冲区的可能可用(CWE-787,,,,CWE-788)。

示例6

此示例显示了典型的尝试,试图解析字符串,该字符串与呼叫者到函数和函数动作之间的假设差异导致错误。

(不良代码)
示例语言:C
int proc_msg(char *s,int msg_len)
{
//注意字符串末端的空间 - 假设所有字符串都有序言带有空间
int pre_len = sizeof(“ preamble:”);
char buf [pre_len -msg_len];
...如果我们走得太远,请在这里处理
}
char *s =“ preamble:message \ n”;
char *sl = strchr(s,':');//字符数量达到':'(不包括空间)
int jnklen = sl == null?0:SL -S;//如果未定义的指针,请使用零长度
int ret_val = proc_msg(“ s”,jnklen);//违反序言长度的假设,最终以负值,吹出堆栈

缓冲长度最终为-1,导致堆积堆积。结肠后的空间特征包含在功能计算中,但不在呼叫者的计算中。不幸的是,这通常不是那么明显,而是存在于一系列钝的计算中。

+观察到的例子
参考 描述
链:整数签名错误(CWE-195)通过签名比较,导致堆溢出(CWE-122
+会员资格
部分帮助此成员关系表显示了其他CWE类别和视图,将此弱点称为成员。该信息通常可用于理解弱点适合外部信息源的何处。
自然 类型 ID 姓名
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 998 SFP次级群集:计算中的故障
成员 类别类别 - 包含共享共同特征的其他条目的CWE条目。 1158 SEI CERT C编码标准 - 指南04.整数(INT)
+分类映射
映射的分类名称 节点ID 合身 映射的节点名称
扣子 签名到未签名的转换错误
软件故障模式 SFP1 计算中的故障
证书C安全编码 INT31-C CWE更具体 确保整数转换不会导致丢失或误解数据
+参考
[Ref-62] Mark Dowd,John McDonald和Justin Schuh。“软件安全评估的艺术”。第6章,“类型转换”,第223页。第一版。艾迪生·卫斯理。2006。
[Ref-18] Secure Software,Inc.。“ The CLASP应用程序安全过程”。2005年。<https://cwe.mitre.org/documents/sources/theclaspapplicationsecurityprocess.pdf>。
+内容历史记录
+提交
提交日期 提交者 组织
2006-07-19 扣子
+修改
修改日期 修饰符 组织
2008-09-08 CWE内容团队 MITER
更新了适用的_platforms,common_consequences,关系,其他_notes,gualomy_mappings
2009-05-27 CWE内容团队 MITER
更新了示范_examples
2009-10-29 CWE内容团队 MITER
更新的common_cconsquences,Description,其他_notes,关系
2010-02-16 CWE内容团队 MITER
更新了示范_examples
2010-04-05 CWE内容团队 MITER
更新了示范_examples
2011-03-29 CWE内容团队 MITER
更新的关系
2011-06-01 CWE内容团队 MITER
更新的common_cconsquences
2011-06-27 CWE内容团队 MITER
更新的common_cconsquences
2012-05-11 CWE内容团队 MITER
更新了示范示例,参考,关系
2014-06-23 CWE内容团队 MITER
更新的示范_examples,描述
2014-07-30 CWE内容团队 MITER
更新的关系,分类_mappings
2017-01-19 CWE内容团队 MITER
更新的关系
2017-11-08 CWE内容团队 MITER
更新的观察_ examples,gualomy_mappings
2019-01-03 CWE内容团队 MITER
更新的关系
2020-02-24 CWE内容团队 MITER
更新的关系
2020-08-20 CWE内容团队 MITER
更新的关系
2020-12-10 CWE内容团队 MITER
更新的关系
2021-03-15 CWE内容团队 MITER
更新的示范_examples,参考
2023-01-31 CWE内容团队 MITER
更新的描述
提供更多信息 - 请选择其他过滤器。
页面最后更新:2023年1月31日