我运行了一种"沙箱"C Ubuntu:它需要一个程序,并运行它安全地根据用户 nobody (及拦截信号,等等)。此外,它指定存储和时间限制,并采取措施的时间和存储使用。
(如果你是好奇,这是一种"网络官"标记的程序上的试验数据)

目前我已经适应了的 safeexec 模块 mooshak.虽然大多数事情的正常工作,存储器的使用似乎是一个问题。(这是非常不准确)

现在我已经试过的建议 在这里, 和解析,从VM /proc/pid/stat, 和现在的精确度问题是固定的。然而,对于程序完成的真的很快不仅给回0.

safeexec 程序似乎运作这样的:

  1. 它的 fork()s
  2. 使用 execv() 在孩子过程的运行所需的程序
  3. 监视器的程序从父母进程,直到孩子过程终止(使用 wait4, 发生返回CPU usage-但是没有记忆吗?)
    因此,它分析 /proc/../stat 孩子的过程(已经取代execv)

所以为什么是虚拟机 /proc/child_pid/stat 有时候,等于0?
这是因为execv()完成的速度太快, /proc/child_pid/stat 只是不是?
如果是这样,是否有某种其他方式获取存储器使用的孩子?
(因为这意味着法官的程序在一个时间限制,我不能买得起的东西与性的惩罚样才)

在此先感谢。

有帮助吗?

解决方案

你能安排用于儿童的过程中使用自己的版本 malloc() et al和有记录的高水准标记忆使用(也许用一个登记与处理程序 atexit())?也许你会用中的ld_preload载存储管理的图书馆。这不会帮助有巨大的静态阵列的或巨大的自动阵列。


Hmm,听起来很有趣。任何方法来跟踪的静态/自动阵列,但?

静态存储器可以分析与'size'的命令或多或少。

自动阵列是一个问题-我不知道你如何能够处理的那些。你的记忆分配代码,可以看多少叠是在使用时它被称为(看看地址的地方变量)。但是,没有任何保证存储器将分配时最大量的当地列在使用,所以它提供了在最佳的一个原措施。

一个其他的想法:也许你可以使用调试器技术 ptrace() 系统调用到控制的儿童过程中,特别是要保持它长到足以能够收集存使用情况的统计数据 /proc/....

其他提示

你可以设置硬资源限制(setrlimit为RLIMIT_AS资源)之前execve().该计划将不能够分配更多的存储量。如果它试图这样做,存分配的呼吁(brk,mmap,mremap)将失败。如果该程序不能处理的内存条件,就会出现段错误,这将反映在出口的状态中返回的wait4.

你可以使用getrusage(2)功能,从sys/资源。h图书馆。
链接: https://linux.die.net/man/2/getrusage
这种功能使用"rusage"的结构,其中包含ru_maxrss的领域,其中存储有关最大的孩子存储器的使用从所有儿童的当前进程。
这一功能还可以执行,从主要进程之后的所有儿童的程序终止。
获取信息的尝试这样的事情:

struct rusage usage;
int a = getrusage(RUSAGE_CHILDREN, &usage);

但是有一个小小的把戏。
如果你想拥有的信息,每个儿童的进程存储器的使用(不仅是最大的一)必须叉()程序的两倍(第一叉可以让你有独立的过程和第一个将这个过程中,你会想到测试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top