在服务器上测试 C++ 算法

信息安全 远程服务器
2021-08-25 16:39:56

我正在制作一个 C++ 测试服务器,并且想要编译的程序会:

  • 无权读取或写入文件。
  • 无权通过套接字打开或连接。
  • 无法使用任何非标准 C++(例如系统)库
  • 可以完全访问 CPU(没有或很少有性能损失)。
  • RAM 内存有限。
  • 运行时间有限。

我希望我没有忘记任何事情,但我想做的是制作一个正常的测试系统,而不会被编译的程序入侵。

任何提示,链接,什么?任何编译器选项?

以下是当前系统的样子:

操作系统:Ubuntu

编译器:GCC

编辑:

您知道是否可以在编译器中禁用所有系统库?这会有很大帮助:)

编辑(再次):

这是我想出的:我制作了一个程序,它自己分叉,父进程跟踪被测试者的时间限制(虽然你仍然可以使用一些系统命令)并且子进程限制它自己(资源, seccomp) 并运行不受信任的软件。

4个回答

您可能对seccomp感兴趣。这是 Linux 运行一个只有非常有限的一组可用系统调用的进程的特性;内核在任何尝试执行任何其他调用时都会终止该进程。从概念上讲,这是进行这种隔离的正确方法:使用允许的系统调用的(小)白名单,而不是不允许的调用的黑名单。Seccomp 可以被 chromium(谷歌浏览器的开源端)使用,所以很有可能它会暂时保持支持。

维基百科页面有一些链接,包括seccomp-nurse,这可能是您正在寻找的软件。

对于 CPU 时间和内存消耗,Linux 内核可以对每个进程实施硬限制;setrlimit

你所描述的听起来很像谷歌的NaClGoogle 将其设计为在 Web 浏览器中运行本机 x86 代码的安全方式,但他们有一个无需浏览器即可独立运行的示例。它们包括一个输出 NaCl-x86 而不是标准 x86 的 GCC 编译器。

您可能应该在虚拟机中运行该程序,如果您不想为 VMWare 付费 ,则可能使用Xen创建。

这是我发现的另一种选择。终端命令gksu可以选择以其他用户身份执行命令:

--user <用户>,-u <用户>

作为指定用户调用。

我认为这可能会创建某种沙箱。

PS将此作为新答案,因为它是可能的解决方案之一,值得单独评论。