新指针(通过malloc)与其中一个释放/旧指针相同

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错误,因为此地址标记为活动.

提前致谢!

Ant*_*ala 3

如果不解引用指针aliasA,这是否构成“use after free”取决于“use after free”的定义。例如,CWE-416不讨论仅使用指针值,而是讨论取消引用它,即使用已释放的对象。

然而,C 标准表示,即使使用指针值也具有未定义的行为(附录 J.2)

  1. 在以下情况下,该行为是未定义的:

    [...]

    • 使用指向通过调用 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带有诊断消息的语句处中止,这是完全可以的。或者,即使它们被赋予了不同的内存地址,它们似乎也指向相同的地址,反之亦然。