CWE-122: Heap-based Buffer Overflow
描述
堆溢流条件是缓冲区溢出,可以将可以覆盖的缓冲区分配在内存的堆部分中,通常意味着使用诸如malloc()等例程分配缓冲区。
关系
该表显示了与该弱点相关的弱点和高级类别。这些关系定义为childof,parentof,ementof,并深入了解可能存在于较高和较低抽象水平的类似项目。此外,定义了诸如Peerof和Canalsobe之类的关系,以显示用户可能想要探索的类似弱点。
与观点“研究概念”相关(CWE-1000)
自然
类型
ID
名称
Childof
根据- a weakness that is still mostly independent of a resource or technology, but with sufficient details to provide specific methods for detection and prevention. Base level weaknesses typically describe issues in terms of 2 or 3 of the following dimensions: behavior, property, technology, language, and resource.
787
外面写作
Childof
根据- a weakness that is still mostly independent of a resource or technology, but with sufficient details to provide specific methods for detection and prevention. Base level weaknesses typically describe issues in terms of 2 or 3 of the following dimensions: behavior, property, technology, language, and resource.
788
缓冲区结束后的内存位置访问
介绍模式
引言的不同模式提供了有关如何以及何时引入这种弱点的信息。该阶段识别可能发生介绍的生命周期中的一个点,而音符提供了与给定阶段中引言有关的典型情况。
常见后果
该表指定与弱点相关的不同个人后果。该范围确定了违反的应用程序安全区域,而影响描述了如果对手成功利用这一弱点,就会产生负面的技术影响。其可能性提供了有关预期相对于列表中其他后果的特定后果的可能性的信息。例如,可能会利用弱点来实现一定的影响,但很可能会利用它来实现不同的影响。
范围
Impact
可能性
Availability
技术影响: DOS:撞车,退出或重新启动;DOS:资源消耗(CPU);DOS:资源消耗(内存)
缓冲区溢出通常会导致崩溃。可能导致缺乏可用性的其他攻击,包括将程序置于无限的循环中。
Integrity Confidentiality Availability 访问控制
技术影响: 执行未经授权的代码或命令;旁路保护机制;修改内存
缓冲区溢出通常可用于执行任意代码,这通常不在程序的隐式安全策略范围之内。除重要的用户数据外,基于堆的溢出还可以用来覆盖可能生活在内存中的功能指针,将其指向攻击者的代码。即使在不明确使用功能指针的应用程序中,运行时通常也会留下许多内存。例如,通常使用功能指针实现C ++中的对象方法。即使在C程序中,基础运行时通常也使用一个全局偏移表。
Integrity Confidentiality Availability 访问控制 其他
技术影响: 执行未经授权的代码或命令;旁路保护机制;其他
当结果是任意代码执行时,通常可以用来颠覆任何其他安全服务。
利用的可能性
示例的例子
示例1
虽然缓冲区溢出示例可能很复杂,但可能具有非常简单但仍然可利用的基于堆的缓冲区溢出:
#define bufsize 256
int main(int argc,char ** argv){
char *buf; buf =(char *)malloc(sizeof(char) *bufsize); strcpy(buf,argv [1]);
}
缓冲区分配给具有固定尺寸的堆内存,但不能保证ARGV [1]中的字符串不会超过此大小并导致溢出。
示例2
此示例将编码过程应用于输入字符串,并将其存储到缓冲区中。
char * copy_input(char *user_supplied_string){
int i,dst_index;
char *dst_buf = (char*)malloc(4*sizeof(char) * MAX_SIZE);
if ( MAX_SIZE <= strlen(user_supplied_string) ){
死(“用户字符串太长,死亡邪恶黑客!”);
}
dst_index = 0;
for(i = 0; i
if('&'== user_supplied_string [i]){
dst_buf [dst_index ++] ='&'; dst_buf[dst_index++] = 'a'; dst_buf [dst_index ++] ='m'; dst_buf[dst_index++] = 'p'; dst_buf [dst_index ++] =';';
}
否则if('<'== user_supplied_string [i]){
}
else dst_buf [dst_index ++] = user_supplied_string [i];
}
返回dst_buf;
}
程序员试图在用户控制的字符串中编码AMPERS和字符,但是在应用编码过程之前验证了字符串的长度。此外,程序员假设编码扩展只会将给定字符扩展为4倍,而anmpersand的编码则以5。攻击者提供了许多&aspers的字符串。
Observed Examples
参考
描述
链:机器学习产品可以具有基于堆的缓冲区溢出(
CWE-122 )当通过在浮点值上使用coiling()和地板()计算某些面向整数的边界时(
CWE-1339 )
潜在的缓解
预设计:使用执行自动界限检查的语言或编译器。
阶段:建筑和设计
Use an abstraction library to abstract away risky APIs. Not a complete solution.
阶段:构建和编译
通过构建前设计:加那利风格的范围检查,库更改,以确保块数据的有效性以及其他此类修复程序的有效性,但不应依靠。
阶段:实施
实现并执行界限检查输入。
阶段:实施
Do not use dangerous functions such as gets. Look for their safe equivalent, which checks for the boundary.
Phase: Operation
Use OS-level preventative functionality. This is not a complete solution, but it provides some defense in depth.
弱点
条件
描述
Primary
(弱点独立于其他弱点的地方)
影响资源
成员hips
此成员关系表显示了其他CWE类别和视图,将此弱点称为成员。该信息通常可用于理解弱点适合外部信息源的何处。
笔记
关系
基于堆的缓冲区溢出通常与基于堆栈的缓冲区溢出一样危险。
分类映射
映射的分类名称
节点ID
Fit
映射的节点名称
扣子
堆溢出
软件故障模式
SFP8
缓冲区访问故障
证书C安全编码
str31-c
CWE更具体
Guarantee that storage for strings has sufficient space for character data and the null terminator
参考s
[REF-44] Michael Howard, David LeBlanc and John Viega. "24 Deadly Sins of Software Security". "Sin 5: Buffer Overruns." Page 89. McGraw-Hill. 2010.
[Ref-62] Mark Dowd,John McDonald和Justin Schuh。“软件安全评估的艺术”。第3章,“非可取堆栈”,第76页。第一版。艾迪生·卫斯理。2006。
[Ref-62] Mark Dowd,John McDonald和Justin Schuh。“软件安全评估的艺术”。第5章,“保护机制”,第189页。第一版。艾迪生·卫斯理。2006。