作为我正在开发的 java 驱动游戏的一部分,我计划嵌入 Groovy(或可能其他一些)脚本语言,以支持较低级别的 mod 支持,并为诸如对话和任务文件之类的东西在游戏世界中产生影响提供了一种方式。然而,我的目的和潜在模组作者的目的可能会有所不同,如果可能的话,我想避免删除不危险的语言功能。
虽然我的具体需求当然会与公共规范有所不同,但我仍然很好奇是否有任何公认的 Java 包和类白名单(无论多么短),可以在不给用户带来重大风险的情况下访问这些包和类。
不过,我很好奇是否有任何公认的 Java 包和类的白名单(无论多么短),可以在不给用户带来重大风险的情况下访问这些包和类。
是的,有白名单,但我不知道它们是如何“普遍同意”的。社区共识是审查白名单的一种方式,但您也可以查看名单创建者的经验,看看他们的流程是否有意义。
Joe-E 项目提出了对 Java 的“驯服”,其中一部分是按类/方法/字段列出核心库的白名单。例如,对于StringBuilder
,StringBuilder.safej说
# Manually verified.
class("java.lang.StringBuilder",
static(constructor("StringBuilder()"),
constructor("StringBuilder(CharSequence)"),
...
method(suppress, "insert(int, Object)", comment("calls toString on arbitrary object")),
# 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 论文,该论文说:
4.2.1 驯服Java类库
Java 库定义了许多对外部世界有副作用的静态方法,以及许多创建允许类似效果的对象的构造函数。这是 Java 中环境权限的主要来源。例如, File 有一个构造函数,它将接受一个字符串并返回一个表示具有该名称的文件的对象。生成的对象可用于读取、写入或删除命名文件。由于没有 Java 安全管理器或操作系统的显式访问控制,这允许任何 Java 代码完全控制文件系统。在 Joe-E 中,我们希望确保只有在文件(或超级目录)的功能在代码的动态范围内时,代码才能访问该文件。
因此,我们不能在 Joe-E 的全局范围内允许前面提到的 File 构造函数。 我们定义了 Java 库的一个子集,其中仅包括那些与必须通过能力授予所有权限的原则兼容的构造函数、方法和字段。我们称这种活动为驯服,因为它将一个不守规矩的类库变成了一个能力安全的子集。JoeE 验证器允许 Joe-E 程序仅提及这个驯服的子集中的类、构造函数、方法和字段。如果源代码提到了该子集之外的任何内容,Joe-E 验证器会将其标记为错误。
Taming 有助于消除环境权限,因为它确保提供环境权限的库方法不能被 Joe-E 程序访问。我们还使用驯服来仅公开提供能力规则的 Java 库子集。
我怀疑您会发现,与其从通用编程语言开始并弄清楚如何让人们访问它并使其安全,不如换一种方式更安全。
我的方法是从特定领域的语言开始,并让它访问沙箱——你愿意并乐于让修改者影响的程序环境的各个方面。
我会尝试模拟 Java 小程序沙盒模型。如果沙盒足够安全,可以在我的 PC 上运行来自 Internet 的任意代码,那么它对于您的用户脚本应该足够安全。好吧,您可能不希望用户脚本弹出一些 GUI 窗口,因此您需要限制权限而不是 applet 沙箱。