C# 如何安全地运行不受信任的第三方代码?
伙伴们。我正在开发一个ASP.NET MVC应用程序,如Hackerrank/Leetcode等。它提供了一组问题,用户必须在自己的机器上解决这些问题,然后提交源代码。应用程序将支持C++、java、C++和Pascal的解决方案。一切都很好,直到我意识到没有安全措施 以下是我的应用程序的工作原理:C# 如何安全地运行不受信任的第三方代码?,c#,asp.net,.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 4,伙伴们。我正在开发一个ASP.NET MVC应用程序,如Hackerrank/Leetcode等。它提供了一组问题,用户必须在自己的机器上解决这些问题,然后提交源代码。应用程序将支持C++、java、C++和Pascal的解决方案。一切都很好,直到我意识到没有安全措施 以下是我的应用程序的工作原理: 用户向服务器提交源代码(program.cs、main.cpp等) 服务器编译代码。如果在中创建了一个可执行文件,应用程序会认为“一切正常,我们可以运行这个程序。exe/main.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);
那不好。我不会运行你。”
或者创造一个封闭的环境,对他说“你想做什么就做什么,你不能破坏任何东西。”
请给我一些关于如何摆脱这个问题的提示,一些文档,一些示例,一些代码,不管你得到什么都欢迎好吧,如果你想完全控制代码的运行方式,你必须构建自己的编译器,但是,如果你只想安全地运行一段代码,那么有很多API愿意为你工作,无论是免费的还是付费的,所以你不必担心安全性和所有这些问题 我最终使用了这个绝对惊人的API- 优势:
简单的回答是——你不能(轻易地)。对用户权限的某种限制,或者沙箱,或者旋转独立的机器,可以减少爆炸半径。但是,如果你让别人的代码在你的机器上运行,那么他们可以做该帐户可以做的任何事情。可能是值得一读的。使用AWSλ是一种选择吗?作为一种选择,考虑在DOCKER容器内运行运行的解决方案。对于一个小型应用程序,每次提交解决方案时,它仍然会为构建映像带来很大的开销,因此我打赌这个解决方案不是最好的,静态分析可能会给出更好的结果。你所说的“统计分析”是什么意思?我想创建一个过滤器,它将遍历源代码并分析每个单词,如果存在诸如“Directory.Delete”或“Process.Start();”之类的可疑内容,则不要运行.exe,但这太简单了。白色或黑色的代码模式列表是不够的,您将需要沙箱方法来限制可执行文件的实际访问权限。