安全 运行 用户代码

Securely running user's code

我希望创建一个 AI 环境,用户可以在其中提交自己的 AI 代码并让他们竞争。语言可以是任何语言,但首选 JavaScript 或 Python 之类的易于学习的语言。

基本上我看到了三个有几个​​变体的选项:

  1. 制作我自己的语言,例如JavaScript 克隆,只有非常基本的功能,如变量、循环、条件、数组等。如果我想正确实现通用语言功能,这是一项 很多 的工作。

    1.1 采用现有语言并将其剥离到核心。只需从 Python 中删除很多功能,直到除了上述内容(变量、条件等)之外什么都没有。还有很多工作,特别是如果我想跟上上游的最新情况(尽管我也可以忽略上游)。

  2. 使用一种语言的内置功能来锁定它。我从 PHP 了解到您可以禁用功能并四处搜索,Python 似乎存在类似的解决方案(有很多警告)。为此,我需要很好地理解所有语言的特性,不要错过任何东西。

    2.1。制作一个拒绝带有危险内容的代码的预处理器(最好是基于白名单的)。类似于选项 1,只是我只需要实现解析器而不是实现所有功能:预处理器必须 理解 语言,这样你就可以拥有名为 "eval" 的变量,但是不调用名为 "eval" 的函数。仍然有很多工作要做,但比选项 1 更易于管理。

    2.2。 运行 非常封闭的环境中的代码。 Chroot,没有不必要的权限......可能在虚拟机或容器中。那种意义上的东西。我必须研究如何实现这一点以及如何让它以安全的方式给我结果,但这似乎是可行的。

  3. 手动通读所有代码。可以在小范围内或与版主合作,但仍然乏味且容易出错(我可能会错过像 if (user.id = 0))这样的东西。

我想象 2.2 的工作方式是这样的:运行 虚拟机(或其他东西)中的两个 AI 并限制它仅与主机通信(没有其他 Internet 或 LAN 访问)。两个 AI 运行 在单独的机器中并通过主机上的 API 运行 相互通信(好吧,通过比赛场地,因此他们看到彼此的位置)。 =12=]

Option 2.2 似乎是最可行的,但也相对 hacky...我让某人的代码在虚拟化或锁定环境中松散,希望这样可以让他们留在里面,同时让他们免费玩 DoS 或爆发环境。再一次,大多数其他选项也好不到哪儿去。


TL;DR: 本质上我的问题是:我如何让人们给我 'logic' 一个人工智能(我认为是使用代码最容易完成)然后 运行 在不影响系统功能的情况下? 必须至少有 2 个 AI 在同一个游戏环境中工作。

这实际上只是一个插件系统,因此研究其他人如何实现插件是一个很好的起点。特别是,我会查看 Chrome 和 Safari 等网络浏览器及其插件系统。

现代插件系统的一个共同主题是进程隔离。理想情况下,您应该 运行 插件在其自己的进程中 space 在沙箱中。在 OS X 中查看 XPC,它是专门为这个问题设计的。在 Linux(或更便携)上,我可能会查看 NaCl(本机客户端)。 JVM 还设计用于提供沙盒,并提供丰富的语言选择。 (也就是说,我个人并不认为 JVM 是一个非常强大的沙箱。它有过安全问题的历史。)

总的来说,我对这类项目的偏好与语言无关API。我最常使用 REST APIs(或 "REST-like")。这允许插件受到高度限制,同时不限制语言选择。我喜欢尽可能使用简单的 HTTP 进行通信,因为它对多种语言有丰富的支持,所以它对插件的限制很小。事实上,根据您的描述,您甚至不必 运行 硬件上的插件(当然也不必在主服务器上)。使插件成为远程客户端消除了许多潜在的问题。

但最终,我认为像您的“2.2”这样的东西是正确的方向。