15

我是Robocode引擎的开发人员。我们想让 Robocode 多语言和 Scala 看起来很相配。我们在这里有 Scala 插件原型

问题: 因为用户是有创造力的程序员,他们可能会尝试以不同的方式赢得战斗。机器人也是从在线数据库下载的,任何人都可以上传。因此,安全漏洞可能会导致用户计算机的安全漏洞。用 Java 编写的机器人在受限沙箱中运行。几乎所有东西都被禁止[网络、GUI、磁盘(受限)、线程(受限)、类加载器和反射]。沙盒类似于浏览器小程序。我们使用 SecurityManager、每个机器人的自定义 ClassLoader等...

在 Robocode 中托管 Scala 运行时有两种方法:

1)将其与沙箱内的机器人一起加载。对我们来说非常安全,首选的解决方案。但它会损害 Scala 运行时的能力,因为运行时使用反射。也许在运行时生成类?使用线程做一些内部清理?访问 JVM/内部 ? (我不想限制语言能力)

2) 使用 Scala 运行时作为可信代码,开箱即用,安全性与 JDK 相同。对(恶意)机器人的可见性。Scala 运行时 API 安全吗?他们有保安的方法吗?有安全模式吗?Scala 运行时中是否有任何单例,可以被滥用在机器人之间进行通信?任何可以模拟线程的并发/线程池/消息传递?(Scala 运行时是否有任何安全审计?)

3)介于两者之间,一些运行时类和一些运行时类。哪些类/包必须对机器人可见/哪些只是私有实现?(这似乎是未来的解决方案)

问题: 是否可以枚举和隔离必须在受信任范围内运行的运行时部分与其余部分?具体的包和类?还是更好的主意?

我正在寻找具体的答案,这将导致安全的解决方案。欢迎随意的想法,但没有奖励。scala 电子邮件组正在进行讨论。还没有具体的答案。

4

2 回答 2

3

我认为#1是你最好的选择,即使那是一个移动的目标。正如邮件列表中提到的,结构类型使用反射。我认为结构类型在标准库中并不常见,但我认为没有人会跟踪它们的位置。

也总是有其他功能在幕后使用反射的可能性。例如,有一段时间在 2.8 分支中,一些数组功能正在使用反射。我认为在基准测试之后已经改变了,但是总是有可能有人说“啊哈!我将使用反射来解决这个问题”。

Scala 标准库充满了单例。它们中的大多数是不可变的,但我知道演员库中的调度程序对象可能会被滥用于通信,因为它本质上是实际调度程序的代理,因此您可以将自己的自定义调度程序插入其中。

目前,我认为 Scala 不需要使用自定义类加载器,并且它的所有类都是在编译时而不是运行时生成的,但话又说回来,这可能是一个移动目标。Scala 会生成大量的类文件,并且总是在谈论让它在运行时生成其中的一些文件,而不是在编译时生成它们。

因此,简而言之,我认为不可能(在合理的努力限制范围内)枚举和隔离可以(并且应该)信任的 Scala 部分。

于 2010-02-14T23:20:30.970 回答
0

As you mentioned other J* language implementations which all may make use of reflections, it would be a ban for all those languages as long as reflection is not part of the game. I guess that would be JVM's problem not to have a way to partition the scope of reflection API, such that you could sort of "sandbox" the part of code that could be reflected within.

于 2010-02-25T13:45:19.363 回答