#include <stdio.h>
#include <stdlib.h>
typedef struct sample {
void* data;
}sample_t;
int main()
{
printf("Hello world!\n");
sample_t* samplestruct = (sample_t*) malloc(sizeof(sample_t));
samplestruct->data = (void*) malloc(10);
free(samplestruct->data);
free(samplestruct);
samplestruct->data = NULL;
samplestruct = NULL;
return 0;
}
在上面的代码中,我同时释放了'samplestruct-> data'和'samplestruct',然后按照释放的顺序将它们都设置为NULL。现在,该代码不会使应用程序崩溃。代码有问题吗?可以以任何方式(我是说从安全角度出发)利用此漏洞吗?
最佳答案
传统上,free
的实现不会更改释放的内存,直到您下次调用malloc
为止。在某些平台上,这仍然是正确的(这可能是您的代码不会崩溃的原因),但是不能也不应该依靠它。即使是这样,在多线程应用程序中,刚刚释放的内存也可能是由free
调用和用法之间的不同线程分配的。通常,攻击者可以使用这种竞争条件使您的指针指向其他数据,可能是由攻击者控制的数据。
不要像问题中的代码那样编写代码。