2011-03-01 69 views
7

我正忙着构建在线C#解释器,有点像Codepad。现在有明显的安全问题:在线c#解释器安全问题

  • 无限循环
  • System.Diagnostics.Process.Start
  • 差不多整个System.IO命名空间

我的C#的知识是不完全无关紧要,但我确信有很多知道更多的东西,加上我没有想到的东西。你会注意什么?

一些精度,我打算在使用Mono的小型Linux VPS上运行这个精度。

+0

我知道这个问题的性质可能不是很StackExchange十岁上下,所以我想我会接受最完整的答案。 – 2011-03-01 23:32:38

+0

它是否与Java具有基本相同的安全机制? – 2011-03-01 23:50:33

+0

你完成了你的翻译? – Shimmy 2011-12-22 10:58:17

回答

4

使用Mono的Compiler as service功能。它可以编译为兼容Silverlight的DLL(客户端配置文件),并且has been已经可以,您可以checkout。这应该解决您对IO的一些担忧。

+0

+1:这听起来像是要走的路,因为微软已经完成了在DLL本身内定义安全风险的工作。之后,您只需关注误用问题(例如,使用您的服务进行DOS攻击的用户)。 – StriplingWarrior 2011-03-01 23:56:54

+0

这不需要客户端安装Silverlight吗? – DotnetDude 2011-03-02 15:42:26

+0

@DotNetDude:在Runcs示例中,silvelight是必需的 - 但如果您在服务器上运行Mono.CSharp DLL,则它只是需要安装.NET的服务器。 (客户端配置文件只需要.NET,而不是silverlight)。 – 2011-03-03 08:35:32

1

由于你可以从GetType()去Assembly几乎任何你想要的东西,所以想到了思考。

+1

IMO,反射正是你想要避免的,因为它允许你执行(可能)任意代码,而不是你想为了安全目的而强制执行的受限子集。 – 2011-03-01 23:52:29

1

其实用户代码可以做任何事情。这将是很难处理的特殊情况。在我看来,最好的办法是:

a)create sandbox appdomain只有执行权限。这确保了许多事情,如无法混淆文件系统或调用本地库。

b)创建新的流程并在其中启动您的appdomain。

然后监控内存和CPU消耗的过程。如果出现任何问题 - 杀死它。请注意,这是您可以杀死的进程,而不是appdomain。使用appdomain你可以尝试卸载它,但是如果恶意代码在finally子句中运行,那么它将无法工作。

还有一些(知我)问题与此:

  • 小心你把用户编译的程序集。实际上,即使是权限最小的appdomain用户代码也能够加载处于同一目录中的程序集并执行它们。
  • 我提到你应该监视进程严密。在无限循环中产生线程的代码(在finally子句中运行),其中每个线程执行相同的操作都会非常快地捕获内存(在我的观察中)。如果攻击者决定用这样的代码进行攻击 - 谁知道会发生什么:)也许一种利用这种方式的方法是以低优先级启动用户进程,以便监督线程有机会在加载的系统中进行适当的监视。

无论如何总有一种风险。我当时也在想这个想法,下面是当前结果:rundotnet

1

查看此链接,您将能够了解在线C#解释器的一些内容,尝试一些内容并阅读输出异常以了解如何他们做到了。

http://rextester.com/NWDF62346