如何运行 不受信任的第三方代码安全?
How to run Untrusted, Third-party code safely?
队友。我正在开发一个 ASP.NET MVC 应用程序,如 Hackerrank / Leetcode 等。它提供了一组问题,用户必须在他的机器上解决这些问题,然后提交源代码。该应用程序将支持 C#、Java、C++ 和 Pascal 中的解决方案。一切都很好,直到我意识到没有安全保障。
我的应用程序是这样工作的:
用户将他的源代码提交到服务器(program.cs、main.cpp等)
服务器编译代码。如果创建了可执行文件,应用程序认为“一切正常,我们可以 运行 这个 program.exe / main.exe 家伙”。
服务器运行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
优势:
- 很多支持的语言
- 您不必太担心安全问题(有点)
- 它 returns 很多关于解决方案的信息(标准输出、时间、内存等)
弱点:
- 没有。
队友。我正在开发一个 ASP.NET MVC 应用程序,如 Hackerrank / Leetcode 等。它提供了一组问题,用户必须在他的机器上解决这些问题,然后提交源代码。该应用程序将支持 C#、Java、C++ 和 Pascal 中的解决方案。一切都很好,直到我意识到没有安全保障。
我的应用程序是这样工作的:
用户将他的源代码提交到服务器(program.cs、main.cpp等)
服务器编译代码。如果创建了可执行文件,应用程序认为“一切正常,我们可以 运行 这个 program.exe / main.exe 家伙”。
服务器运行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
优势:
- 很多支持的语言
- 您不必太担心安全问题(有点)
- 它 returns 很多关于解决方案的信息(标准输出、时间、内存等)
弱点:
- 没有。