0

嗨,我尝试使用 calloc 函数连续分配内存。所以很明显系统内存被填满并崩溃了。但最糟糕的是,即使我是标准用户,如果我能够运行该程序,系统就会崩溃。我们如何阻止标准用户发生这种情况。

使用的代码是:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  while(1)
  {
    int *abc;
    abc=(int*)calloc(1000,sizeof(int));
   }
}

可能有一些方法可以阻止这种情况,否则用户可以轻松地获得 ssh 访问权限,然后他可以轻松地使系统崩溃。

4

5 回答 5

3

您可以设置各种内存限制。

ulimit浮现在脑海。这可以由 shell 设置(参见http://unixhelp.ed.ac.uk/CGI/man-cgi?ulimit)。还有一种方法可以在系统范围内设置它们。有一个文件存储了这些,但我不记得它的位置。你需要谷歌它。

于 2013-07-18T19:13:13.150 回答
1

然后,您应该为您的 ssh shell 设置内存限制。这里有一些讨论

于 2013-07-18T18:23:21.413 回答
0

在 unix 领域有一个“nice”的概念,它控制调度优先级......所以当一个进程变得越来越混蛋时,它会得到越来越低的 nice 数字......并且抢先式调度程序会给它更少和更少的时间......其他VM机制可能会杀死它......但它取决于内核/调度程序来防止进程变得过于资源密集......

实际上,我工作过的每个系统都可能会受到您编写的代码类型的影响。

于 2013-07-18T18:41:21.217 回答
0

我不确定您是否从正确的角度看待这个问题。

假设用户对您的系统具有 shell 访问权限,并且该用户具有恶意意图,那么让您的系统崩溃的简单 DoS(拒绝服务)攻击是您最不担心的事情。

话虽如此,unix 环境通常通过限制对受信任用户的 shell 访问来避免这个问题,并且只有在极少数情况下才需要直接限制进程的内存消耗。

于 2013-07-18T18:59:52.533 回答
0

首先,您正在分配内存而不释放任何内存。系统的内存是有限的,这意味着在某些时候,如果操作系统没有首先使您的系统崩溃,您将耗尽内存。
这是首先要解决的问题。至于防止标准用户分配内存,程序无法自动识别用户是否标准用户。
因此,您可能需要定义一个变量/常量,系统在程序运行时将参数传递给该变量/常量。检查常量/变量以确定用户是否标准。如果用户不是,则该片段不会运行。
如何识别标准用户和特权用户因操作系统而异;因此,您可能需要先弄清楚这一点。

希望这能给你一个开始的地方。

于 2013-07-18T18:20:40.433 回答