【问题标题】:How to run Untrusted, Third-party code safely?如何安全地运行不受信任的第三方代码?
【发布时间】:2019-12-14 17:44:22
【问题描述】:

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

这是我的应用程序的工作原理:

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

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

  3. 服务器运行 .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


【解决方案1】:

好吧,如果您想完全控制代码的运行方式,则必须构建自己的编译器,但如果您只想安全地运行一段代码 - 有很多 API 愿意做你的工作,免费和付费,所以你不必担心安全和所有这些东西。

我最终使用了这个非常棒的 AP​​I - https://ce.judge0.com

优势:

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

弱点:

  1. 没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多