Lupa能否用于在Python中运行不受信任的Lua代码?

5

假设我使用 register_eval=False 创建了一个 LuaRuntime,并且使用 attribute_filter 阻止访问除了一些Python函数之外的任何内容。那么可以安全地假设 Lua 代码将无法执行类似于 os.system("rm -rf *") 的操作吗?


1
最好编译一个自定义的Lua,将所有I/O库和其他你想禁止的东西都删除掉,这样可能更安全。即便如此,DOS攻击也很容易(只需编写一个无限循环)。 - user395760
@delnan 说得好,我的当前计划是生成一个单独的进程,并使用“resource”模块来限制CPU和RAM的使用。 - ramirami
一般情况下,只有在你的生命绝对、肯定地取决于它时,才执行不受信任的代码。比如,有人拿枪指着你的头和/或你所爱的人的头,威胁说如果你不这样做就开枪。请假设任何沙盒都可能被攻破(是的,DoS甚至更容易)。Google Chrome曾经被攻破过。任何虚拟机都可能被攻破。 - Jürgen A. Erhard
1个回答

11

从查看Lupa文档

限制Lua访问Python对象

Lupa提供了一种简单的机制来控制对Python对象的访问。可以通过一个过滤函数来传递每个属性访问,如下所示...

它没有说明如何防止或限制Lua本身提供的功能。如果在LuaRuntime环境中没有进行其他修改,则Lua脚本确实可以执行诸如os.execute("rm -rf *")之类的操作。

要控制Lua脚本工作的环境类型,可以在运行之前使用setfenvgetfenv来沙盒化脚本。例如:

import lupa
L = lupa.LuaRuntime()
sandbox = L.eval("{}")
setfenv = L.eval("setfenv")

sandbox.print   = L.globals().print
sandbox.math    = L.globals().math
sandbox.string  = L.globals().string
sandbox.foobar  = foobar
# etc...

setfenv(0, sandbox)

现在执行像L.execute("os.execute('rm -rf *')")这样的操作将导致脚本错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接