Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译前的沙盒Java代码?_Java_Security - Fatal编程技术网

编译前的沙盒Java代码?

编译前的沙盒Java代码?,java,security,Java,Security,如果有一个系统,客户机在其中编写Java代码(*.Java文件),并将其提交给运行Java的服务器,我如何才能使提交的代码不做不需要的和恶意的事情 更深入一点:客户机将编写纯文本Java代码(它们的类),并将代码发送到服务器。在服务器上,将检查代码以确保它只执行允许的操作。如果它通过了测试,它将被编译成一个.class文件,然后用Java的类加载器加载。最后,使用反射,可以调用方法并传递参数 我想我可以看到如何做到这一点,但如何确保编译的代码是“安全的”?例如,我不希望它产生线程,或执行文件IO

如果有一个系统,客户机在其中编写Java代码(*.Java文件),并将其提交给运行Java的服务器,我如何才能使提交的代码不做不需要的和恶意的事情

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

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


这行得通吗?如果不行,有办法吗?

你要做的是与那些选择做恶意事情的人展开一场永无止境的战斗。因此,我建议您查看本页,了解如何对代码进行沙箱处理

总结

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

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

  • 使用代码签名

要在沙箱中组装部件,请执行以下操作:

  • 安装
    SecurityManager
  • 在应用程序jars上签名
  • 授予我们签署的所有代码
    AllPermission
  • 在代码可能调用的位置添加权限检查
  • doPrivileged()
    块中进行权限检查后运行代码

  • Java有一些沙箱机制,但这些机制的安全性很差,许多人建议完全关闭浏览器中的Java

    您可以尝试在虚拟机自己的虚拟操作系统中以较低的权限对虚拟机进行沙箱处理

    或者,您可以要求代码以如下语言运行 其设计目的是允许Java程序执行不受信任的代码

    Joe-E是Java的一个子集,它使构建和实现具有强大安全属性的程序变得更加容易,这些属性可以在安全审查期间进行检查。它使程序员能够将最小特权原则应用于他们的程序;实施无法绕过的特定于应用程序的参考监控器;介绍和使用特定领域的安全抽象安全地执行不受信任的代码并与之交互;并建立安全、可扩展的系统。Joe-E演示了如何在保持主流面向对象语言的特性和感觉的同时实现对象功能语言的强大安全特性

    Joe-E的设计人员必须在多大程度上背离标准Java,这应该让您了解防止不受信任的Java代码滥用JVM中的可用资源的任务有多大



    虽然这些方法中的一些可能会保护你不被滥用权力(特别是如果把它们放在一起的话),但没有一种能够阻止。如果您试图在运行代码的同时运行其他人的代码,而它决定尝试占用所有CPU,并且永不归还,那么您唯一的选择通常是终止整个进程。

    在线评委会这样做。有些是开源的。看看您是否可以利用其中一个或开发其中一个的代码。谷歌是开源的,并表示后端在bash中,这可能有助于提高操作系统接口的安全性


    看起来像是一些随机的项目,可能有效,也可能无效,或者实现安全性,但它是Java。继续搜索。

    白名单是选项。通过黑名单,攻击者将发现一些未列入黑名单的恶意内容

    SecurityManager也通过将权限列为白名单来执行相同的操作。这就是路


    代码扫描可能在不同的级别实现相同的效果,但您将重新发明轮子(securitymanager)

    我已经研究过这件事。标准Java安全模型适用于每个可能会执行危险操作的函数,包括检查调用方的安全权限并拒绝来自沙箱中某个人的访问的代码。此外,由于明显的原因,沙盒代码中可能不允许使用JNI

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

    这种方法的另一个问题是,在每个API调用中检查安全违规行为的成本相当高。在过去,Java还存在其他性能问题,这使得它的优先级很低。例如,JNI调用的成本通常非常昂贵,以至于用安全代码包装它可能对降低性能几乎没有什么作用。但是现代的JVM:s速度如此之快,这很可能正在成为剩余的瓶颈之一

    我不知道.NET如何在现代版本中实现沙箱。但我知道我知道Mono和Native Client是如何做到的。它们使用执行前代码检查,而不是在框架代码中使用沙箱。然后,他们可以生成一个只使用安全API的类,然后再将其交给JIT。这当然给类加载带来了一点延迟,但最终比Java安全模型更安全,而且作为一个额外的好处,现在运行一个安全的类而不使用任何沙箱可以提高性能

    有一些Java库可以用来在Java中实现类似的东西,比如和

    我唯一的尝试