【发布时间】:2015-07-14 14:57:52
【问题描述】:
我希望创建一个 AI 环境,用户可以在其中提交自己的 AI 代码并让他们参与竞争。语言可以是任何语言,但首选 JavaScript 或 Python 等易于学习的语言。
基本上,我看到三个选项有几个变体:
-
制作我自己的语言,例如一个 JavaScript 克隆,只有非常基本的功能,如变量、循环、条件、数组等。如果我想正确实现通用语言功能,这是一项大量工作。
1.1 采用现有语言并将其剥离到其核心。只需从 Python 中删除许多特性,直到只剩下上述特性(变量、条件等)。仍然有很多工作要做,尤其是如果我想跟上上游(尽管我也可以忽略上游)。
-
使用语言的内置功能将其锁定。我从 PHP 知道您可以禁用函数并四处搜索,Python 似乎存在类似的解决方案(有很多警告)。为此,我需要对所有语言的特性有一个很好的理解,并且不会遗漏任何东西。
2.1。制作一个预处理器,拒绝包含危险内容的代码(最好基于白名单)。与选项 1 类似,除了我只需要实现解析器而不实现所有功能:预处理器必须理解该语言,以便您可以拥有名为“eval”的变量但不调用名为“评估”。仍有大量工作,但比选项 1 更易于管理。
2.2。在非常封闭的环境中运行代码。 Chroot,没有不必要的权限......也许在虚拟机或容器中。某种意义上的东西。我必须研究如何实现这一目标以及如何让它以安全的方式给我结果,但这似乎是可行的。
手动通读所有代码。可以在小范围内或与版主一起使用,但仍然乏味且容易出错(我可能会错过
if (user.id = 0)之类的内容)。
我想象 2.2 的工作方式是这样的:在虚拟机(或其他东西)中运行两个 AI,并将其限制为仅与主机通信(没有其他 Internet 或 LAN 访问)。两个 AI 在单独的机器上运行,并通过在主机上运行的 API 相互通信(嗯,通过比赛场地,因此它们可以看到彼此的位置)。
选项 2.2 似乎是最可行的,但也相对 hacky...我让某人的代码在虚拟化或锁定的环境中松散,希望这样可以让他们继续使用,同时为他们提供免费的 DoS 游戏或突破环境。再说一次,大多数其他选择也好不了多少。
TL;DR: 本质上我的问题是:我如何让人们给我一个 AI 的“逻辑”(我认为使用代码最容易完成)然后运行在不影响系统功能的情况下? 必须至少有 2 个 AI 在同一个比赛场地上工作。
【问题讨论】:
-
在语言层面做这件事太容易出错了。几乎任何语言的特性都可能被滥用。即使是像正则表达式这样看似无害的东西,使用catastrophic backtracking 也会使系统缺乏 CPU 资源。一个容器可以解决很多这样的问题。使用 Docker 之类的东西,您可以指定 CPU 配额,这样就没有一个容器可以让 CPU 饿死。您还可以以具有有限磁盘访问权限的用户身份运行容器。
-
@vcsjones 好建议,请作为答案发布。澄清一下,您的意思是任何基于语言的选项,包括编写我自己的语言?
标签: security eval user-defined-functions