CWE

常见的弱点枚举

一个由社区开发的软件&硬件缺陷类型的列表

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

cwe - 787:界外写

弱点ID: 787
抽象:基地
结构:简单的
视图定制的信息:
+描述
结束过去的产品写数据,或者在开始之前,预期的缓冲区。
+扩展描述
通常情况下,这可能导致腐败的数据,崩溃,或代码执行。产品可以修改索引或执行指针算术,引用一个内存位置缓冲区的边界之外。随后的写操作然后产生未定义或意想不到的结果。
+替代条款
内存泄露:
通常用于描述的后果写入内存缓冲区的边界之外,或者内存无效,当问题的根源不是过度的顺序副本数据从一个固定的开始位置。这可能包括不正确的指针运算等问题,由于不完整的初始化或内存访问无效的指针释放,等等。
+的关系
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关的视图”研究概念”(cwe - 1000)
自然 类型 ID 的名字
ChildOf 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 119年 不当的操作限制的范围内一个内存缓冲区
ParentOf 变体变体——一个弱点与某种类型的产品,通常涉及到一个特定的语言或技术。更具体的比基本的弱点。变异水平弱点通常描述问题的3到5以下维度:行为、财产、技术、语言,和资源。 121年 基于堆栈缓冲区溢出
ParentOf 变体变体——一个弱点与某种类型的产品,通常涉及到一个特定的语言或技术。更具体的比基本的弱点。变异水平弱点通常描述问题的3到5以下维度:行为、财产、技术、语言,和资源。 122年 基于堆的缓冲区溢出
ParentOf 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 123年 Write-what-where条件
ParentOf 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 124年 缓冲区承销(缓冲区下溢)
光束 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 822年 不可信的指针
光束 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 823年 超出范围的使用指针偏移量
光束 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 824年 访问未初始化的指针
光束 基地Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 825年 过期的指针
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关观点“软件开发”(cwe - 699)
自然 类型 ID 的名字
MemberOf 类别类别——CWE条目包含一组其他条目,共享一个共同的特点。 1218年 内存缓冲区错误
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+简化映射的相关视图”缺点漏洞发布”(cwe - 1003)
自然 类型 ID 的名字
ChildOf 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 119年 不当的操作限制的范围内一个内存缓冲区
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关的视图”方案及质量的措施(2020)”(CWE-1305)
自然 类型 ID 的名字
ChildOf 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 119年 不当的操作限制的范围内一个内存缓冲区
部分帮助此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
+相关的视图”方案及数据保护措施”(cwe - 1340)
自然 类型 ID 的名字
ChildOf 类类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 119年 不当的操作限制的范围内一个内存缓冲区
+模式的介绍
部分帮助不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
阶段 请注意
实现
+适用的平台
部分帮助该清单显示了给定的弱点可以可能的地区出现。这些可能是为特定命名的语言,操作系统,架构、模式、技术、或一个类这样的平台。列出的平台是随着频率的出现疲态实例。

语言

C(通常是普遍的)

c++(通常是普遍的)

类:装配患病率(待定)

技术

类:ICS /不(通常是普遍的)

+常见的后果
部分帮助这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
范围 影响 可能性
完整性
可用性

技术的影响:修改内存;DoS:崩溃,退出或重新启动;执行未经授权的代码或命令

+利用的可能性
+示范例子

示例1

下面的代码尝试将四个不同的身份证号码保存到一个数组。

(坏的代码)
例如语言:C
int id_sequence [3];

/ *填充id数组。* /

id_sequence [0] = 123;
id_sequence [1] = 234;
id_sequence [2] = 345;
id_sequence [3] = 456;

因为数组只分配给三个元素,有效的索引0到2;所以,作业id_sequence[3]是界外。

示例2

下面的代码,可以要求memcpy比假定移动更大的内存段:

(坏的代码)
例如语言:C
int returnChunkSize (void *) {

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

*,返回1表示一个错误

* /
}
int main () {

memcpy (destBuf srcBuf (returnChunkSize (destBuf) 1));
}

如果returnChunkSize()碰巧遇到一个错误将返回1。注意,返回值不是之前检查memcpy操作(cwe - 2521),所以可以作为尺寸参数传递给memcpy () (cwe - 805)。因为memcpy()假设值是无符号,它将被视为MAXINT-1 (cwe - 195),因此将远比可能可用内存复制到目标缓冲区(cwe - 787,cwe - 788)。

示例3

这段代码需要来自用户的IP地址和验证它是完整的。然后查找主机名和拷贝到缓冲区。

(坏的代码)
例如语言:C
空白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)。

示例4

这段代码编码过程适用于一个输入字符串并将其存储到缓冲区。

(坏的代码)
例如语言:C
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。结果,当编码过程扩展了字符串可以溢出目的地缓冲区,如果攻击者提供了许多与符号的字符串。

示例5

在接下来的C / c++代码,效用函数用于从字符串修剪尾随空格。函数将输入字符串复制到本地字符串并使用一段语句删除尾随空格通过字符串和向后移动覆盖NUL字符的空格。

(坏的代码)
例如语言:C
char * trimTrailingWhitespace (char * strMessage int长度){
char * retMessage;
char *消息= malloc (sizeof (char) *(+ 1)长度);

/ /输入字符串复制到一个临时字符串
字符消息(长度+ 1);
int指数;
(指数= 0;指数<长度;指数+ +){
消息(指数)= strMessage(指数);
}
消息(指数)= ' \ 0 ';

/ /修剪尾随空格
int len =索引1;
而(isspace(消息(len))) {
消息(len) = ' \ 0 ';
莱恩-;
}

/ /返回字符串没有空格
retMessage =消息;
返回retMessage;
}

然而,这个函数会导致缓冲承销如果输入字符串包含所有空格。在某些系统过去而声明将后退一个字符串的开始,将调用isspace()函数在一个地址的范围之外的本地缓冲区。

例子6

下面的代码分配内存的最大数量的小部件。然后获得指定数量的小部件,确保用户不要求太多。然后初始化数组的元素使用InitializeWidget ()。因为小部件的数量可以为每个请求不同,插入一个空指针的代码意味着最后一个部件的位置。

(坏的代码)
例如语言:C
int我;
unsigned int numWidgets;
小部件* * WidgetList;

numWidgets = GetUntrustedSizeValue ();
如果((numWidgets = = 0) | | (numWidgets > MAX_NUM_WIDGETS)) {
ExitError(“不正确的请求数量的小部件!”);
}
WidgetList =(小部件* *)malloc (numWidgets * sizeof(小部件*));
printf (" WidgetList ptr = % p \ n ", WidgetList);
(我= 0;我< numWidgets;我+ +){
WidgetList[我]= InitializeWidget ();
}
WidgetList [numWidgets] =零;
showWidgets (WidgetList);

然而,这段代码包含一个这些计算错误(-cwe - 193)。它分配足够的空间来包含指定数量的部件,但不包括空指针的空间。因此,分配缓冲区比它应该是(小cwe - 131)。如果用户请求MAX_NUM_WIDGETS,有一个界外写(cwe - 787当零分配。根据环境和编译设置,这可能会导致内存泄露。

例7

下面的代码可能会导致一个缓冲承销,如果发现()返回一个负值,表明ch srcBuf没有找到:

(坏的代码)
例如语言:C
int main () {

strncpy (destBuf &srcBuf[找到(srcBuf ch)], 1024);
}

如果索引srcBuf用户的控制之下,这是一个任意write-what-where条件。

+观察到的例子
参考 描述
链:输入验证不足(CWE-20)在浏览器允许堆腐败(cwe - 787),利用每中钢协KEV在野外。
GPU内存内核驱动程序允许腐败,因为用户可以获得读/写访问只读页面,每中钢协KEV利用在野外。
链:整数截断(cwe - 197)导致小缓冲区分配(cwe - 131)导致界外写(cwe - 787在内核池),利用每中钢协KEV在野外。
界外写在内核模式驱动程序,利用每中钢协KEV在野外。
脱离浏览器沙箱使用界外写由于不正确的边界检查,每中钢协KEV利用在野外。
在web浏览器脚本引擎内存损坏,利用每中钢协KEV在野外。
链:手机蓝牙实现不包括抵消在计算数据包长度(cwe - 682),导致界外写(cwe - 787)
链:编译器优化(cwe - 733)用于检测整数溢出(删除或修改代码cwe - 190),允许界外写(cwe - 787)。
畸形的输入导致访问未初始化或之前删除对象,导致内存泄露
从函数调用链:1值是为了表明一个错误,而是用作数组索引。
无节制的长度值会导致缓冲区下溢SSLv2的站点时的挑战。
缓冲区下溢的体积小价值大的缓冲区(长度参数不一致,cwe - 130)
链:整数signedness错误(cwe - 195)通过签署比较,导致堆溢出(cwe - 122)
经典的基于堆栈缓冲区溢出在媒体播放器在播放列表中使用长条目
基于堆的缓冲区溢出在媒体播放器在播放列表中使用长条目
+潜在的缓解措施

阶段:需求

策略:语言选择

使用一种语言,不允许这个弱点或发生提供了结构,使这个弱点更容易避免的。

例如,执行自己的内存管理的多种语言,比如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字符串。
  • 检查缓冲区边界如果访问缓冲区在一个循环中,确保没有危险的写作过去分配空间。
  • 如果有必要,所有输入字符串截断合理长度之前他们复制和连接功能。

阶段:操作

策略:环境硬化

使用功能或运行或编译软件扩展随机安排程序的可执行文件的位置和库在内存中。因为这使得地址不可预测的,它可以防止攻击者可利用的代码可靠地跳。

例子包括地址空间布局随机化(本)REF-58][REF-60和位置独立的可执行(派)ref - 64]。

有效性:深度防御

注意:这不是一个完整的解决方案。然而,它迫使攻击者猜测一个未知值,改变每一个程序执行。此外,仍有可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。

阶段:操作

策略:环境硬化

使用一个CPU和操作系统提供数据执行保护(NX)或其等价的REF-60][ref - 61]。

有效性:深度防御

注意:这不是一个完整的解决方案,因为缓冲区溢位可以用来覆盖附近的变量以危险的方式修改软件的状态。此外,它不能用于变为无效来情况下,代码是必需的。最后,仍可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。

实施阶段:

取代无限复制函数具有类似的功能,支持长度参数,如拷贝字符串strncpy。创建这些如果他们不是可用的。

有效性:温和

注意:这种方法仍然是容易计算错误,包括“从一开始”问题,如错误(cwe - 193)和错误地计算缓冲区长度(cwe - 131)。
+检测方法

自动静态分析

这个弱点常常可以发现使用自动静态分析工具。许多现代工具使用数据流分析或基于技术来减少假阳性的数量。

自动静态分析一般不占报告时的环境考虑禁止入内的内存操作。这可能很难让用户决定哪些应该首先调查警告。例如,一个分析工具可能会报告缓冲区溢出,来自命令行参数的程序不会运行setuid或其他特权。

有效性:高

注意:缓冲区错误检测技术更成熟比大多数其他类型的弱点。

自动动态分析

这个弱点能被探测到的使用动态交互的工具和技术的软件使用大型测试套件和许多不同的输入,如模糊测试(起毛)健壮性测试和故障注入。软件的操作可能慢下来,但它不应该成为不稳定,崩溃,或者产生不正确的结果。
+会员资格
部分帮助这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
自然 类型 ID 的名字
MemberOf 视图视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。 1200年 弱点在2019 CWE最危险的软件错误
MemberOf 视图视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。 1337年 2021 CWE最危险软件的弱点的弱点
MemberOf 视图视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。 1350年 2020 CWE最危险软件的弱点的弱点
MemberOf 视图视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。 1387年 2022 CWE最危险软件的弱点的弱点
+引用
(ref - 1029)一个。“砸堆栈为了好玩和利润”。1996-11-08。<http://phrack.org/issues/49/14.html>。
[REF-7]大卫迈克尔·霍华德和勒布朗。编写安全代码。第五章,129页“堆栈溢出”。第二版。微软出版社。2002-12-04。<https://www.microsoftpressstore.com/store/writing -安全-代码- 9780735617223>。
[REF-7]大卫迈克尔·霍华德和勒布朗。编写安全代码。第五章,138页“堆溢出”。第二版。微软出版社。2002-12-04。<https://www.microsoftpressstore.com/store/writing -安全-代码- 9780735617223>。
迈克尔•霍华德(REF-44)大卫·勒布朗和Viega约翰。软件安全的“24宗罪”。“罪5:缓冲区溢出”。Page 89. McGraw-Hill. 2010.
(ref - 62)马克·多德约翰麦克唐纳和贾斯汀Schuh。“软件安全评估的艺术”。第三章,“非执行堆栈”,76页。1版。艾迪生卫斯理》2006。
(ref - 62)马克·多德约翰麦克唐纳和贾斯汀Schuh。“软件安全评估的艺术”。第五章,“保护机制”,189页。1版。艾迪生卫斯理》2006。
[ref - 90]“缓冲区下溢:你知道什么?”。Vuln-Dev邮件列表。2004-01-10。<http://seclists.org/vuln-dev/2004/Jan/0022.html>。
[REF-56]微软。使用Strsafe系列”。h函数”。<http://msdn.microsoft.com/en-us/library/ms647466.aspx>。
[REF-57]马特混乱和约翰Viega。“安全C字符串库v1.0.3”。<http://www.zork.org/safestr/>。
(REF-58)迈克尔·霍华德。在Windows Vista“地址空间布局随机化”。<http://blogs.msdn.com/michael_howard/archive/2006/05/26/address-space-layout-randomization-in-windows-vista.aspx>。
[REF-60]“罗马帝国”。<http://en.wikipedia.org/wiki/PaX>。
微软(ref - 61)。第1部分“理解DEP作为缓解技术”。<http://blogs.technet.com/b/srd/archive/2009/06/12/understanding dep - - -缓解-技术- 1. aspx一部分>。
墨菲(ref - 64)资助。“位置独立的可执行文件(派)”。Red Hat。2012-11-28。<https://securityblog.redhat.com/2012/11/28/position-independent-executables-pie/>。
+内容的历史
+提交
提交日期 提交者 组织
2009-10-21 CWE内容团队 主教法冠
+修改
修改日期 修饰符 组织
2010-02-16 CWE内容团队 主教法冠
更新Demonstrative_Examples
2010-09-27 CWE内容团队 主教法冠
更新的关系
2011-06-01 CWE内容团队 主教法冠
更新Common_Consequences
2014-06-23 CWE内容团队 主教法冠
更新Demonstrative_Examples
2015-12-07 CWE内容团队 主教法冠
更新的关系
2018-03-27 CWE内容团队 主教法冠
更新描述
2019-09-19 CWE内容团队 主教法冠
更新Applicable_Platforms、Demonstrative_Examples Detection_Factors、Likelihood_of_Exploit Observed_Examples, Potential_Mitigations,引用关系,Time_of_Introduction
2020-02-24 CWE内容团队 主教法冠
更新Observed_Examples、人际关系
2020-06-25 CWE内容团队 主教法冠
更新Observed_Examples
2020-08-20 CWE内容团队 主教法冠
更新Alternate_Terms Demonstrative_Examples Observed_Examples,关系
2020-12-10 CWE内容团队 主教法冠
更新的关系
2021-03-15 CWE内容团队 主教法冠
更新Demonstrative_Examples
2021-07-20 CWE内容团队 主教法冠
更新Demonstrative_Examples Potential_Mitigations,关系
2022-06-28 CWE内容团队 主教法冠
更新Observed_Examples、人际关系
2022-10-13 CWE内容团队 主教法冠
更新Applicable_Platforms
2023-01-31 CWE内容团队 主教法冠
更新Alternate_Terms Demonstrative_Examples,描述
更多的信息是可用的,请选择一个不同的过滤器。
页面最后更新:2023年1月31日