首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对web应用程序中不受信任的用户提供的代码进行沙箱处理。

对web应用程序中不受信任的用户提供的代码进行沙箱处理。
EN

Security用户
提问于 2015-07-07 03:14:31
回答 5查看 2.8K关注 0票数 14

我正在尝试创建一个编程游戏,用户提供的程序在战斗模拟中竞争,作为教学和实践编程的工具。(这可能是一种基于转弯的机器人模拟,但就这个问题而言,它也可以是国际象棋或跳棋。)实现这款游戏的一个主要组成部分是提供一种机制,根据游戏数据运行用户生成的代码,以确定其机器人的移动。

我知道典型的建议是,“只要有可能,不要运行不可信的代码”,我明白它从何而来。不过,在我目前的情况下,它将是我想要制作的应用程序的核心功能,如果有可能的话。我知道,我需要采取一些预防措施,以确保用户提供的代码不会造成损害。据我所知,理想的设置是:

  • 用户代码从STDIN读取游戏状态
  • 用户代码将生成的移动写入STDOUT
  • 用户代码与主机系统隔离。
  • 用户代码彼此隔离。
  • 用户代码在它可以消耗的资源(CPU、内存、磁盘)中是有限的。
  • 用户代码无法访问网络

我的用例似乎并不独特。如果有什么需要的话,我可以想象以下任何类型的应用程序都有类似的要求:

  • 大多数编程小游戏
  • 竞争程序在线评判
  • “试试X编程语言”
  • 游戏AI竞赛

然而,我环顾了一下Google,却找不到任何看起来值得信赖的参考实现。大多数以上类型的应用程序都是封闭的,而且可能是有充分理由的。

考虑到这些需求,我想我需要某种隔离/虚拟化/容器化解决方案,尽管我不确定哪一种解决方案能提供必要的保证。

对于用户提供的代码,围绕沙箱的当前最佳实践是什么?是否有人有可信赖来源的信息或参考资料?

EN

回答 5

Security用户

发布于 2015-11-04 17:21:30

回到这个问题上,稍微拖延一下.我假设您收到的代码是由客户机在Javascript解释器中执行的,并且在某个时候提交并解释到服务器上以进行验证。

你有多个问题:

  1. 您希望确保为一个播放器执行的代码不会对另一个播放器产生负面影响。
  2. 您希望确保所执行的代码不允许任何OS级别的权限提升。
  3. 可选的奖励:您想知道客户端代码执行过程中出了什么问题。

消毒输入

第一件事:记住把你从客户那里得到的输入白纸黑字。它们必须有一个已知的长度和格式。使用与平台无关的格式存储所接收的数据,该格式指定所有交换变量的长度和类型。

隔离客户端

然后,您必须确保任何输入的计算都可以导致正确的结果,或者在不影响OS或其他并发计算的情况下导致计算失败。这意味着每个输入都在自己包含的线程/进程中进行处理。您可以让您的Web服务器将输入转发到自定义守护进程,该守护进程为每个客户端生成一个沙箱进程,并将输入提供给它。

您还可以使用类似楔形的东西直接和安全地划分单个服务器。辣椒也是一种选择。

即使您选择使用单个Javascript解释器来运行由不受信任的客户端编写的JS代码,您也将很快拥有适当的工具来保证隔离,因为套套 (一种成功实现JS代码不受干扰的限制机制)正在由W3C标准化。

保护OS

无论采用哪种方式,只需确保运行代码的进程是:

  • 不按root /具有根等效功能运行。
  • 包含在cgroup中,以启用QoS对CPU、内存、磁盘和网络带宽的限制(我认为后者可能需要网络名称空间)
  • 包含在用户命名空间中的

知道计算结果的

是可信赖的

学习一门基于语言的安全课程:-)这通常是一个非常困难的目标,需要对语言和你想要保证的安全属性做很多假设。

祝好运!

票数 2
EN

Security用户

发布于 2016-08-16 15:53:56

由于大多数web应用程序(超过50%)都是用Java构建的,所以我假设您将部署一个基于Java的web应用程序。

您可以从参与的学生那里获取jar文件,并首先对他们进行消毒,以便清除最明显的麻烦来源。

您可以定义一个接口类,在该类上应实例化所有提交的代码。这可能会限制暴露在游戏环境中的一组函数,例如- getGameState()、calculateMove()等。游戏引擎将按照游戏规则为每个参与者执行这些方法。

应该通过使用特定的SecurityManager定义自定义ClassLoader来限制参与者安全域中的操作,从而限制代码。这将使您能够以非常灵活的方式强制执行自定义安全策略。

您可以考虑应用下列访问权限:

  1. 禁用对文件系统的所有访问。
  2. 只允许对它自己的类进行反射访问。
  3. 拒绝诸如load()、loadLibrary()、gc()、setSecurityManager()、console()等危险的系统调用。
  4. 禁用所有网络访问。
  5. 禁用创建新线程。

此外,考虑监视执行的代码的内存分配和处理器使用情况。您可以将其扩展到应用服务器上的任何和所有可用资源。

为了阻止调皮或粗心大意的学生,您可以发布诸如内存消耗和处理器利用率等指标。你也可以通过降低他们的排名来惩罚大量的资源消费者,从而鼓励学生在使用计算资源时更加谨慎和经济。

票数 0
EN

Security用户

发布于 2016-08-21 03:23:14

你考虑过使用JavaScript和Google Caja吗?

Caja编译器是一个使第三方HTML、CSS和JavaScript安全地嵌入到您的网站中的工具。它支持嵌入页面与嵌入式应用程序之间的丰富交互。Caja使用对象-功能安全模型来支持广泛的灵活的安全策略,这样您的网站就可以有效地控制嵌入式第三方代码对用户数据的处理。Compiler支持大多数HTML和CSS以及最近标准化的“严格模式”JavaScript版本的JavaScript --甚至在不支持严格模式的旧浏览器上也是如此。它允许第三方代码在不支持第三方代码的旧浏览器上使用新的JavaScript功能。

票数 0
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/93284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档