Xy *_*Luo 5 c pointers heap-memory
我试图跟踪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
Run Code Online (Sandbox Code Playgroud)
只是想知道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;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
5
66
Run Code Online (Sandbox Code Playgroud)
(我检查ptr,并new_ptr在S2E:http://s2e.systems/这两个指针实际上指向同一个地址释放PTR后,同一地址分配给new_ptr.)
从上面的输出,似乎使用ptr2给出相同的输出new_ptr.
当我编写我的解决方案来检测UAF错误时,我会记录指针的信息.指针的值存储为,uint64_t而布尔类型flag用于声明指针是否处于活动状态.
因此,我猜一个问题发生在new_ptr并且ptr指向同一个地址因为一旦malloc()被称为flagfor new_ptr将转向true.之后,当我使用时ptr,我无法检测到此UAF错误,因为此地址标记为活动.
提前致谢!
如果不解引用指针aliasA,这是否构成“use after free”取决于“use after free”的定义。例如,CWE-416不讨论仅使用指针值,而是讨论取消引用它,即使用已释放的对象。
然而,C 标准表示,即使使用指针值也具有未定义的行为(附录 J.2):
在以下情况下,该行为是未定义的:
[...]
- 使用指向通过调用 free 或 realloc 函数释放的空间的指针值 (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");
}
Run Code Online (Sandbox Code Playgroud)
那里的比较没有意义,编译器可以自由地进行任何它喜欢的优化,因为aliasA不需要再包含有效值。编译器甚至可以设置一个陷阱aliasA,使程序在if带有诊断消息的语句处中止,这是完全可以的。或者,即使它们被赋予了不同的内存地址,它们似乎也指向相同的地址,反之亦然。