gpt4 book ai didi

c - 如何防止恶意函数访问不希望访问的堆内存?

转载 作者:太空宇宙 更新时间:2023-11-03 23:21:39 25 4
gpt4 key购买 nike

对于给定的进程,堆空间由所有函数共享,这可能会导致一些安全问题。例如,在下面的代码中,函数 main() 期望函数 foo() 仅访问分配给 p 的 1024 字节.但是函数 foo() 如果是恶意的,可以访问超出该范围的内存。

防止这种情况发生的方法之一是限制 foo() 仅访问分配给 p 的 1024 字节。有必要这样做吗?如果是,我们如何实现此功能,或者是否有任何其他方法可以实现此目标?

void foo(char *p){
printf("value of (p + 2048) is %x\n", *(p + 2048));
}

void main(void){
size_t size = 1024;
char *p = malloc(size);

foo(p);
}

最佳答案

不,没有办法限制 foo() 只访问为其分配的 1024 字节。恶意函数总是可以尝试访问为其分配的缓冲区。它可能造成的一些损害(例如通过使主服务崩溃而导致的拒绝服务攻击)可以通过确保 foo() 作为具有有限权限的用户在单独的进程中调用来限制(请参阅POLA ).

但是,限制仅访问有限数量的缓冲区通常通过以下措施实现,我们假设 foo() 已准备好与其调用者合作。如果 foo() 是故意造成伤害,那么这些措施毫无意义。

  1. 传递大小:将分配的缓冲区的大小传递给函数 foo()
  2. 仔细编写代码:仔细编写函数 foo(),使其遵守传递给它的已分配缓冲区的大小,并且永远不会访问超出此已分配缓冲区的内存。
  3. 仅链接到可信代码:如果 foo() 属于第三方代码,请确保第三方代码是可信的。

例如,

void foo(char *p, size_t size){
/* printf("value of (p + 2048) is %x\n", *(p + 2048)); */
/* Ensure that this function does not access memory only between
p[0] and p[size - 1], inclusive. */
}

void main(void){
size_t size = 1024;
char *p = malloc(size);

foo(p, size);
}

函数 foo() 可能有恶意行为只有两种情况。

  1. 函数 foo() 依赖于外部输入来决定要访问的内存位置,并且外部输入可以以某种方式导致 foo() 访问超出 的内存p[大小 - 1]。这是 buffer overflow并且需要通过输入验证来避免(仔细编码;参见上面的第 2 点)。
  2. foo() 函数来自您不信任的另一个库。无论如何,使用您不信任的库是一个坏主意。该库可以做比缓冲区溢出更糟糕的事情。因此,在使用它之前,必须确保该库是好的并且运行良好。绝不能链接到不受信任的库(仅链接到受信任的代码;参见上面的第 3 点)。

关于c - 如何防止恶意函数访问不希望访问的堆内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37957171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com