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

在安全沙箱中哪些Java类/包可以安全地列入白名单?,java,security,scripting,whitelist,Java,Security,Scripting,Whitelist,作为我正在开发的java驱动的游戏的一部分,我计划嵌入Groovy(或其他一些)脚本语言,以支持较低级别的mod,并提供一种方式,使对话和任务文件等内容在游戏世界中产生效果。然而,我的目的和潜在mod作者的目的可能会有所不同,如果可能的话,我希望避免删掉不危险的语言特性 虽然我的具体需求当然会与公共规范有所不同,但我还是很好奇是否有任何普遍认可的白名单(无论多么短)可以访问的java包和类对用户没有重大风险。我怀疑您会发现,与其从通用编程语言开始,研究如何让人们访问并使其安全,不如从另一个角度来

作为我正在开发的java驱动的游戏的一部分,我计划嵌入Groovy(或其他一些)脚本语言,以支持较低级别的mod,并提供一种方式,使对话和任务文件等内容在游戏世界中产生效果。然而,我的目的和潜在mod作者的目的可能会有所不同,如果可能的话,我希望避免删掉不危险的语言特性


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

我怀疑您会发现,与其从通用编程语言开始,研究如何让人们访问并使其安全,不如从另一个角度来安全

我的方法是从一种特定于领域的语言开始,让它访问一个沙箱——你愿意并且乐意让修改者影响你的程序环境的各个方面

尽管如此,我还是很好奇,是否有任何公认的java包和类的白名单(无论多么短)可以在不给用户带来重大风险的情况下访问

是的,有白名单,但我不知道它们是如何“普遍同意”的。社区共识是审查白名单的一种方法,但你也可以看看名单创建者的经验,看看他们的过程是否合理


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

手动验证。 类(“java.lang.StringBuilder”, 静态(构造函数(“StringBuilder()”), 构造函数(“StringBuilder(CharSequence)”, ... 方法(抑制,“插入(int,Object)”,注释(“调用任意对象上的字符串”), 虽然说

#自动生成的safej:默认拒绝一切
类(“java.lang.Runtime”,
静态(方法(抑制“getRuntime()”,注释(“默认拒绝”),
方法(抑制,“runFinalizersOnExit(布尔)”,注释(“默认拒绝”),
...

要了解驯服,请参阅说明:

4.2.1驯服Java类库 Java库定义了许多静态方法,这些方法都有一个 对外部世界的影响,以及对许多建设者的影响 创建允许类似效果的对象。这是Java环境权限的主要来源。例如,文件 具有将接受字符串并返回对象的构造函数 用该名称表示文件。结果对象 可用于读取、写入或删除指定文件。Java安全管理器或 在操作系统中,这允许任何Java代码完全控制文件系统 只有具备文件功能的代码才能访问文件 (或超级目录)在该代码的动态范围内

因此,我们不能允许上述文件 Joe-E全局范围中的构造函数。 我们定义了Java库的一个子集,其中只包含 兼容的构造器、方法和领域 原则是所有特权都必须通过 能力。我们称这种活动为驯服,因为它将 不受约束的类库成为功能安全的子集。JoeE Verifier允许Joe-E程序仅提及类, 此驯服子集中的构造函数、方法和字段。如果 源代码提到了这个子集之外的任何东西, Joe-E确认这是一个错误

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


我会尝试模拟Java小程序沙盒模型。如果沙盒足够安全,可以在我的电脑上从internet运行任意代码,那么对于您的用户脚本来说应该足够安全。嗯,您可能不希望用户脚本弹出一些GUI窗口,所以您需要将权限限制在小程序沙盒之外。

此代码是在计算机上运行的吗(例如你的服务器上,还是客户端机器上?不完全相同,但如果您还没有发现,这个问题也可能对您有用:@andrewhompson代码将在客户端机器上运行,但是问题是,我最终希望添加多人游戏支持和托管修改过的服务器的能力。在这个例子中,我正在寻找允许此类(第三方)改装服务器直接向连接客户端提供所需的改装文件(可能包含脚本)的可行性。这当然需要一个“选择加入”过程,但这也同样会带来安全问题。请参阅“.以及托管改装服务器的能力”然后你甚至需要解释一些简单的事情,比如
while(true)“< /代码> -这将烧毁很多CPU周期…@安德鲁汤普森,这听起来更像是一个担心,如果我是托管服务器正在执行用户提交的代码。正在发生的是,客户端运行我的游戏将执行代码提供的服务器,我不控制。我不认为MODS只是导致放缓是SE。然而,安全风险在于,用户可以简单地结束程序,在下一次启动时删除mod,然后继续前进。用户脚本通常是由天真的开发人员编写的,并且比调用它们的应用程序更容易受到审查,因此,与core codebase.OP希望支持的漏洞相比,更容易出现脚本注入等漏洞同意。OP明智的做法是尝试授予用户脚本足够的权限来完成他们的工作,但不要太多