【发布时间】:2019-12-14 17:44:22
【问题描述】:
伙伴。我正在开发一个 ASP.NET MVC 应用程序,如 Hackerrank / Leetcode 等。它提供了一组问题,用户必须在他的机器上解决这些问题,然后提交源代码。该应用程序将支持 C#、Java、C++ 和 Pascal 中的解决方案。一切都很好,直到我意识到没有安全措施。
这是我的应用程序的工作原理:
-
用户将他的源代码提交到服务器(program.cs、main.cpp 等)
-
服务器编译代码。如果创建了可执行文件,应用程序会认为“一切正常,我们可以运行这个 program.exe / main.exe guy”。
-
服务器运行 .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();
然后我尝试使用沙盒。
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); 这不行。我不会运行你。”
或者也许是创造一个封闭的环境,对他说“随心所欲,你不能破坏任何东西。”
请给我一些关于如何摆脱这个问题的提示,一些文档,一些示例,一些代码,无论你得到什么都是受欢迎的
【问题讨论】:
-
简短的回答是——你不能(很容易)。对用户权限的某种限制,或沙盒,或旋转独立机器,可以减少爆炸半径。但是如果你让别人的代码在你的机器上运行——那么他们可以做任何该帐户可以做的事情。 quora.com/… 和 dotnetfiddle.uservoice.com/knowledgebase/articles/… 可能值得一读。
-
是否可以选择使用 AWS Lambda?
-
作为一个选项,可以考虑在 docker 容器内运行解决方案。对于小型应用程序,每次提交解决方案时构建图像仍然会产生很大的开销,所以我敢打赌这个解决方案不是最好的,静态分析可能会给出更好的结果。
-
“统计分析”是什么意思?我想创建一个过滤器,该过滤器将遍历源代码并分析每个单词,以及是否存在诸如“Directory.Delete”或“Process.Start();”之类的可疑内容。然后不要运行.exe,但这太原始了。
-
代码模式的白名单或黑名单是不够的,您需要沙盒方法来限制可执行文件的实际访问权限。
标签: c# asp.net .net asp.net-mvc asp.net-mvc-4