编译之前的Sandbox Java代码?

时间:2013-12-25 04:10:32

标签: java security

如果有一个系统客户端编写Java代码(* .java文件),并将它们提交给以Java运行的服务器,那么如何才能使提交的代码不做恶意和恶意的事情呢?

更深入一点:客户端会编写纯文本Java代码(他们的类),代码将被发送到服务器。在服务器上,将检查代码以确保它只允许执行操作。如果它通过测试,它将被编译成.class文件,然后在其中加载Java的类加载器。最后,使用Reflection,然后可以调用方法并传递参数。

我想我可以看到如何做到这一点,但我如何确保编译的代码是“安全的”?例如,我不希望它以任何方式生成线程,执行文件IO或与其运行的系统交互。我以为我可以扫描输入文件以进行导入,如果它们不在白名单上,则拒绝该文件。最重要的是,我想如果我确实想要限制一些东西,比如说线程的数量,我可以允许导入一个跟踪每个用户的线程的代理类。

那会有用吗,或者有没有办法?

5 个答案:

答案 0 :(得分:3)

你要做的就是与那些选择做恶意事情的人进行永无止境的战斗。因此,我建议您查看此页面,了解如何对代码进行沙盒化。

http://securesoftwaredev.com/2012/11/12/sandboxing-java-code/

总结

  • 默认情况下,Java在没有SecurityManager的情况下运行,因此您应该添加 应用程序的代码以启用一个:

    System.setSecurityManager(new SecurityManager());
    
  • permission表示对系统资源的访问。

  • 使用代码签名

要在沙箱中组装碎片:

  1. 安装SecurityManager
  2. 签署应用程序罐子
  3. 授予我们AllPermission
  4. 签署的所有代码
  5. 在代码可能调用的地方添加权限检查
  6. doPrivileged()
  7. 中进行权限检查后运行代码

答案 1 :(得分:1)

Java有一些沙盒机制,但那些安全跟踪记录很差,许多人建议完全关闭浏览器中的Java。

您可以尝试在其自己的虚拟操作系统中使用较少的权限沙盒化VM。

或者,您可以要求代码以类似的语言运行 Joe-E旨在允许Java程序执行不受信任的代码。

  

Joe-E是Java 的子集,可以更轻松地构建和实现具有强安全属性的程序,可以在安全审查期间对其进行检查。它使程序员能够将最小特权原则应用于他们的程序;实现无法绕过的特定于应用程序的参考监视器;引入和使用特定于域的安全抽象; 安全地执行不受信任的代码并与之交互;并构建安全,可扩展的系统。 Joe-E演示了如何在保留主流面向对象语言的特性和感觉的同时实现对象能力语言的强大安全属性。

Joe-E的设计人员不得不脱离标准Java的程度应该让您了解防止不受信任的Java代码滥用JVM中可用的ambient authority的任务有多大。


虽然其中一些方法可能会保护您免受滥用权限(特别是如果分层在一起),但没有一种可以阻止denial of service。如果您尝试在代码旁边运行其他人的代码,并且它决定尝试占用所有CPU并且永远不会将其还原,那么您唯一的选择通常就是杀死整个过程。

答案 2 :(得分:1)

白名单是选项。通过黑名单,攻击者会发现一些非黑名单的恶意内容。

SecurityManager通过将权限列入白名单来执行相同的操作。这是要走的路。

代码扫描可以在不同的级别实现相同,但您将重新发明轮子(安全管理员)

答案 3 :(得分:0)

在线评委这样做。有些是开源的。看看你是否可以利用其中任何一个或开发的代码。谷歌搜索,this product是开源的,并说后端是bash,这可以帮助你实现操作系统的安全性。

This judge看起来像一些随机项目可能会或可能不会起作用或实现安全性,但它是Java。保持谷歌搜索。

答案 4 :(得分:0)

我已经调查了这件事。标准Java安全模型适用于可能执行某些危险操作的每个功能,包括检查调用方安全权限的代码以及拒绝沙箱中某人的访问权限。此外,出于显而易见的原因,可以在沙箱代码中禁止JNI。

这种方法的问题当然是有时开发人员忘记将其功能封装在安全检查中。有时他们甚至没有意识到他们创建了一个不安全的API,并期望它的依赖关系反过来拒绝来自沙盒应用程序的访问。

这种方法的另一个问题是在每次API调用中检查安全违规是非常昂贵的。在过去,Java有其他性能问题,这使得这个优先级非常低。例如,JNI调用的成本通常非常昂贵,以至于将其包装在安全代码中可能会降低性能。但是现代JVM:s如此之快,以至于这可能成为市长剩余的瓶颈之一。

我不知道.NET如何在现代版本中实现沙盒。但我知道Mono和Native Client是如何做到的。他们使用预执行代码检查,而不是在框架代码中使用沙盒。然后,他们可以生成一个只使用安全API的类:s传递给JIT。这当然是对类加载的一个小延迟,但最终比Java安全模型更安全,并且作为奖励,从现在运行安全类而没有任何沙盒可以获得性能提升。

可以使用Java库来实现Java中类似的东西,例如ASMBCEL

我在Java安全性中使用代码检查的唯一尝试是Mobile Code Security Through Java Byte-Code Modification,它使用了BECL。