2011-11-26 88 views
4

我正在设计一个系统来加载,处理和支持Java应用程序中的插件。我觉得一个特点是在它可以被部署之前绝对至关重要的是能够建立一个安全的环境,在这个环境中插件被限制在允许的范围内。如何安全地实现Java插件安全性?

我不明白如何以编程方式使用政策文件但不运行在推出-Djava.security.manager参数。所以现在就结束了。

我的下一个想法是覆盖所有我的SecurityManager在谁可以执行他们自己的SecurityManager的子类,地点的限制关心的方法。

的问题,然后大作,只有这样,才能找出谁是问这个权限是通过线程ID检查。所以,我设计了一个系统,所有的插件线程都驻留在PluginThreads线程组中。

这工作......直到一切开始爆炸。问题在于一些被封锁的东西是由Sun的代码执行的内部操作。

所以即使是最基本的操作,如打开一个窗口,因为我的保安经理被拒绝访问Sun的代码会失败。这里使用我的Thread检查方法是没有问题的,因为Sun的代码是在PluginThreads组内执行的。

所以我需要知道的是:

1)是否有可能是一个办法,我可以找出其内的呼叫从使用当前线程到来的背景下?

2)有没有更好的方法来做到这一点,我不知道?

3)如果该方法涉及策略文件,那么如何将它们加载到代码中?

4)是否有你能想到的,以防止太阳内部的Java代码被封锁任何其他方法?

回答

0

您需要使用java.security.AccessController/AccessControlContextSecurityManager。该API支持类型为Object的上下文对象,但实际上您需要使用AccessControlContext。要为用户代码提供正确的权限,请通过SecureClassLoader的子类提供相关的ProtectionDomainURLClassLoader.newInstance是您必须正确使用的合理示例)。

对于GUI应用程序(例如,这包括任何使用java.beans的特定部分的任何内容),您还需要处理AppContext(在Java库的“Sun”实现中)。这不是一个公共API。

线程和线程组不是管理安全性的好方法。不幸的是,这是如何进行隔离的一部分。

+0

是的我注意到线程检查是一个糟糕的处理安全的方式。 AccessControlContext是否不会干扰Sun代码? – bgroenks

+0

@ ghostsoldier23你的意思是“Java库代码不会导致所有acc检查失败?”?它全部拥有所有权限。一般来说,库代码至少需要权限作为使用它的应用程序。通常,这意味着该库具有所有权限,或者将其与应用程序的权限绑定在一起。 –

+0

你是说AppContext是com.sun。*库的一部分吗? “禁止”,“你不能通过”图书馆? ; D – bgroenks

1

SecurityManager是一个可怕的混乱。您应该考虑要求将插件写入Java的一个子集中,以便您可以对其可以执行的操作进行合理的推理,而不是反复授予更多可滥用的权限。

Joe-E提供可分解的安全性。From http://lambda-the-ultimate.org/node/3830

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

+0

我相信Joe-E目前只能用于Java源代码,而不是Java字节码。所以你必须分配插件作为源。我不完全确定Joe-E的状态。但是,非常粗略地说,Java2应该如何完成。 –

+1

@ TomHawtin-tackline,我相信你是对的。 [** 6 Implementation **](http://www.cs.berkeley.edu/~daw/papers/joe-e-ndss10.pdf)说:“我们对Java源代码执行检查,而不是在Java类上执行 因为Java运行时将字节码 仅限于有限的一组验证检查,允许字节码 执行Java程序不能执行的一些操作。“这使他们可以访问像内部类特权这样的语言小说,并让他们忽略围绕受保护区域的主要字节码重构,并让他们跳过关于“javac”不太可能产生的字节码的推理。 –