这种不安全的方式使用malloc吗?

时间:2011-12-06 14:27:00

标签: c security

如果x和y参数从不受信任的用户接收数据,这段代码会造成一些安全威胁吗?

char *p = malloc(x * y); 
while (x > 0) 
  while (y > 0) 
    *p++ = 0; 

更新

大多数人似乎评论说它是一个无限循环,并且当它写入分配的内存时,这个代码段最终会使程序崩溃。 然而除了那个问题。是不是可能有一些关于如何使用malloc的问题?例如。堆溢出,因为没有上限检查x和y?

7 个答案:

答案 0 :(得分:6)

如果x和y是正数,你将无限地写入内存直到程序缩小,这是我所期望的。不是个好主意。

答案 1 :(得分:2)

从TRUSTED用户接收该代码将是一个问题。

xy永远不会改变。假设其中一个是正数,则while循环将始终评估为相同的东西,并导致无限循环。如果两者都是正数,那么在程序崩溃之前,你将继续写入内存。

不是一段好的代码。

答案 2 :(得分:2)

如果yx大于0,则会导致未定义的行为,因为您输入无限循环并将​​0分配给指向内存的指针不拥有。

答案 3 :(得分:1)

是的,这将写入未分配的内存,程序将分段。

如果要清空内存块,请使用memset,原型如下所示:

void * memset(void *dest, int c, size_t count);

所以代码看起来像这样:

char *p = malloc(x * y);
memset(p, 0, x * y);

答案 4 :(得分:0)

我没有看到安全威胁。要么得到大于0的值,这将使您进入无限循环并覆盖进程的内存,直到出现分段错误并且您的进程终止。如果其中一个参数为零,则调用malloc(0),这可能会导致内存泄漏。

无论如何,代码完全是疯了,所以我认为你的问题是学术性的。

答案 5 :(得分:0)

正如其他人指出的那样,您发布的代码包含无限循环。您可能打算执行以下操作:

char *p = malloc( sizeof(x) * x * y ); 

if( p != NULL ) {
  memset( p, 0, sizeof(x) * x * y );
} else {
  // error allocating memory, handle it somehow
}

答案 6 :(得分:0)

是的,有一个无限循环,在你的while循环中可能存在堆栈溢出。 还不确定它将如何构成安全威胁,但它对系统构成潜在威胁,因为它可能导致内存问题。 没有检查“x”和“y”的边界,因此用户可以发送大量数据,您可能会收到分段错误错误。 malloc返回的地址丢失。 此外,编码风格(* p ++)使人们感到困惑,因此难以维护这样的代码。 这段代码肯定会在现实世界中失败。