cwe - 119:不当的操作限制的范围内一个内存缓冲区
描述
产品执行操作内存缓冲区,但它可以从磁盘读取或写入的内存位置之外的目标缓冲区的边界。
扩展描述
某些语言允许直接寻址的内存位置,不会自动确保这些位置是有效的被引用的内存缓冲区。这可能会导致执行读或写操作的内存位置可能与其他相关变量,数据结构,数据或内部程序。
因此,攻击者可以执行任意代码,改变控制流,读取敏感信息,或导致系统崩溃。
替代条款
缓冲区溢出:
这个词有许多不同的含义,不同的受众。从CWE映射的角度来看,这一项应该尽可能避免。一些研究人员、开发人员和工具刻意为之的意思是“写过去的缓冲区,而其他人使用相同的词的意思是“任何读或写一个缓冲区的边界外,是否在缓冲区的开始或结束后缓冲。”Still others using the same term could mean "any action after the end of a buffer, whether it is a read or write." Since the term is commonly used for exploitation and for vulnerabilities, it further confuses things.
缓冲区溢出:
一些知名厂商和研究人员使用术语“缓冲区溢出”,但大多数人使用“缓冲区溢出”。See the alternate term for "buffer overflow" for context.
内存安全:
通常用于内存访问相关技术,避免缺点,如确定的
cwe - 119 和它的后代。然而,这个词不是正式的,有可能是从业者之间的分歧,缺点是隐式地由“记忆安全”项。
的关系
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
相关的视图”研究概念”(cwe - 1000)
自然
类型
ID
的名字
ChildOf
类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。
118年
不正确的访问可转位的资源(“距离误差”)
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
120年
缓冲区复制没有检查输入的大小(经典的缓冲区溢出)
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
125年
禁止入内的读
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
466年
返回指针值的预期范围之外
ParentOf
链——一个复合元素是一个序列的两个或两个以上的独立的缺点,可以在软件中紧密联系在一起。一个弱点,X,可以直接创建所必需的条件导致另一个弱点,Y,进入一个脆弱的状态。,当这一切发生的时候,CWE指X作为“主”Y, Y是“合成”X连锁可能涉及两个以上缺点,在某些情况下,他们可能有一个树状结构。
680年
整数溢出缓冲区溢出
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
786年
之前访问的内存位置缓冲区的开始
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
787年
禁止入内的写
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
788年
访问结束后的内存位置缓冲区
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
805年
缓冲区长度值不正确的访问
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
822年
不可信的指针
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
823年
超出范围的使用指针偏移量
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
824年
访问未初始化的指针
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
825年
过期的指针
光束
类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。
20.
不正确的输入验证
光束
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
128年
环绕式处理错误
光束
变体——一个弱点与某种类型的产品,通常涉及到一个特定的语言或技术。更具体的比基本的弱点。变异水平弱点通常描述问题的3到5以下维度:行为、财产、技术、语言,和资源。
129年
不当的验证数组索引
光束
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
131年
不正确的缓冲区大小的计算
光束
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
190年
整数溢出或概括的
光束
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
193年
错误
光束
变体——一个弱点与某种类型的产品,通常涉及到一个特定的语言或技术。更具体的比基本的弱点。变异水平弱点通常描述问题的3到5以下维度:行为、财产、技术、语言,和资源。
195年
签署无符号转换错误
光束
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
839年
没有最低检查数字范围比较
光束
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
843年
访问资源的使用不兼容的类型(类型混淆)
光束
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
1257年
不适当的访问控制应用到镜像或别名内存区域
光束
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
1260年
处理不当的重叠范围受保护的内存
光束
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
1339年
精度不足或精度实数
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
简化映射的相关视图”缺点漏洞发布”(cwe - 1003)
自然
类型
ID
的名字
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
120年
缓冲区复制没有检查输入的大小(经典的缓冲区溢出)
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
125年
禁止入内的读
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
787年
禁止入内的写
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
824年
访问未初始化的指针
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
相关的视图”方案及质量的措施(2020)”(CWE-1305)
自然
类型
ID
的名字
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
120年
缓冲区复制没有检查输入的大小(经典的缓冲区溢出)
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
123年
Write-what-where条件
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
125年
禁止入内的读
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
130年
处理不当的长度参数不一致
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
786年
之前访问的内存位置缓冲区的开始
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
787年
禁止入内的写
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
788年
访问结束后的内存位置缓冲区
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
805年
缓冲区长度值不正确的访问
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
822年
不可信的指针
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
823年
超出范围的使用指针偏移量
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
824年
访问未初始化的指针
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
825年
过期的指针
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
相关的视图”方案及数据保护措施”(cwe - 1340)
自然
类型
ID
的名字
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
120年
缓冲区复制没有检查输入的大小(经典的缓冲区溢出)
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
123年
Write-what-where条件
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
125年
禁止入内的读
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
130年
处理不当的长度参数不一致
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
786年
之前访问的内存位置缓冲区的开始
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
787年
禁止入内的写
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
788年
访问结束后的内存位置缓冲区
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
805年
缓冲区长度值不正确的访问
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
822年
不可信的指针
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
823年
超出范围的使用指针偏移量
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
824年
访问未初始化的指针
ParentOf
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。
825年
过期的指针
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
相关观点“七有害的王国”(cwe - 700)
自然
类型
ID
的名字
ChildOf
类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。
20.
不正确的输入验证
模式的介绍
不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
常见的后果
这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
范围
影响
可能性
完整性 保密 可用性
如果攻击者可访问的内存可以有效地控制,它可能会运行任意代码的情况,与一个标准的缓冲区溢出。如果攻击者可以覆盖一个指针的内存(通常是32位或64位),他们可以重定向一个函数指针指向自己的恶意代码。即使攻击者只能修改单个字节可以任意代码执行成为可能。有时这是因为同样的问题可以重复利用同样的效果。有时因为攻击者可以覆盖强调安全的特定于应用程序的数据——比如一个标志指示是否管理员用户。
可用性 保密
技术的影响: 读记忆;DoS:崩溃,退出或重新启动;DoS:资源消耗(CPU);DoS:资源消耗(内存)
越限的内存访问很可能导致腐败相关的记忆,或许说明,可能导致崩溃。其他的攻击导致缺乏可用性是可能的,包括把程序进入一个无限循环。
保密
在一个界外阅读的情况下,攻击者可能对敏感信息的访问。如果敏感信息包含系统的细节,比如当前缓冲区位置在内存中,这方面的知识可用于工艺进一步袭击,可能带来更严重的后果。
利用的可能性
示范例子
示例1
这个例子将IP地址从一个用户,验证它是完整的,然后查找主机名和拷贝到缓冲区。
空白host_lookup (char * user_supplied_addr) {
struct hostent *惠普; in_addr_t * addr; char主机名[64]; in_addr_t inet_addr (const char * cp);
/ *程序确保user_supplied_addr是正确的格式转换* /
validate_addr_form (user_supplied_addr); addr = inet_addr (user_supplied_addr); 惠普= gethostbyaddr (addr, sizeof (struct in_addr) AF_INET); strcpy(主机名、hp - > h_name);
}
这个函数分配64字节的缓冲区存储主机名,但是没有保证主机名不能超过64字节。如果攻击者指定一个地址解析为一个非常大的主机名,那么该函数会覆盖敏感数据,甚至放弃攻击者的控制流。
注意,本例中还包含一个未检查返回值(cwe - 252 )能导致一个空指针(cwe - 476 )。
示例2
这个例子中一个编码过程适用于一个输入字符串并将其存储到缓冲区。
char * copy_input (char * user_supplied_string) {
int i, dst_index;
char * dst_buf = (char *) malloc (4 * sizeof (char) * MAX_SIZE);
如果(MAX_SIZE < = strlen (user_supplied_string)) {
死亡(“用户字符串太长,死亡邪恶的黑客!”);
}
dst_index = 0;
(我= 0;我< strlen (user_supplied_string);我+ +){
如果(' & ' = = user_supplied_string[我]){
dst_buf (dst_index + +) = ' & '; dst_buf (dst_index + +) = ' a '; dst_buf [dst_index + +] =“m”; dst_buf [dst_index + +] =“p”; dst_buf (dst_index + +) = '; ';
}
else if (' < ' = = user_supplied_string[我]){
/ * & lt编码;* /
}
其他dst_buf [dst_index + +] = user_supplied_string[我];
}
返回dst_buf;
}
程序员试图编码用户控制的&字符字符串,然而字符串的长度编码应用程序之前进行验证。此外,程序员假定编码扩张只会扩大给定字符的4倍,而编码&扩展的5。结果,当编码过程扩展了字符串可以溢出目的地缓冲区,如果攻击者提供了许多与符号的字符串。
示例3
下面的示例用户要求一个偏移量到一个数组中选择一个项目。
int主要(int命令行参数个数,char * * argv) {
char *项目[]={“船”、“车”、“卡车”,“训练”}; int指数= GetUntrustedOffset (); printf(“你选择% s \ n”,项目[索引1]);
}
程序员允许用户指定的元素列表中选择,但是攻击者可以提供一个界外偏移,导致缓冲区上(cwe - 126 )。
示例4
在以下代码,方法检索一个值在一个特定的数组索引数组位置作为输入参数的方法
int getValueFromArray (int *数组,int len, int指数){
int值;
/ /检查数组下标小于最大
/ /数组的长度
如果(指数< len) {
}
/ /如果数组索引无效则输出错误消息
/ /并返回值指示错误
其他{
printf(“价值:% d \ n”,阵列(指数)); 值= 1;
}
返回值;
}
然而,这种方法只验证给定的数组下标小于数组的最大长度但不检查的最小值(cwe - 839 )。这将允许一个负值被接受作为输入数组索引,这将导致一个界外读(cwe - 125 ),并可能允许访问敏感的记忆。输入数组索引应该检查来验证在最大和最小范围内所需的阵列(cwe - 129 )。在这个例子中if语句应该修改为包括一个最小范围检查,如下所示。
…
/ /检查数组索引内是正确的
/ /数组的值的范围
如果(指数> = 0 & &指数< len) {
…
示例5
Windows提供了_mbs家庭多字节字符串的函数来执行各种操作。当这些功能是通过了一个畸形的多字节字符串,如一个字符串包含一个有效的领导由单个零字节,字节之后他们可以读或写过去的字符串缓冲区的结束导致缓冲区溢出。以下功能造成缓冲区溢出的风险:_mbsinc _mbsdec _mbsncat _mbsncpy _mbsnextc _mbsnset _mbsrev _mbsset _mbsstr _mbstok _mbccpy _mbslen
观察到的例子
参考
描述
不正确的URI标准化应用程序流量产品导致缓冲区溢出,每中钢协KEV利用在野外。
缓冲区溢出的wi - fi路由器web界面,利用每中钢协KEV在野外。
经典的基于堆栈缓冲区溢出在媒体播放器在播放列表中使用长条目
基于堆的缓冲区溢出在媒体播放器在播放列表中使用长条目
大精度值的格式字符串触发溢出
负的偏移值导致界外阅读
畸形的输入导致访问未初始化或之前删除对象,导致内存泄露
链:缺乏同步会导致内存泄露
attacker-controlled数组索引会导致代码的执行
从函数调用链:1值是为了表明一个错误,而是用作数组索引。
链:错误的计算导致错误的指针和内存腐败
产品接受的消息,导致一个任意的指针废弃
链:畸形的输入导致引用未初始化的内存
操作系统内核信托userland-supplied长度值,使阅读的敏感信息
链:整数溢出securely-coded邮件程序会导致缓冲区溢出。在2005年,这被认为是不切实际的利用,但在2020年,它被重新发现更容易利用由于技术的演进。
缓冲区溢位涉及一个正则表达式与大量的捕捉
潜在的缓解措施
阶段:需求
使用一种语言,不允许这个弱点或发生提供了结构,使这个弱点更容易避免的。
例如,执行自己的内存管理的多种语言,比如Java和Perl,不受缓冲区溢出。其他语言,比如Ada和c#,通常提供溢出保护,但保护由程序员可以禁用。
警惕,语言的接口本地代码仍有可能溢出,即使语言本身在理论上是安全的。
阶段:体系结构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。
例子包括安全C字符串库(SafeStr)通过混乱和Viega [
REF-57 ),和Strsafe系列。h图书馆从微软(
REF-56 ]。这些库提供的安全版本overflow-prone字符串处理函数。
注意: 这不是一个完整的解决方案,因为许多缓冲区溢出是不相关的字符串。
阶段:构建和编译
使用功能或运行或编译软件扩展自动提供一个保护机制,减轻或消除缓冲区溢出。
例如,某些编译器和扩展提供自动缓冲区溢出检测机制,构建到编译后的代码。例子包括Microsoft Visual Studio / GS标志,Fedora / Red Hat FORTIFY_SOURCE GCC国旗,StackGuard, ProPolice。
注意: 这未必是一个完整的解决方案,因为这些机制只能检测某些类型的溢出。此外,仍有可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。
实施阶段:
考虑遵守以下规则,分配和管理应用程序的内存:
双重检查指定的缓冲区一样大。
当使用函数接受一个复制的字节数,如strncpy(),请注意,如果目的地缓冲区大小等于源缓冲区大小,不得NULL-terminate字符串。
检查缓冲区边界如果访问缓冲区在一个循环中,确保没有危险的写作过去分配空间。
如果有必要,所有输入字符串截断合理长度之前他们复制和连接功能。
阶段:操作
使用功能或运行或编译软件扩展随机安排程序的可执行文件的位置和库在内存中。因为这使得地址不可预测的,它可以防止攻击者可利用的代码可靠地跳。
注意: 这不是一个完整的解决方案。然而,它迫使攻击者猜测一个未知值,改变每一个程序执行。此外,仍有可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。
阶段:操作
注意: 这不是一个完整的解决方案,因为缓冲区溢位可以用来覆盖附近的变量以危险的方式修改软件的状态。此外,它不能用于变为无效来情况下,代码是必需的。最后,仍可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。
实施阶段:
取代无限复制函数具有类似的功能,支持长度参数,如拷贝字符串strncpy。创建这些如果他们不是可用的。
检测方法
自动静态分析
这个弱点常常可以发现使用自动静态分析工具。许多现代工具使用数据流分析或基于技术来减少假阳性的数量。
自动静态分析一般不占报告时的环境考虑禁止入内的内存操作。这可能很难让用户决定哪些应该首先调查警告。例如,一个分析工具可能会报告缓冲区溢出,来自命令行参数的程序不会运行setuid或其他特权。
注意: 缓冲区错误检测技术更成熟比大多数其他类型的弱点。
自动动态分析
这个弱点能被探测到的使用动态交互的工具和技术的软件使用大型测试套件和许多不同的输入,如模糊测试(起毛)健壮性测试和故障注入。软件的操作可能慢下来,但它不应该成为不稳定,崩溃,或者产生不正确的结果。
自动静态分析——二进制或字节码
根据飙升,以下检测技术可能是有用的:
二进制字节码质量分析
字节码的弱点分析,包括反汇编程序+源代码弱点分析
二进制弱点分析,包括反汇编程序+源代码弱点分析
人工静态分析——二进制或字节码
根据飙升,以下检测技术可能是有用的:
动态分析与自动化的结果解释
根据飙升,以下检测技术可能是有用的:
Web应用程序扫描
Web服务的扫描仪
数据库扫描仪
动态分析与人工解释结果
根据飙升,以下检测技术可能是有用的:
人工静态分析源代码
根据飙升,以下检测技术可能是有用的:
关注人工抽查,手动分析来源
手工源代码审查(不检查)
自动静态分析源代码
根据飙升,以下检测技术可能是有用的:
源代码缺陷分析仪
Context-configured源代码分析器
体系结构或设计审查
根据飙升,以下检测技术可能是有用的:
影响资源
会员资格
这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
自然
类型
ID
的名字
MemberOf
视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。
635年
最初使用的弱点NVD从2008年到2016年
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
726年
OWASP十大2004类别A5 -缓冲区溢出
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
740年
CERT C安全编码标准(2008)第七章-数组(ARR)
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
741年
CERT C安全编码标准(2008)第八章-字符和字符串(STR)
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
742年
CERT C安全编码标准(2008)第9章-内存管理(MEM)
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
743年
CERT C安全编码标准(2008)第十章-输入输出(FIO)
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
744年
CERT C安全编码标准(2008)第11章-环境(ENV)
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
752年
2009年前25 -资源管理风险
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
874年
CERT c++安全编码部分06 -数组和STL (ARR)
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
875年
CERT c++安全编码部分07 -字符和字符串(STR)
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
876年
CERT c++安全编码部分08 -内存管理(MEM)
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
877年
CERT c++安全编码部分09 -输入输出(FIO)
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
878年
CERT c++安全编码部分10 -环境(ENV)
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
970年
SFP二级集群:错误的缓冲区的访问
MemberOf
视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。
1003年
弱点简化映射的漏洞发布
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
1157年
SEI CERT C编码标准- 03指导方针。表达式(EXP)
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
1160年
SEI CERT C编码标准- 06指导方针。数组(ARR)
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
1161年
07年SEI CERT C编码标准,指导方针。字符和字符串(STR)
MemberOf
视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。
1200年
弱点在2019 CWE最危险的软件错误
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
1306年
方案及质量措施——可靠性
MemberOf
类别——CWE条目包含一组其他条目,共享一个共同的特点。
1308年
方案及质量措施,安全
MemberOf
视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。
1337年
2021 CWE最危险软件的弱点的弱点
MemberOf
视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。
1340年
方案及数据保护措施
MemberOf
视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。
1350年
2020 CWE最危险软件的弱点的弱点
MemberOf
视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。
1387年
2022 CWE最危险软件的弱点的弱点
笔记
分类法映射
映射分类名称
节点ID
适合
映射节点名
OWASP十大2004
A5
确切的
缓冲区溢出
CERT C安全编码
ARR00-C
理解数组是如何工作的
CERT C安全编码
ARR30-C
CWE更抽象
不形式或使用界外指针或数组下标吗
CERT C安全编码
ARR38-C
CWE更抽象
保证库函数并不会形成无效的指针
CERT C安全编码
ENV01-C
不要假设一个环境变量的大小呢
CERT C安全编码
EXP39-C
不精确的
不通过指针访问一个变量的不兼容的类型
CERT C安全编码
FIO37-C
不承担字符数据被读取
CERT C安全编码
STR31-C
CWE更抽象
保证存储字符串为字符数据有足够的空间和零终结者
CERT C安全编码
STR32-C
CWE更抽象
不通过non-null-terminated字符序列库函数,期望一个字符串
WASC
7
缓冲区溢出
软件故障模式
SFP8
错误的缓冲区的访问
引用
(ref - 62)马克·多德约翰麦克唐纳和贾斯汀Schuh。“软件安全评估的艺术”。第五章,“内存泄露”,167页。1版。艾迪生卫斯理》2006。
内容的历史
提交
提交日期
提交者
组织
2006-07-19
千鸟
修改
修改日期
修饰符
组织
2008-07-01
Eric Dalci
Cigital
更新Time_of_Introduction
2008-08-15
Veracode
建议OWASP 2004年排名前十的映射
2008-09-08
CWE内容团队
主教法冠
更新描述关系,Taxonomy_Mappings
2008-10-14
CWE内容团队
主教法冠
更新的关系
2008-11-24
CWE内容团队
主教法冠
更新的关系,Taxonomy_Mappings
2009-01-12
CWE内容团队
主教法冠
更新Applicable_Platforms、Common_Consequences Demonstrative_Examples Likelihood_of_Exploit,名字,Potential_Mitigations引用关系
2009-03-10
CWE内容团队
主教法冠
更新Potential_Mitigations
2009-05-27
CWE内容团队
主教法冠
更新Demonstrative_Examples
2009-07-27
CWE内容团队
主教法冠
更新Observed_Examples
2009-10-29
CWE内容团队
主教法冠
更新Applicable_Platforms、Common_Consequences Demonstrative_Examples、描述关系,Time_of_Introduction
2009-12-28
CWE内容团队
主教法冠
更新Common_Consequences、Demonstrative_Examples Detection_Factors Observed_Examples
2010-02-16
CWE内容团队
主教法冠
更新Alternate_Terms、Applicable_Platforms Demonstrative_Examples、Detection_Factors Potential_Mitigations,引用关系,Taxonomy_Mappings
2010-06-21
CWE内容团队
主教法冠
更新Potential_Mitigations
2010-09-27
CWE内容团队
主教法冠
更新Potential_Mitigations、人际关系
2010-12-13
CWE内容团队
主教法冠
更新后的名字
2011-03-29
CWE内容团队
主教法冠
更新的关系
2011-06-01
CWE内容团队
主教法冠
更新Common_Consequences、人际关系
2011-09-13
CWE内容团队
主教法冠
更新的关系,Taxonomy_Mappings
2012-05-11
CWE内容团队
主教法冠
更新Demonstrative_Examples Potential_Mitigations、引用关系
2012-10-30
CWE内容团队
主教法冠
更新Potential_Mitigations
2013-02-21
CWE内容团队
主教法冠
更新Demonstrative_Examples
2014-02-18
CWE内容团队
主教法冠
更新Potential_Mitigations,引用
2014-07-30
CWE内容团队
主教法冠
更新Detection_Factors、关系、Taxonomy_Mappings
2015-12-07
CWE内容团队
主教法冠
更新的关系
2017-01-19
CWE内容团队
主教法冠
更新的关系
2017-05-03
CWE内容团队
主教法冠
更新的关系
2017-11-08
CWE内容团队
主教法冠
更新Applicable_Platforms、Common_Consequences Demonstrative_Examples Observed_Examples,引用关系,Taxonomy_Mappings
2018-03-27
CWE内容团队
主教法冠
更新的引用
2019-01-03
CWE内容团队
主教法冠
更新的关系
2019-06-20
CWE内容团队
主教法冠
更新Related_Attack_Patterns、人际关系
2019-09-19
CWE内容团队
主教法冠
更新引用关系
2020-02-24
CWE内容团队
主教法冠
更新的关系,Taxonomy_Mappings Time_of_Introduction
2020-06-25
CWE内容团队
主教法冠
更新的关系
2020-08-20
CWE内容团队
主教法冠
更新Alternate_Terms、人际关系
2020-12-10
CWE内容团队
主教法冠
更新Alternate_Terms Observed_Examples,关系
2021-07-20
CWE内容团队
主教法冠
更新Demonstrative_Examples Observed_Examples Potential_Mitigations,关系
2022-06-28
CWE内容团队
主教法冠
更新Observed_Examples、人际关系
2022-10-13
CWE内容团队
主教法冠
更新的关系,Taxonomy_Mappings
2023-01-31
CWE内容团队
主教法冠
更新Alternate_Terms、描述
以前的条目名称
改变日期
以前的条目名称
2008-04-11
缓冲区的错误
2009-01-12
未能限制操作的范围内一个分配的内存缓冲区
2010-12-13
未能限制操作的范围内一个内存缓冲区