仅使用C安全地执行任意Lua代码

时间:2017-12-31 05:14:21

标签: c lua

我知道您可以使用Lua函数setfenv将安全内容列入白名单safely execute arbitrary code from Lua。但是,如果我通过脚本执行此操作,不仅是不整洁,而且(用户可修改的游戏)安装mod的毫无戒心的用户只需单击"替换所有"或者在将mod安装到文件夹中的时候,没有考虑任何问题。我确信还有其他方法可以超级轻松地绕过它。

总的来说,最安全的安全方法应该是使用直接C调用来完成此操作,在设置沙箱时不涉及Lua代码/字符串。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

您在Lua脚本中编写的任何内容也可以通过Lua C API在C中执行。但是在C语言中比在等效的Lua脚本中使用起来更难。当我想为宿主程序安装一些受保护的Lua脚本时,我做了类似的事情:

  • 将它们放在一个单独的目录中。
  • 将它们加密为只有我的C程序知道私钥的存档。
  • 将它们作为C源代码中的多行字符串嵌入。
  • 将编译过的脚本作为二进制字符串嵌入到我的C源代码中,这样它们就不会像程序的exe的二进制编辑那样容易破解。 (有时我使用脚本的SHA来阻止它们在exe中编辑) ...等等。

您肯定希望使用沙箱保护运行游戏的计算机免受恶意脚本的侵害。例如,没有文件系统访问权限。但请注意,为了保护您的主机程序免受各种形式的恶意脚本的攻击(例如,通过while 1循环挂起游戏的Lua实例线程;或者使用大量内存,复杂的string.match调用),您必须做更复杂的工作并为mod脚本添加更多约束。

E.g。即使是而1结束仍然会挂起WOW UI。

希望有所帮助。

答案 1 :(得分:0)

不要使用luaL_openlibs。另一种选择是在你的c程序中存在一些lua代码作为字符串或字节码,你先执行其他任何操作。