在安全沙箱中将哪些Java类/包安全地列入白名单?

时间:2013-07-22 20:48:40

标签: java security scripting whitelist

作为我正在开发的Java游戏的一部分,我计划嵌入Groovy(或可能是其他一些)脚本语言以允许更低级别的mod支持以及对话和任务文件等方式在游戏中产生效果世界。然而,我的目的和潜在的mod作者的目的可能会有所不同,如果可能的话,我希望避免删除那些不危险的语言特征。

虽然我的具体需求当然会因公共规范而异,但我仍然很好奇是否有任何普遍认可的白名单(无论多么简短)的java包和类可以被访问而对用户没有重大风险

3 个答案:

答案 0 :(得分:4)

  

我很好奇是否有任何普遍认同的白名单(无论多么短)的java包和类,可以在不对用户造成重大风险的情况下进行访问。

是的,有白名单,但我不知道“他们是如何”普遍同意的。社区共识是审查白名单的一种方式,但您也可以查看列表创建者的体验,看看他们的过程是否有意义。


Joe-E项目提出了Java的“驯服”,其中一个部分是按类/方法/字段列出的核心库的白名单。例如,对于StringBuilderStringBuilder.safej

# Manually verified.
class("java.lang.StringBuilder",
  static(constructor("StringBuilder()"),
    constructor("StringBuilder(CharSequence)"),
...
    method(suppress, "insert(int, Object)", comment("calls toString on arbitrary object")),

虽然Runtime.safej

# auto-generated safej: default deny everything
class("java.lang.Runtime",
  static(method(suppress, "getRuntime()", comment("default deny")),
    method(suppress, "runFinalizersOnExit(boolean)", comment("default deny"))),
    ...

要了解驯服,请参阅Joe-E paper说明:

  

4.2.1驯服Java类库

     

Java库定义了许多有侧面的静态方法   对外界的影响,以及许多建设者   创建允许类似效果的对象。这是Java中环境权限的主要来源。例如,文件   有一个构造函数,它将获取一个字符串并返回一个对象   用该名称表示文件。结果对象   可用于读取,写入或删除命名文件。没有Java安全管理器的显式访问控制或   在操作系统中,这允许任何Java代码完全控制文件系统。在Joe-E中,我们希望确保这一点   如果文件的功能,代码只能访问文件   (或超级目录)在该代码的动态范围内。

     

因此,我们不得允许上述文件   Joe-E全球范围内的构造函数。   我们定义了仅包含的Java库的子集   那些兼容的构造函数,方法和字段   原则是必须通过a授予所有特权   能力。我们将此活动称为驯服,因为它变成了一个   将不守规矩的类库转换为功能安全的子集。 JoeE veri fi er允许Joe-E程序仅提及类,   此驯服子集中的构造函数,方法和字段。如果   源代码提到了这个子集之外的任何东西,   Joe-E veri fi er将此视为错误。

     

Taming有助于消除环境权限,因为它确保不提供提供环境权限的库方法   可以访问Joe-E程序。我们也使用驯化来揭露   只提供提供功能规则的Java库的子集。

答案 1 :(得分:1)

我怀疑你会发现,不是从通用编程语言开始,而是想弄清楚如何让人们访问它并使其安全,从另一个方面来说更安全。

我的方法是从特定于域的语言开始,并让它访问沙箱 - 您希望并且乐于让modder影响的程序环境的各个方面。

答案 2 :(得分:0)

我会尝试模拟Java applet沙箱模型。如果沙箱足够安全,可以在我的电脑上从互联网上运行任意代码,那么它应该对您的用户脚本足够安全。好吧,您可能不希望用户脚本弹出某个GUI窗口,因此您需要限制权限而不是applet沙箱。