LOCRET.GLOB
函数在全局变量中返回局部变量的地址
LOCRET.GLOB 检查器查找那些函数通过将局部变量写入到全局变量中来返回局部变量地址的实例。
漏洞与风险
局部变量分配在堆栈上,因此当函数返回指向变量的指针时,它返回的是堆栈地址。该地址在从函数中返回后将无效,因此访问该地址将可能导致无法预料的应用程序行为,通常会导致程序崩溃。
漏洞代码示例
复制
#include <stdlib.h>
int *buf;
void func_GLOB(unsigned n)
{
int aux;
if (n == 1) {
buf = &aux;
} else {
buf = (int *)malloc(n * sizeof(int));
}
}
Klocwork 标记了第 13 行,其中控制离开函数 func_GLOB。这表明已在第 9 行分配给全局变量的局部变量 aux 的地址,可在函数返回后通过该全局变量进行访问。