我如何代表第三方运行不受信任的代码?

3
我想创建一个基于Java的网站,该网站将执行来自第三方的完全不受信任的代码。这些第三方代码需要能够访问互联网上的网站,但不能尝试对其进行DoS攻击等行为。
我可以选择语言,但如果语言过于冷门,它会损害我正在构建的服务的采用率。
有人可以提供一些指向应该调查的开源工具吗?

JVM如何在仍然允许代码访问Internet的情况下防止DoS攻击?代码要么具有特定的权限,这意味着它将能够执行权限允许的所有操作,要么没有。 - ignis
那个(第三方)代码是开源的吗?如果是的话,我认为你不必考虑它是不受信任的。 - ignis
也许操作系统可以提供一些解决方案。例如在Linux中,可以创建一个虚拟用户,并在其用户空间内运行程序。这可以防止访问用户数据,同时为程序提供一些资源(如互联网连接)。否则,在虚拟机内运行程序(使用不包含任何数据的虚拟硬盘)可能是一种解决方案。但我不熟悉这些技术。 - Willem Van Onsem
1
实际上,Java拥有一个很好的策略机制,允许某些给定的代码访问本地文件系统上的用户数据,同时无法访问互联网。包java.security。 - ignis
没有指定语言:同样适用于Linux:https://dev59.com/questions/MnRA5IYBdhLWcg3w4iF_ - Ciro Santilli OurBigBook.com
5个回答

1

你是否考虑过类似于Google App Engine的东西?他们通过提供一个“沙盒”来为Java应用程序提供访问仅限于Java API的精心限制的子集。你可以查看他们的JRE白名单以获取灵感。(他们还提供其他语言。)

Yahoo App PlatformAmazon Web Services提供类似的功能,但不是针对Java(从您的标签中可以看出,这是您的主要兴趣)。


1
当然,使用Java代码实现这一点的关键是定义一个SecurityManager,然后仔细指定策略。除此之外,您可以在Linux系统上托管并使用chroot监狱,或者更好的选择是在虚拟化系统上使用chroot监狱。
不过,按照定义,您无需担心有人使用您的单个服务器发起DDOS攻击!

1

首先,您需要为应用程序构建一个优秀的监狱或沙盒。虚拟化可以帮助,但即使在客户机中,也有很多操作是您不希望您不信任的代码执行的。

因此,请调查强制访问控制,例如AppArmorSElinuxTOMOYOSMACK。其中任何一种都可以将您的服务器代码锁定为仅允许一部分操作。还有可用的补丁可以将您的应用程序锁定为一组系统调用的子集,这可能值得进一步研究。(由于我已经在AppArmor上工作了近十年,这是我最了解的工具。它也是我认为最适合这项任务的工具,但SMACK的极简主义确实很吸引人。)

你可以在防火墙级别上执行速率限制,以尝试限制代码托管可能引起的外部干扰量。速率限制并不意味着完全阻止,但它能让你有机会在日志中看到明显的恶意行为。


0

我不确定我是否理解了你的问题。但是从我的理解来看,您只需要让用户能够执行代码(在基于Java的网站上,但代码不需要是Java),在这种情况下,您是否考虑让用户仅执行客户端端代码(即JavaScript)?这样他们唯一可能伤害的机器就是他们自己的机器。您可以在此处阅读有关其他网站如何处理恶意代码的更多信息,也可以在此处阅读有关允许用户执行JS的少数危险。


0

等一下,大家。

@sanity 没有必要寻找第三方解决方案,因为 Java 已经一个策略机制,允许不受信任的代码仅访问给定子集的 Java API。请参阅 java.security 包和 SecurityManager。它允许您告诉 JVM,“这个应用程序必须具有访问此内容但不能访问此其他内容的权限”。

但我认为 @sanity 想要授予特定权限以运行不受信任的代码,而不允许其使用该权限进行有害操作...


1
限制库访问并不能防止不受信任的代码分配大量内存或使用大量CPU周期,最终导致服务器崩溃。这不应该是被接受的答案。 - coffee_machine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接