我仍然很好奇是否有任何普遍认可的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")),
当 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"))),
...
要了解驯服(taming),请参见
Joe-E 论文,其中写道:
4.2.1 驯服Java类库
Java类库定义了许多具有外部影响的静态方法,以及许多构造函数,这些构造函数创建允许类似效果的对象。这是Java中环境权限的主要来源。例如,File具有一个构造函数,它将接受一个字符串并返回表示该名称文件的对象。生成的对象可用于读取、写入或删除命名文件。在Java安全管理器或操作系统没有明确访问控制的情况下,这允许任何Java代码完全控制文件系统。在Joe-E中,我们希望确保只有在代码的动态范围内存在文件(或超级目录)的能力时,代码才能访问该文件。
因此,在Joe-E的全局范围内,我们不允许使用上述的File构造函数。
我们定义了Java库的子集,其中仅包括与所有特权必须通过能力授予相容的构造函数、方法和字段。我们称这个活动为驯服,因为它将一个难以管理的类库转化为一个能力安全的子集。 JoeE验证器允许Joe-E程序仅提及此被驯服的子集中的类、构造函数、方法和字段。如果源代码提到了此子集之外的任何内容,则Joe-E验证器将其标记为错误。
驯服有助于消除环境权限,因为它确保提供环境权限的库方法不可用于Joe-E程序。我们还使用驯服来仅暴露Java库的那个提供能力纪律的子集。
while(true);
这样简单的事情 - 它会消耗大量的 CPU 周期。 - Andrew Thompson