在C ++程序中安全地沙盒化用户脚本

时间:2019-03-13 18:46:27

标签: c++ sandbox

我一直在使用C#开发一个个人项目,该项目允许用户执行其他用户编写的脚本并限制该脚本的权限。我可以使用.NET代码访问安全性机制对用户脚本进行沙箱检查,并确保它们仅具有用户要授予它们的那些权限。

从广义上讲,我的安全要求是:

  • 用户应该能够将不受信任的脚本的访问权限限制为仅对文件系统的某些部分进行访问,包括禁止所有文件系统访问
  • 用户应该能够将不受信任的脚本的网络连接限制为仅某些IP地址或主机名,包括禁止所有网络连接
  • 如果用户脚本设法挂起或终止了主机应用程序,那是可以的,但是用户脚本必须不能绕过权限限制(即,拒绝服务是可以的,不可以违反)

我正在考虑尝试在C ++中做类似的事情,作为一种个人练习。显然,即使直接用Lua这样的脚本语言编写用户脚本,直接运行本机代码时,事情也会变得更加复杂。

我能想到的第一种方法是在脚本环境标准库函数中插入我自己的钩子。例如,如果脚本语言是Lua,则不是正常地公开io.open,而是必须公开一个包装器,该包装器在将参数传递给原始实现之前会根据脚本的权限检查参数。

我对这种方法的担心是,它会大大增加负责安全性的我自己的代码量,因此会增加我自己编写的潜在安全性漏洞。换句话说,当使用.NET CAS时,我可以相信Microsoft在沙箱代码方面做得很好,而不必信任我自己的沙箱代码。

我不知道有没有其他选择?

0 个答案:

没有答案