有没有什么方法可以避免 Lua 中的安全问题?

我正在开发一个本地化的 Lua 字符串解决方案,当我想到这个 hack 时,问题是我不知道如何避免被它攻击 :)

所以,我想知道是否有人做过类似的事情,或者知道如何保护免受这种攻击(在用户代码中)。

由于我们可以这样做:

=("foo"):upper() -->输出: FOO

它可以被这样攻击:

getmetatable("foo").__index.upper = function() print("再见傻瓜");os.exit() end
=("foo"):upper() -->输出: bye bye sucker(应用程序退出) 
-- 或者这样
=string.upper("bar") -->输出: bye bye sucker(应用程序退出)

有什么想法吗?

原文链接 https://stackoverflow.com/questions/325323

点赞
stackoverflow用户21755
stackoverflow用户21755

如果你的黑客有添加代码的能力,并且你需要让该代码调用像 os.exit 这样的东西,那你基本上已经没有什么办法了。

不过,你可以限制它们的代码可以调用的函数。这取决于你仍然希望用户代码能够做什么。请参阅 setfenv 文档,以及搜索“lua沙盒”。

2008-11-28 09:19:06
stackoverflow用户15459
stackoverflow用户15459

我不确定为什么您会有问题,因为您可能已经知道了沙盒:您可以删除危险函数,如 io.exit,并确保覆盖的函数仅限于用户的全局表中,即您的应用程序在内部使用的 Lua 函数将保持完好无损。

无论如何,如果黑客可以直接调用 os.exit,那么他可以通过强化稍后使用的无辜函数来自取灭亡,这是他自己的问题。

此外,它只有在您在服务器上运行用户函数时才是问题,例如:如果黑客毁了他的系统,那还是他的问题!

现在,还有分发危险代码的问题:限制用户脚本的权限由您来负责。毕竟,这就是浏览器在处理 JavaScript 时所做的。

2008-11-28 09:30:57
stackoverflow用户19966
stackoverflow用户19966

我没有解决方案(我不使用 Lua,只是从远处对它感兴趣),但你想要的叫做“沙箱”。在 Google 上搜索 Lua 沙箱,我发现了一些看起来很有趣的页面,例如:http://lua-users.org/wiki/SandBoxes

2008-11-28 09:33:31
stackoverflow用户267
stackoverflow用户267

这个安全问题通常由《银河系漫游指南》中福特·普雷斯特说的这句话形象地说明:它更涉及在密封的舱门另一侧

我的编码能力不能说是安全漏洞,如果你不能控制你的代码,_那_就是你的安全问题,而不是那些代码能做什么。

如果你可以让机器执行一些代码,就可以做很多很多事情。安全措施就是要避免那些代码进入你的应用程序。之后的都只是附带损害。

避免被这个问题入侵的方法是要避免未知代码进入你的应用程序。

2008-11-28 09:41:35
stackoverflow用户6236
stackoverflow用户6236

首先只能在沙盒环境中执行不受信任的代码 - 正如其他帖子所说。除了加载字节码块之外,Lua 允许覆盖所有其他沙盒问题(并且字节码块问题会在发现后立即得到修复)。

有关沙盒化的示例,请参见 Lua Live Demo。源文件可在 此处 获取。

您使用元表的特定问题可以通过设置 __metatable 字段来解决:

如果在元表中设置了 __metatable 字段, 则 getmetatable 将返回此字段的值, 而 setmetatable 将引发错误。

  • Roberto Ierusalimschy,《Lua 编程(第一版)》,

13.3 - 库定义的元方法

例如:

> mt = { __metatable = true }
> t = {}
> setmetatable(t, mt)
> setmetatable(t, mt)
stdin:1: cannot change a protected metatable
stack traceback:
 [C]: in function 'setmetatable'
 stdin:1: in main chunk
 [C]: ?

因此,您所要做的就是:

getmetatable("").__metatable = true
2008-11-28 17:55:54
stackoverflow用户14455
stackoverflow用户14455

我并不认为重新定义 upper 是问题所在。能够查看到 os.exit 才是问题所在。

正如其他人所建议的,为你的脚本创建一个沙盒环境。每个脚本都可以获得一个新环境;然后一个人可以重新定义 upper 或者其他任何函数,他们只会影响到自己的环境。

创建 Lua 状态非常快速简单,这不会导致任何问题。

还有一件事情需要注意是无限循环。制作一个“看门狗”,在执行10000条指令后杀死脚本只需要大约10行C代码。如果你需要,我可以给你发送样例。

2008-12-11 11:45:25