无论如何都要避免Lua中的这个安全问题?

时间:2008-11-28 09:03:40

标签: security lua

我正在研究一个可本地化的Lua字符串解决方案,当我想出这个hack时,问题是我不知道如何避免被它攻击:) 所以我想知道是否有人,做过类似的事情,或者知道如何防止这种攻击。 (在用户代码中)

因为我们可以这样做:

=("foo"):upper() -->output: FOO

它可以像这样被黑客攻击:

getmetatable("foo").__index.upper = function() print("bye bye sucker");os.exit() end
=("foo"):upper() -->output: bye bye sucker (application quits)
-- or this way
=string.upper("bar") -->output: bye bye sucker (application quits)

有什么想法吗?

6 个答案:

答案 0 :(得分:8)

首先,最重要的是在沙盒环境中执行不受信任的代码 - 正如其他海报所说的那样。除了加载字节码块之外,Lua还允许涵盖所有其他沙盒问题。 (并且字节码块问题会在发现时立即得到修复。)

有关沙盒的示例,请参阅Lua Live Demo。资料来源here

通过设置__metatable字段

解决了元表的具体问题
  

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

     

- Roberto Ierusalimschy,Lua第一版编程,         13.3 - Library-Defined Metamethods

例如:

> 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

答案 1 :(得分:6)

如果您的黑客能够添加代码,并且您需要允许该代码调用os.exit之类的东西,那么无论如何您都会运气不好。

但是,您可以限制其代码可以调用的函数。这取决于您仍然希望用户代码能够做什么。请参阅setfenv的文档和google的“lua sandbox”

答案 2 :(得分:2)

我不确定你为什么会遇到问题,因为你可能已经知道了沙箱:你可以删除像io.exit这样的危险函数,你可以确保被覆盖的函数只是那些用户的全局表中的函数,即。您的应用程序内部使用的Lua函数将保持不变 在任何情况下,如果黑客可以直接调用os.exit,那么他可以通过增加他将在稍后使用的无辜函数来自己射击的事实是他的问题。
此外,只有在服务器上运行用户功能时才会出现问题,例如:如果黑客再次摧毁他的系统,那就是他的问题!
现在,还存在分发危险代码的问题:由您来限制用户脚本的功能。毕竟,这就是浏览器用JavaScript做的事情。

答案 3 :(得分:2)

这个安全问题通常用这句话说明,福特Prefect在精彩的书籍 The Hitchhiker's Galaxy指南中说:It rather involved being on the other side of this airtight hatchway

我编写代码的能力不能说是一个安全漏洞,如果你无法控制你的代码,那么 就是你的安全问题,而不是代码可以做什么。

如果您可以让机器执行某些代码,那么您可以做很多事情。安全性是为了避免首先将代码放在那里。之后的一切都只是附带损害。

避免被该问题攻击的方法是避免将未知代码添加到您的应用程序中。

答案 4 :(得分:1)

我认为没有可能重新定义upper作为问题。能够看到os.exit是个问题。

正如其他人所建议的那样,为脚本创建一个沙盒环境。每个脚本都可以获得一个新脚本;然后一个人可以重新定义鞋面或类似的东西,而他们所搞砸的就是他们自己的东西。

创建Lua状态是如此快速和简单,这不会导致任何问题。

你可能要注意的另一件事是永恒的循环。制作一个杀死脚本的“看门狗”,比方说10000条指令需要大约10行C代码。如果需要,我可以寄给你样品。

答案 5 :(得分:0)

我没有解决方案(我不使用Lua,我只是从远处感兴趣),但你所追求的是一个“沙盒”。谷歌Lua sandbox,我发现了一些看似有趣的页面。例如:http://lua-users.org/wiki/SandBoxes