描述
一个整数值指定由负的金额或转移金额大于或等于价值所包含的比特数导致意外或不确定的结果。
扩展描述
指定一个值被负转移金额未定义在不同的语言。各种计算机体系结构以不同的方式实现这一行动。编译器和解释器在生成代码来完成转变通常不检查这个问题。
指定一个over-shift,转变大于或等于所包含的比特数的价值转移,产生一个结果不同的体系结构和编译器。在一些语言中,这个动作是专门列为产生一个未定义的结果。
的关系
模式的介绍
不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
阶段 |
请注意 |
实现 |
增加生产班次没有正确验证的大小和符号的转变。 |
常见的后果
这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
示范例子
示例1
负转移金额x86指令或x86_64转变将产生的比特数转移通过2补数的数量和转变有效地掩蔽量最低的6位64位转移指令。
unsigned int r = 1 < < 5;
上面的示例最终转变的5。FFFFFFFFFFFFFFFD十六进制值,当位以上6位蒙面,转变量变成二进制值111101 61十进制的转变。转变为61比5产生非常不同的结果。前面的示例是一个非常简单的版本可能是更现实的下面的代码会发生什么在一个真正的系统。
reg_bit int choose_bit (int, int bit_number_from_elsewhere) {
如果(NEED_TO_SHIFT) {
reg_bit - = bit_number_from_elsewhere;
} 返回reg_bit;
} unsigned int handle_io_register (unsigned int * r) {
unsigned int the_bit = 1 < < choose_bit (5、10); * r | = the_bit; 返回the_bit;
}
reg_bit int choose_bit (int, int bit_number_from_elsewhere) {
如果(NEED_TO_SHIFT) {
reg_bit - = bit_number_from_elsewhere;
} 返回reg_bit;
}
unsigned int handle_io_register (unsigned int * r) {
int the_bit_number = choose_bit (5、10); 如果((the_bit_number > 0) & & (the_bit_number < 63)) {
unsigned int the_bit = 1 < < the_bit_number; * r | = the_bit;
} 返回the_bit;
}
注意,不仅很好的例子检查调整带来的负面影响和不允许他们,但也检查位移。没有一位操作完成的转变是否越界。根据计划,也许一个错误消息应该被记录。
观察到的例子
参考 |
描述 |
|
ext4文件系统中的一个意想不到的大值会导致一个overshift条件导致除以零。 |
|
ext4文件系统中的一个意想不到的大值会导致一个overshift条件导致除以零-修复cve - 2009 - 4307。 |
|
内核中的一个overshift允许越界读写导致根收购。 |
|
程序不妥善处理签位left-shifts导致重叠memcpy内存范围错误。 |
|
压缩函数不执行一个签署了一个负整数的左移。 |
|
一些内核处理不当对32位数字的变化在一个64位的寄存器。 |
|
腻子有一个错误的值导致overshift转变的趋势。 |
|
领导司机overshifts在一定条件下导致DoS。 |
潜在的缓解措施
实施阶段:
隐式或显式地为负或over-shift值添加检查和缓解。 |
|