ABV.STACK
缓冲区溢出 — 超出边界的局部数组索引
ABV.STACK 是一种过程间检查器,可查找被调用的函数内部的缓冲区溢出。传递给该函数的参数可控制访问缓冲区的哪些元素。如果缓冲区未传递给该函数,但是缓冲区通常为函数内部的局部变量或全局变量时,此检查器将查找缺陷。
漏洞与风险
编入索引中超出边界的局部数组,可能导致应用程序不稳定、精心策划的攻击、数据披露漏洞、代码注入或其他漏洞。
漏洞代码示例
复制
void foobar(int x)
{
int local_array[7];
local_array[x] = 0;
}
int main() {
foobar(15);
return 0;
}
在此示例中,函数 foobar 获得可在索引中用于访问 local_array 的值。Klocwork 为第 8 行生成了一个问题报告,指出参数为 15 的调用方法 foobar 超出有效值 0..7。在本例中,检查器已在函数 foobar 内部的缓冲区中查找到缺陷。
修正代码示例
复制
void foobar(int x)
{
int local_array[7];
// verify the parameter is in range
if (x >= 0 && x < 7)
{
local_array[x] = 0;
}
}
int main() {
foobar(15);
return 0;
}
在该修正代码示例中,参数 X 的值在用于对第 7 行的局部数组 local_array 进行索引前,已在第 5 行进行验证。在其他情况下,对类似代码最好的修正方法可能是在调用函数中检查值。
相关检查器
外部指导
- CERT ARR00-C:了解数组的工作原理
- CERT ARR30-C:不形成或使用超出边界的指针或数组下标
- CERT CTR50-CPP:保证容器索引和迭代器在有效范围内
- CERT ENV01-C:不作出关于环境变量大小的假设
- CWE-119:未正确地将操作限制在内存缓冲区边界内
- CWE-120:复制缓冲区而不检查输入大小(“典型的缓冲区溢出”)
- CWE-121:基于堆栈的缓冲区溢出
- CWE-124:缓冲区欠载(“缓冲区下溢”)
- CWE-125:超出边界的读取
- CWE-787:超出边界的写入
- CWE-788:访问缓冲区末尾之后的内存位置
- CWE-805:访问长度值错误的缓冲区
- CWE-806:使用源缓冲区的大小访问缓冲区
- STIG-ID:APP3590.1 应用程序易受缓冲区溢出影响
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。