 描述
产品不正确计算时使用的大小分配一个缓冲区,这可能会导致缓冲区溢出。
 的关系
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
 相关观点“软件开发”(cwe - 699)
自然 |
类型 |
ID |
的名字 |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
1218年 |
内存缓冲区错误 |
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
 简化映射的相关视图”缺点漏洞发布”(cwe - 1003)
自然 |
类型 |
ID |
的名字 |
ChildOf |
支柱——一个弱点是最抽象类型的弱点和代表一个主题类/基地/变体相关弱点。支柱是不同于一个类别作为支柱技术上仍然是一种弱点,描述了一个错误,而一个类别代表一个共同特征用于组相关的东西。 |
682年 |
错误的计算 |
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
 相关的视图”方案及质量的措施(2020)”(CWE-1305)
自然 |
类型 |
ID |
的名字 |
ChildOf |
支柱——一个弱点是最抽象类型的弱点和代表一个主题类/基地/变体相关弱点。支柱是不同于一个类别作为支柱技术上仍然是一种弱点,描述了一个错误,而一个类别代表一个共同特征用于组相关的东西。 |
682年 |
错误的计算 |
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
 相关的视图”方案及数据保护措施”(cwe - 1340)
自然 |
类型 |
ID |
的名字 |
ChildOf |
支柱——一个弱点是最抽象类型的弱点和代表一个主题类/基地/变体相关弱点。支柱是不同于一个类别作为支柱技术上仍然是一种弱点,描述了一个错误,而一个类别代表一个共同特征用于组相关的东西。 |
682年 |
错误的计算 |
 模式的介绍
不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
 常见的后果
这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
范围 |
影响 |
可能性 |
完整性 可用性 保密
|
技术的影响:DoS:崩溃,退出或重新启动;执行未经授权的代码或命令;读记忆;修改内存
如果使用不正确的计算中内存分配,那么软件可能创建一个缓冲区,比预期的更小或更大。如果分配缓冲区小于预期,这可能会导致一个界外读或写( cwe - 119),可能导致崩溃,允许任意代码执行,或暴露敏感数据。 |
|
 利用的可能性
 示范例子
示例1
下面的代码分配内存的最大数量的小部件。然后获得指定数量的小部件,确保用户不要求太多。然后初始化数组的元素使用InitializeWidget ()。因为小部件的数量可以为每个请求不同,插入一个空指针的代码意味着最后一个部件的位置。
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当零分配。根据环境和编译设置,这可能会导致内存泄露。
示例2
以下为图像图像处理代码分配一个表。
img_t table_ptr;/ *结构包含img数据,每个* / 10 kb int num_imgs; … num_imgs = get_num_imgs (); table_ptr = (img_t *) malloc (sizeof (img_t) * num_imgs); …
这段代码将分配一个表大小num_imgs,然而随着num_imgs越来越大,计算确定的大小最终会溢出列表(cwe - 190)。这将导致一个非常小的列表来分配。如果后续代码运行在名单上,就好像它是num_imgs长,这可能会导致许多类型的界外问题(cwe - 119)。
示例3
这个例子中一个编码过程适用于一个输入字符串并将其存储到缓冲区。
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[我]){ } 其他dst_buf [dst_index + +] = user_supplied_string[我];
} 返回dst_buf;
}
程序员试图编码用户控制的&字符字符串,然而字符串的长度编码应用程序之前进行验证。此外,程序员假定编码扩张只会扩大给定字符的4倍,而编码&扩展的5。结果,当编码过程扩展了字符串可以溢出目的地缓冲区,如果攻击者提供了许多与符号的字符串。
示例4
下面的代码是为了从套接字读取传入数据包和提取一个或多个标题。
DataPacket *包; int numHeaders; PacketHeader *头;
袜子= AcceptSocketConnection (); ReadPacket(包、袜子); numHeaders =包- >标题;
如果(numHeaders > 100) {
ExitError(“太多的头!”); } 头= malloc (numHeaders * sizeof (PacketHeader); ParsePacketHeaders(包、头);
代码执行一个检查,确保包不包含太多的头。然而,numHeaders被定义为int签署,所以它可以是负数。如果传入的数据包指定一个值,如3,然后malloc计算将产生一个负数(-300年说,如果每个标题最多可达100个字节)。当这个结果提供给malloc(),它是第一个转换为size_t类型。这种转换然后产生一个较大的值,如4294966996,这可能导致malloc()失败或分配极其大量的内存(cwe - 195)。用适当的负数,攻击者可以诱骗malloc()使用一个非常小的正数,然后分配一个缓冲区,远小于预期,可能导致缓冲区溢出。
示例5
下面的代码尝试将三种不同的身份证号码保存到一个数组。的数组分配内存使用调用malloc ()。
int * id_sequence;
/ *为三个id的数组分配空间。* /
id_sequence = (int *) malloc (3); 如果(id_sequence = = NULL)退出(1);
/ *填充id数组。* /
id_sequence [0] = 13579; id_sequence [1] = 24680; id_sequence [2] = 97531;
上面的代码的问题是尺寸参数的值中使用malloc()调用。它使用一个值为“3”,根据定义的结果要创建三个字节的缓冲区。然而,目的是创建一个缓冲区,拥有三个整数,并在C语言中,每一个int需要4个字节的内存,因此需要12字节的数组,每个int 4字节。执行上面的代码可能导致缓冲区溢出12字节的数据被保存到3个字节的空间分配。溢出发生在转让id_sequence[0],并将继续转让id_sequence[1]和id_sequence [2]。
malloc()调用可以使用“3 * sizeof (int)”作为大小的值参数来分配正确的所需的空间来存储三个整数。
 观察到的例子
参考 |
描述 |
|
|
|
替换溢出:缓冲区溢出后使用扩展的环境变量长度检查执行 |
|
替换溢出:缓冲区溢出使用扩张的环境变量 |
|
替换溢出:使用大量的替换字符串缓冲区溢出 |
|
转换溢出:产品添加了额外的转义字符输入数据,但是不占他们的缓冲区长度 |
|
转换溢出:缓冲区溢出时扩大“>”,“在”等。 |
|
使用通配符扩展溢出:缓冲区溢出 |
|
扩张溢出:长路径名+水珠=溢出 |
|
扩张溢出:长路径名+水珠=溢出 |
|
特殊字符在参数不适当扩大 |
|
小长度值会导致堆溢出 |
|
多个变体 |
|
可能需要进一步调查,但摘要 |
|
可能需要进一步调查,但摘要 |
|
链:语言解释器计算错误的缓冲区大小( cwe - 131)通过使用“大小= ptr ?X: Y”而不是“大小= (ptr吗?X, Y)”的表情。 |
 潜在的缓解措施
实施阶段:
在分配一个缓冲区为目的的转换,转换,或编码输入,分配足够的内存来处理最大可能的编码。例如,在一个程序,将“&”字符转换为“,”对HTML实体编码,输出缓冲区需要至少5倍的输入缓冲区。 |
实施阶段:
了解编程语言的基本表示形式,以及它如何与数值计算( cwe - 681)。密切关注字节大小差异,精度,签署/无符号的区别,截断,类型之间的转换和铸造,“不是一个数字”计算,和语言如何处理数字太大或太小的底层表示。( REF-7]
也要小心占32位,64位,和其他潜在的差异可能影响数字表示。
|
实施阶段:
对任何数字输入执行输入验证,确保它是在预期的范围内。执行输入同时满足最小和最大预期范围的需求。 |
阶段:体系结构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免 cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。 |
实施阶段:
当处理结构化的数据包含大小字段紧随其后的是原始数据,识别并解决大小之间的任何不一致字段和数据的实际尺寸( cwe - 130)。 |
实施阶段:
分配内存时,它使用哨兵马克的数据结构——例如NUL字节字符串——确保你在计算还包括哨兵必须分配内存的总量。 |
实施阶段:
取代无限复制函数具有类似的功能,支持长度参数,如拷贝字符串strncpy。创建这些如果他们不是可用的。
注意:这种方法仍然是容易计算错误,包括“从一开始”问题,如错误( cwe - 193)和错误地计算缓冲区长度( cwe - 131)。此外,这只解决了潜在的溢出问题。资源消耗/疲劳问题仍然是可能的。 |
实施阶段:
|
实施阶段:
使用适当的类型所需的行动。例如,在C / c++中,只使用无符号类型值,不可能是负的,如高度、宽度、或其他数字与数量有关。这将简化验证和减少意外与意想不到的铸件。 |
阶段:体系结构和设计
使用审查库或框架不允许这个弱点发生或提供了结构,使这个弱点更容易避免的。
使用库或框架更容易处理数字没有意想不到的后果,或缓冲区分配例程自动跟踪缓冲区大小。
例子包括安全整数处理包如SafeInt (c++)或IntegerLib (C或c++)。( ref - 106]
|
阶段:构建和编译
使用功能或运行或编译软件扩展自动提供一个保护机制,减轻或消除缓冲区溢出。
例如,某些编译器和扩展提供自动缓冲区溢出检测机制,构建到编译后的代码。例子包括Microsoft Visual Studio / GS标志,Fedora / Red Hat FORTIFY_SOURCE GCC国旗,StackGuard, ProPolice。
注意:这未必是一个完整的解决方案,因为这些机制只能检测某些类型的溢出。此外,仍有可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。 |
阶段:操作
使用功能或运行或编译软件扩展随机安排程序的可执行文件的位置和库在内存中。因为这使得地址不可预测的,它可以防止攻击者可利用的代码可靠地跳。
注意:这不是一个完整的解决方案。然而,它迫使攻击者猜测一个未知值,改变每一个程序执行。此外,仍有可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。 |
阶段:操作
注意:这不是一个完整的解决方案,因为缓冲区溢位可以用来覆盖附近的变量以危险的方式修改软件的状态。此外,它不能用于变为无效来情况下,代码是必需的。最后,仍可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。 |
实施阶段:
检查编译器警告密切并消除潜在的安全隐患问题,如签署/无符号不匹配在内存中操作,或使用未初始化的变量。即使很少被利用的弱点,一个单一的故障可能会导致整个系统的妥协。 |
阶段:体系结构和设计;操作
使用所需的最低特权运行您的代码来完成必要的任务( ref - 76]。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。 |
阶段:体系结构和设计;操作
运行代码的“监狱”或类似沙箱环境执行严格的流程和操作系统之间的边界。这可能有效地限制哪些文件可以在一个特定的目录或访问哪些命令可以执行的软件。
操作系统的例子包括Unix chroot监狱,AppArmor对,SELinux。在一般情况下,托管代码可能会提供一些保护。例如,java。在Java SecurityManager FilePermission允许软件指定文件操作的限制。
这可能不是一个可行的解决方案,它只限制对操作系统的影响;应用程序的其余部分可能仍然接受妥协。
注意:这种缓解的有效性取决于特定的沙盒或监狱的预防功能使用,只可能有助于减少攻击的范围,比如限制攻击者对特定文件系统的系统调用或限制部分,可以访问。 |
 检测方法
自动静态分析
这个弱点常常可以发现使用自动静态分析工具。许多现代工具使用数据流分析或基于技术来减少假阳性的数量。
自动静态分析一般不占报告时的环境考虑潜在的缓冲区计算中的错误。这可能很难让用户决定哪些应该首先调查警告。例如,一个分析工具可能会报告缓冲区溢出,来自命令行参数的程序不会运行setuid或其他特权。
注意:缓冲区错误检测技术更成熟比大多数其他类型的弱点。 |
自动动态分析
这个弱点能被探测到的使用动态交互的工具和技术的软件使用大型测试套件和许多不同的输入,如模糊测试(起毛)健壮性测试和故障注入。软件的操作可能慢下来,但它不应该成为不稳定,崩溃,或者产生不正确的结果。
注意:不可见性的代码,黑盒方法可能无法充分区分别人的这个弱点,需要后续手工方法诊断的潜在问题。 |
手动分析
手动分析寻找这个弱点可能是有用的,但它可能不会在有限时间内达到所需的代码覆盖约束。这是困难的缺点,必须考虑所有输入,因为攻击表面太大。 |
手动分析
这个弱点可以检测使用的工具和技术,需要手动(人类)的分析,如渗透测试、威胁建模和交互工具,允许测试人员记录和修改一个活跃的会话。
具体来说,手工静态分析有助于评估分配计算的正确性。这可以用于检测溢出条件( cwe - 190)或类似的弱点可能严重的安全影响。
注意:这些可能是更有效的比严格的自动化技术。尤其如此弱点设计和相关的业务规则。 |
自动静态分析——二进制或字节码
根据飙升,以下检测技术可能是有用的:
-
字节码的弱点分析,包括反汇编程序+源代码弱点分析
-
二进制弱点分析,包括反汇编程序+源代码弱点分析
|
人工静态分析——二进制或字节码
根据飙升,以下检测技术可能是有用的:
|
人工静态分析源代码
根据飙升,以下检测技术可能是有用的:
-
关注人工抽查,手动分析来源
-
手工源代码审查(不检查)
|
自动静态分析源代码
根据飙升,以下检测技术可能是有用的:
-
源代码缺陷分析仪
-
Context-configured源代码分析器
|
体系结构或设计审查
根据飙升,以下检测技术可能是有用的:
|
 会员资格
这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
 笔记
维护
这是一个广泛的类别。一些例子包括:
- 简单的数学错误,
- 错误的更新平行计数器,
- 不占大小差异当“转换”一个输入到另一个格式(如URL规范化或其他转换,可以生成一个结果大于原始输入,即。“扩张”)。
这种层次的细节很少在公开报告可用,所以很难找到很好的例子。
 分类法映射
映射分类名称 |
节点ID |
适合 |
映射节点名 |
千鸟 |
|
|
其他长度计算误差 |
CERT C安全编码 |
INT30-C |
不精确的 |
确保无符号整数操作不包装 |
CERT C安全编码 |
MEM35-C |
CWE更抽象 |
为一个对象分配足够的内存 |
 引用
|
|
|
|
|
|
|
迈克尔•霍华德(REF-44)大卫·勒布朗和Viega约翰。软件安全的“24宗罪”。“罪5:缓冲区溢出”。Page 89. McGraw-Hill. 2010. |
(ref - 62)马克·多德约翰麦克唐纳和贾斯汀Schuh。“软件安全评估的艺术”。第八章,“递增指针错误”,401页。1版。艾迪生卫斯理》2006。 |
|
|