我试图在C中跟踪免费使用的错误,我的问题是,如果我有这样的代码:
A * ptrA = malloc(sizeof(A));
A * aliasA = ptrA;
// do something '
free(ptrA)
// some other code
B * ptrB = malloc(sizeof(B)); // assume this return same pointer as ptrA
//trying to use aliasA here只是想知道aliasA的使用是否是UAF错误?如果是的话,这里出了什么问题?
为了澄清这个问题,我认为最好增加一个小例子:
int main(){
int *ptr = (int *)malloc(4);
*ptr = 5;
int *ptr2 = ptr;
printf("%d\n", *ptr);
free(ptr);
int *new_ptr = malloc(4);
*new_ptr = 66;
printf("%d\n", *ptr2);
return 0;
} 产出如下:
5
66(我在ptr:http://s2e.systems/中检查了S2E和new_ptr,这两个指针实际上指向同一个地址。释放ptr后,相同的地址分配给new_ptr。)
从上面的输出来看,ptr2的使用提供了与new_ptr相同的输出。
当我编写检测UAF错误的解决方案时,我会记录指针的信息。指针的值存储为uint64_t,布尔类型flag用于声明指针是否是活动的。
因此,当new_ptr和ptr指向相同的地址时,我猜会出现一个问题,因为一旦malloc()被调用,flag for new_ptr就会转换true。之后,当我使用ptr时,我无法检测这个UAF错误,因为这个地址是活动的。
提前感谢!
发布于 2017-12-20 09:03:47
如果不取消对指针aliasA的引用,则取决于“免费后使用”的定义,这是否构成“免费后使用”。例如,CWE-416不讨论仅仅使用指针值,而是谈到取消引用它,即使用已释放的对象。
但是,C标准指出,即使使用指针值也有未定义的行为(附录J.2)
- The value of a pointer that refers to space deallocated by a call to the free or realloc function is used (7.22.3).
这是因为指针的值变为
当指针所指向的对象(或刚刚过去的)到达其生命周期的结束时,指针的值将变得不确定。
因此,以下代码具有未定义的行为:
A *ptrA = malloc(sizeof(A));
A *aliasA = ptrA;
free(ptrA);
A *ptrB = malloc(sizeof(A));
if (aliasA == ptrB) { // undefined behaviour, as it might be a trap
printf("We were given the same pointer");
}那里的比较是没有意义的,编译器可以自由地进行优化,因为aliasA不再需要包含有效值了。编译器甚至可以将陷阱设置到aliasA中,这将导致程序在if语句处使用诊断信息中止。或者,即使它们被赋予了不同的内存地址,它们也可能指向相同的地址,反之亦然。
发布于 2017-12-20 06:42:51
这个是一个UAF错误。
实际上,第二个malloc()调用不太可能返回与aliasA相同的地址,因为行为没有得到保证。你不应该依赖它。
你可能会问:我能比较一下他们的地址吗?嗯,不是。比较可能对您有一定的意义,但它是未定义的行为,因为只有当两个指针指向同一数组中的不同元素时,指针相等比较才有效。在这种情况下,两个分配的块肯定不是同一个数组,因此这些指针之间的比较没有很好的定义。
最后,您不应该依赖malloc()返回的地址。您所能做的就是在调用时所请求的内存量内使用它。
在实践中,答是一个很好的追求方式。
发布于 2017-12-20 06:31:42
aliasA是UAF错误,它可能持有与ptrA相同的值,但没有得到保证,建议将释放的指针(包括aliasA和ptrA)重新分配给NULL,以避免悬吊指针。
在您的情况下,最好在NULL之后分配free
free(ptrA);
free(aliasA);
ptrA = NULL;
aliasA = NULL;https://stackoverflow.com/questions/47898934
复制相似问题