【问题标题】:Security of scala runtimescala 运行时的安全性
【发布时间】:2010-02-14 22:05:49
【问题描述】:

我是Robocode 引擎的开发人员。我们想做 Robocode 多语言和 Scala 似乎很匹配。我们有 Scala 插件prototype here

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

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

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

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

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

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

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

【问题讨论】:

    标签: security scala jvm runtime robocode


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 关于反射和数组的线程链接:thread.gmane.org/gmane.comp.lang.scala.internals/2590
    • 这里有几个优点。关于移动目标,你说得对,我很高兴锁定单一版本的 scala。关于“啊哈!我将使用反射来解决这个问题。”那是犯罪行为。我不希望看到我的用户/新手在我们的支持小组中抱怨我们不拥有的损坏的运行时。我不清楚运行时是否至少会将异常包装/转换为一致的东西。对于此类操作,它至少是 AccessController.doPrivileged() 吗?
    • 您必须考虑市场 Scala 目标。反射在 Java Web 框架和基于 JVM 的动态语言中几乎无处不在。与运行时字节码操作相比,它相当小,这也很常见。还要记住,反射的使用不一定限于运行时或库本身,而是编译器只是在普通用户代码中发出调用。我在 Scala 源代码中找不到 AccessController 的单个实例,所以我认为它根本不知道这些事情。
    • 埃里克,非常感谢您抽出宝贵时间。我对我的结论感到难过,即 scala 不适合机器人代码。 2) 或 3) 是不可能的。 1)会给用户带来如此多的非确定性和意想不到的痛苦,我宁愿根本不提供它。我确实理解投资安全性没有充分的商业理由。除了浏览器小程序中的 scala 吗?还是那已经是死技术了?干杯!
    • Scala 在小程序(尽管 jar 可能需要一些时间来加载 ;-) 和 Google AppEngine 中工作。我认为在很大程度上是您对反射的禁令阻碍了 Scala。 Actor 也不起作用,因为它们会产生线程,但人们不能使用 Actor。
    【解决方案2】:

    正如您提到的所有可能使用反射的其他 J* 语言实现,只要反射不是游戏的一部分,所有这些语言都将被禁止。 我想这将是 JVM 的问题,没有办法划分反射 API 的范围,这样您就可以对可以在其中反射的部分代码进行“沙盒”处理。

    【讨论】:

    • 是的,我认为你的方向与上面的 GAE 评论类似。
    • 我以为我在写评论,但实际上我没有权利评论别人发布的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-03-25
    • 2013-05-22
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多