Pav*_*ara 15 security jvm scala runtime robocode
我是Robocode引擎的开发者.我们想使Robocode多语言和Scala似乎是很好的匹配.我们这里有Scala插件原型.
问题: 因为用户是有创造力的程序员,他们可能会尝试以不同的方式赢得战斗.还可以从在线数据库下载机器人,任何人都可以上传机器人.因此,安全性的差距可能会导致用户计算机的安全漏洞.用Java编写的机器人在受限制的沙箱中运行.几乎所有东西都被禁止[网络,GUI,磁盘(有限),线程(有限),类加载器和反射].沙箱类似于浏览器小程序.我们使用SecurityManager,每个机器人自定义ClassLoader 等...
有两种方法可以在Robocode中托管Scala运行时:
1)将其与机器人一起装入沙箱内.我们非常安全,首选解决方案.但它会损害Scala运行时功能,因为运行时使用反射.也许在运行时生成类?使用线程进行一些内部清理?访问JVM /内部?(我不想限制语言的能力)
2)使用Scala运行时作为可信代码,在框外,安全性与JDK处于同一级别.(恶意)机器人的可见性.Scala运行时API是安全的吗?他们有保安人员的方法吗?有安全模式吗?Scala运行时是否有任何单例,可能会滥用机器人之间的通信?任何可以模拟线程的concurency/threadpool/messaging?(Scala运行时是否有任何安全审核?)
3)介于两者之间,某些运行时类和一些运行类.机器人/哪些类/包必须是可见的?它们只是私有实现?(这似乎是未来的解决方案)
问题: 是否有可能枚举和隔离必须在其余部分中运行在受信任范围内的运行时部分?具体的包和类?还是更好的主意?
我正在寻找具体的答案,这将导致安全的解决方案.随意的想法欢迎,但没有奖励.scala电子邮件小组正在进行讨论.还没有具体的答案.
我认为#1 是你最好的选择,即使这是一个不断变化的目标。正如邮件列表中提到的,结构类型使用反射。我认为结构类型在标准库中并不常见,但我认为没有人跟踪它们的位置。
总有可能有其他功能在幕后使用反射。例如,有一段时间,在 2.8 分支中,一些数组功能使用了反射。我认为在基准测试之后这已经改变了,但是总是有可能出现一些问题,有人说“啊哈!我将使用反射来解决这个问题。”
Scala 标准库充满了单例。它们中的大多数都是不可变的,但我知道 Actor 库中的 Scheduler 对象可能会被滥用于通信,因为它本质上是实际调度程序的代理,因此您可以将自己的自定义调度程序插入其中。
目前,我认为 Scala 不需要使用自定义类加载器,并且它的所有类都是在编译时而不是运行时生成的,但话又说回来,这可能是一个移动目标。Scala 生成大量类文件,并且总是有人谈论让它在需要时而不是在编译时在运行时生成其中一些文件。
因此,简而言之,我认为不可能(在合理的努力限制内)枚举和隔离可以(并且应该)信任的 Scala 部分。
归档时间: |
|
查看次数: |
1621 次 |
最近记录: |