【问题标题】:Lua why is 'require' unsafe to use in a sandbox environment?Lua为什么在沙盒环境中使用'require'不安全?
【发布时间】:2016-11-30 11:39:36
【问题描述】:

通过此页面:http://lua-users.org/wiki/SandBoxes require 被标记为不安全,这是因为:

  • 修改全局变量(例如 package.loaded)
  • 提供对沙盒外环境的访问权限
  • 并访问文件系统

几乎所有纯 Lua 库都使用“require”,因此不安全是一个巨大的痛苦,因为您不能使用任何纯 Lua 库。我不明白这些不安全的原因。它在库中加载其他 Lua 文件。为什么不安全?

【问题讨论】:

    标签: lua


    【解决方案1】:

    要求在全局环境中加载和执行代码。

    例如,让我们创建一个简单的沙箱 (Lua >= 5.2):

    -- example.lua
    my_global = 42
    
    local sandbox
    do
      local _ENV = { require = require, print = print }
    
      function sandbox()
        print('<sandbox> my_global =', my_global)
        require 'example_module'
      end
    end
    
    print('<global> my_global =', my_global)
    sandbox()
    print('<global> my_global =', my_global)
    

    现在,让我们创建一个更改 my_global 的模块:

    -- example_module.lua
    print('<module> my_global =', my_global)
    my_global = nil
    

    期望在沙盒内,唯一可用的函数是requireprint。沙箱内的代码应该无法访问全局my_global

    运行示例,你会看到:

    $ lua example.lua
    <global> my_global =    42      -- The global environment, Ok.
    <sandbox> my_global =   nil     -- Inside the sandbox, Ok.
    <module> my_global =    42      -- Inside the sandbox, but loaded with require. Whoops, we have access to the global environment.
    <global> my_global =    nil     -- The module changed the value and it is reflected in the global environment.
    

    模块已脱离沙盒。

    【讨论】:

    • 好的,所以它打破了严格意义上的沙盒模式的想法,但如果他们要运行它,并不是说真的可以对个人电脑进行恶意操作?
    • 假设你想限制对os函数的访问。您在沙箱中加载用户代码,期望其安全,然后该代码加载一个包含 os.execute 'rm -rf /' 的模块。
    • 好的,所以如果你不从 C 的角度限制 os 函数,那么 require 模块可以运行东西。据我所知,有两种限制方式。您可以提供一个新的解释器 exe,其中限制了 C Lua 源中可用的内容,或者您​​可以尝试限制 Lua 文件本身的可用内容。如果您限制 C 源并且他们使用的解释器是您自己的 exe,并且您已将其锁定,那么与仅尝试从 Lua 沙箱相比,这将被视为您的沙箱模式并且无法解决默认解释器。
    • 当然,或者您可以实现一个类似要求的函数,以在使用load 的沙箱中公开,这将尊重环境。
    【解决方案2】:

    由于它可以访问文件系统和全局环境,它可以执行代码并修改不应修改的值。

    您可以实现并提供您自己的满足您的沙盒要求的require 方法。例如,您可以预加载您验证过的那些库,并且“require”只返回预加载的结果。

    【讨论】:

    • require 如何允许执行修改不应该修改值的代码?你能举例说明它是如何被恶意使用的吗?我只知道需要加载仍然受沙箱限制的其他 lua 文件,所以我想不出这会如何错误地使用。
    • 我在考虑bar.lua 做类似package.loaded.foo = {whatever} 的事情,从而修改下一个require"foo" 调用的结果。
    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多