CWE-195:签名到未签名的转换错误
查看自定义信息:
依靠签名数字和未签名数字之间的隐式演员是危险的,因为结果可能会产生意外的价值并违反该程序的假设。 通常,函数会返回负值以表示故障。当函数的结果用作大小参数时,使用这些负返回值可能会产生意外的结果。例如,如果负尺寸值传递给标准内存副本或分配函数,它们将被隐式地投入到大型无符号值中。这可能会导致可利用的缓冲区溢出或底流条件。
该表显示了与该弱点相关的弱点和高级类别。这些关系定义为childof,parentof,ementof,并深入了解可能存在于较高和较低抽象水平的类似项目。此外,定义了诸如Peerof和Canalsobe之类的关系,以显示用户可能想要探索的类似弱点。
与观点“研究概念”相关(CWE-1000)
与“ CISQ质量措施(2020)”相关(CWE-1305)
与“ CISQ数据保护措施”(CWE-1340)有关
该清单显示了可能出现的弱点的可能区域。这些可能适用于特定的命名语言,操作系统,体系结构,范式,技术或一类此类平台。该平台与给定弱点出现在该实例的频率一起列出。
语言 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类别和视图,将此弱点称为成员。该信息通常可用于理解弱点适合外部信息源的何处。
提供更多信息 - 请选择其他过滤器。
|
使用共同弱点枚举(CWE)和本网站的相关参考使用条款。CWE由美国国土安全部(DHS)网络安全和基础设施安全局(CISA),由国土安全系统工程和开发研究所(HSSEDI)由manbetx客户端首页(MITER)。版权所有©2006–2023,Miter Comanbetx客户端首页rporation。CWE,CWSS,CWRAF和CWE徽标是Miter Corporation的商标。manbetx客户端首页 |