【问题标题】:Safely execute arbitrary Lua code with only C仅使用 C 安全地执行任意 Lua 代码
【发布时间】:2018-01-12 17:08:42
【问题描述】:

我知道您可以通过使用 Lua 函数 setfenv 将安全事物列入白名单来 safely execute arbitrary code from Lua。但是,如果我通过脚本执行此操作,它不仅不整洁,而且(用户可修改的游戏)一个毫无戒心的用户安装一个 mod 可以在将 mod 安装到文件夹时单击“全部替换”或其他内容,而不考虑它.我敢肯定还有其他方法可以超级容易地绕过它。

总体而言,最安全的安全方法应该是通过直接 C 调用来执行此操作,设置沙盒时不涉及 Lua 代码/字符串。我该怎么做?

【问题讨论】:

    标签: c lua


    【解决方案1】:

    您在 Lua 脚本中编写的任何代码也可以通过 Lua C API 在 C 中执行。但是在 C 中比等效的 Lua 脚本更难遵循。当我想为主机程序提供一些受保护的 Lua 脚本时,我做了一些事情,例如:

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

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

    例如即使是 while 1 do end 仍然会挂起 WOW UI。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      只是不要使用luaL_openlibs。另一种选择是在你的 c 程序中以字符串或字节码的形式存在一些 lua 代码,然后在执行其他任何操作之前执行。

      【讨论】:

        猜你喜欢
        • 2013-08-21
        • 1970-01-01
        • 2011-01-27
        • 2018-09-30
        • 2019-12-29
        • 2011-08-23
        • 2014-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多