我正在尝试创建一个编程游戏,其中用户提供的程序在战斗模拟中竞争,用作教授和练习编程的工具。(可能是回合制机器人模拟,但就本问题而言,它也可能是国际象棋或跳棋。)实现该游戏的一个主要组成部分是提供一种运行用户生成的机制针对游戏数据进行编码以确定其机器人的动作。
我知道典型的建议是“尽可能不要运行不受信任的代码”,而且我理解它的来源。不过,在我目前的情况下,如果可能的话,这将是我想要制作的应用程序的核心功能。我知道我需要采取一些预防措施来确保用户提供的代码不会造成损坏。据我所知,理想的设置将强制执行:
- 用户代码从 STDIN 读取游戏状态
- 用户代码写入生成的移动到 STDOUT
- 用户代码与主机系统隔离
- 用户代码相互隔离
- 用户代码可以消耗的资源(CPU、内存、磁盘)是有限的
- 用户代码无法访问网络
我的用例似乎并不独特。如果有的话,我想以下任何类型的应用程序都有类似的要求:
- 大多数编程游戏
- 竞技编程在线评委
- “尝试 X 编程语言”
- 游戏AI比赛
然而,我在 Google 上环顾四周,但找不到任何看起来值得信赖的参考实现。大多数上述类型的应用程序都是闭源的,也许是有充分理由的。
鉴于这些要求,我想我需要某种隔离/虚拟化/容器化解决方案,尽管老实说我不确定哪一个会提供必要的保证。
当前针对用户提供的代码进行沙盒处理的最佳实践是什么?有没有人有一些可靠来源的信息或参考资料?