如何运行 不受信任的第三方代码安全?

How to run Untrusted, Third-party code safely?

队友。我正在开发一个 ASP.NET MVC 应用程序,如 Hackerrank / Leetcode 等。它提供了一组问题,用户必须在他的机器上解决这些问题,然后提交源代码。该应用程序将支持 C#、Java、C++ 和 Pascal 中的解决方案。一切都很好,直到我意识到没有安全保障。

我的应用程序是这样工作的:

  1. 用户将他的源代码提交到服务器(program.cs、main.cpp等)

  2. 服务器编译代码。如果创建了可执行文件,应用程序认为“一切正常,我们可以 运行 这个 program.exe / main.exe 家伙”。

  3. 服务器运行s .exe文件N次,其中N是每个问题的测试次数。然后它将 .exe 文件的输出与该特定测试用例的正确输出进行比较。

问题是我找不到安全地 运行 该代码的方法。用户可以提交一些恶意代码。服务器将 100% 运行 它。怎么办?

最初我运行以这种方式下载 .exe

Process p = new Process();
p.StartInfo.FileName = (.exe file path goes here)
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
//Send the imput, get the output
p.WaitForExit();

然后我尝试使用 SandBox。

AppDomain ap = AppDomain.CreateDomain("ProgramEXE",null);
string assemblyPath = (.exe location);
ap.ExecuteAssembly(assemblyPath, Imput);
AppDomain.Unload(ap);

也许我必须给一组权限,但该怎么做?如果程序是恶意程序,如何停止该程序,如何在虚拟机中 运行 之类的?请给我一个提示。

例如,如果不受信任的代码如下所示:

using System;
using System.Threading.Tasks;
using System.Diagnostics;

namespace TurnOffPcProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            //Code that will turn your PC off.

            var psi = new ProcessStartInfo("shutdown", "/s /t 0");
            psi.CreateNoWindow = true;
            psi.UseShellExecute = false;
            Process.Start(psi);
        }
    }
}
 

服务器将 运行 它并自行关闭 (Lol)。

如果您知道如何解决这个问题,我将不胜感激。如果您有关于此的一些文档,请将其发送至此处。

我正在寻找一种方法来限制可执行文件的能力,如何对他说“不-不,你是个坏人,你想要 System.IO.Directory.Delete(@"C:\Temp", true); 那不行。我赢了't 运行 你。“

或者创造一个封闭的环境,对他说“你想做什么就做什么,你不能破坏任何东西。”

请给我一些关于如何解决这个问题的提示,一些文档,一些例子,一些代码,欢迎你得到任何东西 <3。谢谢。

好吧,如果您想完全控制代码 运行 的方式,您必须构建自己的编译器,但如果您只想 运行 安全地处理一段代码 -有很多 API 愿意做你的工作,无论是免费的还是有偿的,所以你不必担心安全和所有其他问题。

我最终使用了这个绝对惊人的 API - https://ce.judge0.com

优势:

  1. 很多支持的语言
  2. 您不必太担心安全问题(有点)
  3. 它 returns 很多关于解决方案的信息(标准输出、时间、内存等)

弱点:

  1. 没有。