 描述
产品使用不受信任的输入在计算或使用数组索引,但是产品不验证或不正确验证索引,确保索引引用数组中的一个有效位置。
 替代条款
禁止入内的数组索引 |
|
index-out-of-range |
|
数组索引下溢 |
|
 的关系
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
 相关的视图”研究概念”(cwe - 1000)
自然 |
类型 |
ID |
的名字 |
ChildOf |
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 |
1285年 |
验证指定的索引位置不当,或抵消输入 |
CanPrecede |
类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 |
119年 |
不当的操作限制的范围内一个内存缓冲区 |
CanPrecede |
变体——一个弱点与某种类型的产品,通常涉及到一个特定的语言或技术。更具体的比基本的弱点。变异水平弱点通常描述问题的3到5以下维度:行为、财产、技术、语言,和资源。 |
789年 |
内存分配过多的大小值 |
CanPrecede |
Base -一个弱点,仍主要是独立的资源或技术,但有足够的细节来提供特定的检测和预防方法。基础水平的弱点通常描述问题的2或3以下维度:行为、财产、技术、语言,和资源。 |
823年 |
超出范围的使用指针偏移量 |
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
 相关观点“软件开发”(cwe - 699)
自然 |
类型 |
ID |
的名字 |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
1215年 |
数据验证问题 |
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
 简化映射的相关视图”缺点漏洞发布”(cwe - 1003)
自然 |
类型 |
ID |
的名字 |
ChildOf |
类——一个弱点,描述的是一个非常抽象的时尚,通常独立于任何特定的语言或技术。更具体的比一个支柱的弱点,但更普遍的基本的弱点。类级别的弱点通常描述问题的1或2以下维度:行为、财产和资源。 |
20. |
不正确的输入验证 |
 模式的介绍
不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
 常见的后果
这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
范围 |
影响 |
可能性 |
完整性 可用性
|
使用索引的数组的边界之外很可能导致腐败相关的记忆,或许说明,导致崩溃,如果之外的值是有效的内存区域。 |
|
完整性
|
如果内存损坏数据,而不是指令,系统将继续与不当函数值。 |
|
保密 完整性
|
使用索引的数组的边界之外还可以触发界外读或写操作,或操作错误的对象;即。“缓冲区溢出”并不总是结果。这可能导致暴露敏感数据或修改。 |
|
完整性 保密 可用性
|
如果攻击者可访问的内存可以有效地控制,它可能会运行任意代码的情况,与标准的缓冲区溢出和可能不使用大型输入如果一个精确的索引可以控制。 |
|
完整性 可用性 保密
|
技术的影响:DoS:崩溃,退出或重新启动;执行未经授权的代码或命令;读记忆;修改内存
一个故障可能允许一个溢出( cwe - 788()或下溢 cwe - 786)数组的索引。接下来会发生什么,将取决于执行的操作类型的范围,但可以暴露敏感信息,导致系统崩溃,或者可能导致执行任意代码。 |
|
 利用的可能性
 示范例子
示例1
在下面的代码片段中,一个不可信的整数值是用来引用一个对象数组。
公共字符串getValue (int指数){
返回数组(指数); }
如果索引数组的范围之外,这可能会导致一个ArrayIndexOutOfBounds异常了。
示例2
下面的例子将用户提供的价值分配一个对象数组,然后作用于数组中。
私人空间buildList (int untrustedListSize) {
如果(0 > untrustedListSize) {
死亡(“负价值提供列表的大小,死邪恶的黑客!”); } 小部件[]=新的小部件列表(untrustedListSize); [0]=新的小部件列表(); }
这个例子中试图建立一个从用户指定的值列表,甚至检查以确保提供一个非负价值。然而,如果提供的是一个0值,代码将建立一个数组大小为0,然后尝试一个新的小部件存储在第一个位置,导致抛出一个异常。
示例3
在以下代码,方法检索一个值在一个特定的数组索引数组位置作为输入参数的方法
int getValueFromArray (int *数组,int len, int指数){
int值;
/ /检查数组下标小于最大
/ /数组的长度
如果(指数< len) { }
/ /如果数组索引无效则输出错误消息
/ /并返回值指示错误
其他{
printf(“价值:% d \ n”,阵列(指数)); 值= 1; }
返回值;
}
然而,这种方法只验证给定的数组下标小于数组的最大长度但不检查的最小值(cwe - 839)。这将允许一个负值被接受作为输入数组索引,这将导致一个界外读(cwe - 125),并可能允许访问敏感的记忆。输入数组索引应该检查来验证在最大和最小范围内所需的阵列(cwe - 129)。在这个例子中if语句应该修改为包括一个最小范围检查,如下所示。
…
/ /检查数组索引内是正确的
/ /数组的值的范围
如果(指数> = 0 & &指数< len) {
…
示例4
下面的示例检索消息的大小对于一个pop3邮件服务器。消息大小从套接字检索返回的缓冲区数量和消息大小的消息,消息数量(num)和大小(尺寸)提取缓冲和消息大小被放置到一个数组中使用数组索引的消息数量。
/ *获取所有消息的大小* /
int getsize (int袜子,int, int *大小){
… 字符缓冲区(BUFFER_SIZE); int好; int num、大小;
/ /读取从套接字和值添加到数组大小
((好= gen_recv(袜子,但,sizeof (buf))) = = 0) {
/ /继续从套接字读取到缓冲区只包含“。”
如果(DOTLINE (buf))
打破; else if (sscanf (buf,“% d % d”, num,大小)= = 2)
大小(num - 1) =大小;
}
…
}
在这个例子中,消息数量从缓冲区可以检索的值超出了允许范围的数组索引,可能是一个负数。没有适当的验证值用于数组索引数组溢出可能发生和可能导致未经授权的访问内存地址和系统崩溃。数组索引的值应进行验证,以确保它是在容许范围内数组的索引如以下代码。
/ *获取所有消息的大小* /
int getsize (int袜子,int, int *大小){
… 字符缓冲区(BUFFER_SIZE); int好; int num、大小;
/ /读取从套接字和值添加到数组大小
((好= gen_recv(袜子,但,sizeof (buf))) = = 0) {
/ /继续从套接字读取到缓冲区只包含“。”
如果(DOTLINE (buf))
打破;
else if (sscanf (buf,“% d % d”, num,大小)= = 2){
如果(num > 0 & & num < = (unsigned)计数)
大小(num - 1) =大小;
其他的
/ *警告可能试图引发缓冲区溢出* /
报告(stderr,“警告:忽略虚假数据服务器返回的消息大小。\ n”);
}
}
…
}
示例5
在下面的示例中,该方法displayProductSummary叫做从Web服务servlet来检索产品摘要信息显示给用户。servlet得到产品的整数值从用户数量并将其传递到displayProductSummary方法。displayProductSummary方法将产品编号的整数值传递给getProductSummary方法获得的产品目录包含项目总结使用整数的数组对象价值的产品编号的数组索引。
/ /方法从servlet调用来获取产品信息
公共字符串displayProductSummary (int指数){
字符串productSummary =新的字符串(" ");
尝试{
字符串productSummary = getProductSummary(指数);
}捕捉(例外的前女友){…}
返回productSummary;
}
公共字符串getProductSummary (int指数){
返回产品(指数); }
在本例中使用的整数值作为提供的数组索引,用户可以在容许范围的指标为数组提供意想不到的结果或可能导致应用程序失败。使用的整数值数组索引应该进行验证,以确保它是在容许范围内数组的索引如以下代码。
/ /方法从servlet调用来获取产品信息
公共字符串displayProductSummary (int指数){
字符串productSummary =新的字符串(" ");
尝试{
字符串productSummary = getProductSummary(指数);
}捕捉(例外的前女友){…}
返回productSummary;
}
公共字符串getProductSummary (int指数){
字符串productSummary = " ";
如果((指数> = 0)& &(指数< MAX_PRODUCTS)) {
productSummary =产品(指数); } 其他{
System.err。println(“索引越界”); 把新IndexOutOfBoundsException (); }
返回productSummary;
}
另一个在Java中是使用的一个ArrayList等集合对象,将自动生成一个异常如果试图访问数组索引越界。
ArrayList productArray = new ArrayList (MAX_PRODUCTS); … 尝试{
productSummary =(字符串)productArray.get(指数); }捕捉(IndexOutOfBoundsException ex) {…}
例子6
下面的示例用户要求一个偏移量到一个数组中选择一个项目。
int主要(int命令行参数个数,char * * argv) {
char *项目[]={“船”、“车”、“卡车”,“训练”}; int指数= GetUntrustedOffset (); printf(“你选择% s \ n”,项目[索引1]); }
程序员允许用户指定的元素列表中选择,但是攻击者可以提供一个界外偏移,导致缓冲区上(cwe - 126)。
 观察到的例子
参考 |
描述 |
|
数据包的大型ID作为数组索引 |
|
消极的数组索引作为参数流行命令列表 |
|
整数signedness错误会导致消极的数组索引 |
|
产品不正确跟踪计数和最大数量,从而导致结果数组下标溢出。 |
|
链:设备驱动程序包捕获软件允许访问一个意想不到的IOCTL合成数组索引错误。 |
|
|
 潜在的缓解措施
阶段:体系结构和设计
使用一个输入验证框架如Struts或OWASP ESAPI验证API。注意,使用一个框架不会自动处理所有输入验证问题;注意可能出现的弱点从滥用框架本身( cwe - 1173)。 |
阶段:体系结构和设计
对于任何一个在客户端执行安全检查,确保这些检查复制在服务器端,为了避免 cwe - 602。攻击者可以绕过客户端检查通过修改值后,检查执行,或通过改变客户端完全删除客户端检查。然后,这些修改的值将被提交到服务器。
即使客户端对服务器端安全检查提供最小的好处,他们仍然有用。首先,他们可以支持入侵检测。如果服务器接收输入,应该已经被客户拒绝,那么它可能是一个攻击的迹象。第二,客户端错误检查可以提供有用的反馈给用户预期的有效输入。第三,可能会有意外的服务器端处理时间的减少输入错误,虽然这通常是一个小的储蓄。
|
阶段:需求
使用一种语言,不允许这个弱点或发生提供了结构,使这个弱点更容易避免的。
例如,Ada允许程序员约束变量的值和语言比如Java和Ruby允许程序员处理异常时禁止入内的索引访问。
|
阶段:操作
使用功能或运行或编译软件扩展随机安排程序的可执行文件的位置和库在内存中。因为这使得地址不可预测的,它可以防止攻击者可利用的代码可靠地跳。
注意:这不是一个完整的解决方案。然而,它迫使攻击者猜测一个未知值,改变每一个程序执行。此外,仍有可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。 |
阶段:操作
注意:这不是一个完整的解决方案,因为缓冲区溢位可以用来覆盖附近的变量以危险的方式修改软件的状态。此外,它不能用于变为无效来情况下,代码是必需的。最后,仍可能导致拒绝服务的攻击,因为典型的反应是退出应用程序。 |
实施阶段:
假设所有的输入是恶意的。使用一个“接受良好的“输入验证策略,即。,使用一个可接受的输入列表,严格遵守规范。拒绝任何不严格符合规范的输入,或将其转换为一些。
当执行输入验证,考虑所有可能相关的属性,包括长度,类型的输入,可接受的值的全系列,缺失或额外的输入,语法,一致性相关领域,符合业务规则。作为业务规则逻辑的一个例子,在语法上“船”可能是有效的,因为它只包含字母数字字符,但它不是有效的如果输入预计仅包含颜色,如“红”或“蓝色”。
不完全依赖寻找恶意或畸形的输入。这很可能错过至少有一个不受欢迎的输入,特别是如果代码的环境变化。这可以让攻击者有足够的空间绕过验证。然而,denylists可以用于检测潜在攻击或确定哪些输入是畸形的,应该直接驳回。
当访问一个用户控制数组索引,使用严格的目标数组内的值的范围。确保你不允许使用负值。即验证最小和最大可接受的值的范围内。
|
实施阶段:
特别注意验证所有输入调用代码,跨越语言边界时,如从本机代码的解释型语言。这将创建一个意想不到的语言边界之间的交互。确保你没有违反任何期望的语言接口。例如,尽管Java可能不是容易缓冲区溢出,提供一个大型参数调用本地代码可能会触发一个溢出。 |
阶段:体系结构和设计;操作
使用所需的最低特权运行您的代码来完成必要的任务( ref - 76]。如果可能的话,创建独立帐户权限有限,只用于一个任务。这样,一个成功的攻击不会立即给攻击者访问其他软件或其环境。例如,数据库应用程序很少需要作为数据库管理员运行,特别是在日常操作。 |
阶段:体系结构和设计;操作
运行代码的“监狱”或类似沙箱环境执行严格的流程和操作系统之间的边界。这可能有效地限制哪些文件可以在一个特定的目录或访问哪些命令可以执行的软件。
操作系统的例子包括Unix chroot监狱,AppArmor对,SELinux。在一般情况下,托管代码可能会提供一些保护。例如,java。在Java SecurityManager FilePermission允许软件指定文件操作的限制。
这可能不是一个可行的解决方案,它只限制对操作系统的影响;应用程序的其余部分可能仍然接受妥协。
注意:这种缓解的有效性取决于特定的沙盒或监狱的预防功能使用,只可能有助于减少攻击的范围,比如限制攻击者对特定文件系统的系统调用或限制部分,可以访问。 |
 弱点Ordinalities
Ordinality |
描述 |
合成 |
(缺点是一个质量问题,可能会间接更容易引入的安全相关的弱点或使他们更难检测)
最常见的条件情况导致界外数组索引是使用循环索引变量缓冲索引。如果循环结束条件的缺陷,该指数可以无限增长或减少,因此导致缓冲区溢出或下溢的。另一个常见的情况导致这种情况是使用一个函数的返回值或计算得到的值直接作为一个缓冲区的指数。 |
 检测方法
自动静态分析
这个弱点常常可以发现使用自动静态分析工具。许多现代工具使用数据流分析或基于技术来减少假阳性的数量。
自动静态分析一般不占报告时的环境考虑禁止入内的内存操作。这可能很难让用户决定哪些应该首先调查警告。例如,一个分析工具可能会报告来自命令行参数的数组索引错误的程序不会运行setuid或其他特权。
注意:这不是一个完美的解决方案,因为100%的准确率和覆盖率不可行。 |
自动动态分析
这个弱点能被探测到的使用动态交互的工具和技术的软件使用大型测试套件和许多不同的输入,如模糊测试(起毛)健壮性测试和故障注入。软件的操作可能慢下来,但它不应该成为不稳定,崩溃,或者产生不正确的结果。 |
黑盒
黑盒方法可能得不到所需的代码覆盖在有限时间内限制,和一个动态测试可能不会产生任何明显的副作用,即使它是成功的。 |
 影响资源
 会员资格
这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
自然 |
类型 |
ID |
的名字 |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
738年 |
CERT C安全编码标准(2008)第五章-整数(INT) |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
740年 |
CERT C安全编码标准(2008)第七章-数组(ARR) |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
802年 |
2010年前25 -资源管理风险 |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
867年 |
2011年处于25 -弱点 |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
872年 |
CERT c++安全编码部分04 -整数(INT) |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
874年 |
CERT c++安全编码部分06 -数组和STL (ARR) |
MemberOf |
视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。 |
884年 |
CWE横截面 |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
970年 |
SFP二级集群:错误的缓冲区的访问 |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
1131年 |
方案》(2016)——安全质量措施 |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
1160年 |
SEI CERT C编码标准- 06指导方针。数组(ARR) |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
1179年 |
01 SEI CERT Perl编码标准,指导方针。输入验证和数据卫生处理(IDS) |
MemberOf |
类别——CWE条目包含一组其他条目,共享一个共同的特点。 |
1308年 |
方案及质量措施,安全 |
MemberOf |
视图——CWE条目的一个子集,它提供了一种检查CWE的内容。两个主要视图结构片(列表)和图(包含条目之间的关系)。 |
1340年 |
方案及数据保护措施 |
 笔记
的关系
这个弱点可以先于控制内存分配( cwe - 789在语言使用时自动扩展数组索引大于数组的大小,如JavaScript。
理论
不当验证数组索引可能会直接导致的always-incorrect行为“使用界外访问数组的索引。”
 分类法映射
映射分类名称 |
节点ID |
适合 |
映射节点名 |
扣 |
|
|
无节制的数组索引 |
千鸟 |
|
|
索引数组下标溢出 |
CERT C安全编码 |
ARR00-C |
|
理解数组是如何工作的 |
CERT C安全编码 |
ARR30-C |
CWE更具体 |
不形式或使用界外指针或数组下标吗 |
CERT C安全编码 |
ARR38-C |
|
不添加或减去一个整数的指针如果结果值不指一个有效的数组元素呢 |
CERT C安全编码 |
INT32-C |
|
确保签署了整数操作不会导致溢出 |
SEI CERT Perl编码标准 |
IDS32-PL |
不精确的 |
验证任何整数作为数组索引 |
OMG ASCSM |
ASCSM -cwe - 129 |
|
|
软件故障模式 |
SFP8 |
|
错误的缓冲区的访问 |
 引用
|
|
|
|
|
|
迈克尔•霍华德(REF-44)大卫·勒布朗和Viega约翰。软件安全的“24宗罪”。“罪5:缓冲区溢出”。Page 89. McGraw-Hill. 2010. |
|
|
|
 内容的历史
提交 |
提交日期 |
提交者 |
组织 |
2006-07-19 |
扣 |
|
|
修改 |
修改日期 |
修饰符 |
组织 |
2008-07-01 |
肖恩Eidemiller |
Cigital |
添加/更新示范例子 |
2008-09-08 |
CWE内容团队 |
主教法冠 |
更新Alternate_Terms、Applicable_Platforms Common_Consequences、关系、Other_Notes, Taxonomy_Mappings Weakness_Ordinalities |
2008-11-24 |
CWE内容团队 |
主教法冠 |
更新的关系,Taxonomy_Mappings |
2009-01-12 |
CWE内容团队 |
主教法冠 |
更新Common_Consequences |
2009-10-29 |
CWE内容团队 |
主教法冠 |
更新描述、名称、关系 |
2009-12-28 |
CWE内容团队 |
主教法冠 |
更新Applicable_Platforms、Common_Consequences Observed_Examples、Other_Notes Potential_Mitigations, Theoretical_Notes Weakness_Ordinalities |
2010-02-16 |
CWE内容团队 |
主教法冠 |
更新Applicable_Platforms、Demonstrative_Examples Detection_Factors、Likelihood_of_Exploit Potential_Mitigations,引用,Related_Attack_Patterns、人际关系 |
2010-04-05 |
CWE内容团队 |
主教法冠 |
更新Related_Attack_Patterns |
2010-06-21 |
CWE内容团队 |
主教法冠 |
更新Common_Consequences Potential_Mitigations,引用 |
2010-09-27 |
CWE内容团队 |
主教法冠 |
更新Potential_Mitigations Relationship_Notes,关系 |
2010-12-13 |
CWE内容团队 |
主教法冠 |
更新Demonstrative_Examples、Observed_Examples Potential_Mitigations |
2011-03-29 |
CWE内容团队 |
主教法冠 |
更新Common_Consequences、Demonstrative_Examples Weakness_Ordinalities |
2011-06-01 |
CWE内容团队 |
主教法冠 |
更新Common_Consequences |
2011-06-27 |
CWE内容团队 |
主教法冠 |
更新的关系 |
2011-09-13 |
CWE内容团队 |
主教法冠 |
更新的关系,Taxonomy_Mappings |
2012-05-11 |
CWE内容团队 |
主教法冠 |
更新Demonstrative_Examples Potential_Mitigations、引用关系 |
2012-10-30 |
CWE内容团队 |
主教法冠 |
更新Potential_Mitigations |
2014-02-18 |
CWE内容团队 |
主教法冠 |
更新Potential_Mitigations,引用 |
2014-07-30 |
CWE内容团队 |
主教法冠 |
更新的关系,Taxonomy_Mappings |
2015-12-07 |
CWE内容团队 |
主教法冠 |
更新的关系 |
2017-11-08 |
CWE内容团队 |
主教法冠 |
更新Causal_Nature、引用关系,Taxonomy_Mappings |
2018-03-27 |
CWE内容团队 |
主教法冠 |
更新的引用 |
2019-01-03 |
CWE内容团队 |
主教法冠 |
更新引用关系,Taxonomy_Mappings |
2019-09-19 |
CWE内容团队 |
主教法冠 |
更新Potential_Mitigations |
2020-02-24 |
CWE内容团队 |
主教法冠 |
更新Potential_Mitigations、关系、Taxonomy_Mappings |
2020-06-25 |
CWE内容团队 |
主教法冠 |
更新Demonstrative_Examples Potential_Mitigations、关系类型 |
2020-08-20 |
CWE内容团队 |
主教法冠 |
更新Potential_Mitigations、人际关系 |
2020-12-10 |
CWE内容团队 |
主教法冠 |
更新的关系 |
2021-03-15 |
CWE内容团队 |
主教法冠 |
更新引用关系 |
2022-10-13 |
CWE内容团队 |
主教法冠 |
更新引用关系,Taxonomy_Mappings |
以前的条目名称 |
改变日期 |
以前的条目名称 |
2009-10-29 |
无节制的数组索引 |
|
|