有没有什么方法可以避免 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
我不确定为什么您会有问题,因为您可能已经知道了沙盒:您可以删除危险函数,如 io.exit,并确保覆盖的函数仅限于用户的全局表中,即您的应用程序在内部使用的 Lua 函数将保持完好无损。
无论如何,如果黑客可以直接调用 os.exit,那么他可以通过强化稍后使用的无辜函数来自取灭亡,这是他自己的问题。
此外,它只有在您在服务器上运行用户函数时才是问题,例如:如果黑客毁了他的系统,那还是他的问题!
现在,还有分发危险代码的问题:限制用户脚本的权限由您来负责。毕竟,这就是浏览器在处理 JavaScript 时所做的。
我没有解决方案(我不使用 Lua,只是从远处对它感兴趣),但你想要的叫做“沙箱”。在 Google 上搜索 Lua 沙箱,我发现了一些看起来很有趣的页面,例如:http://lua-users.org/wiki/SandBoxes。
这个安全问题通常由《银河系漫游指南》中福特·普雷斯特说的这句话形象地说明:它更涉及在密封的舱门另一侧
我的编码能力不能说是安全漏洞,如果你不能控制你的代码,_那_就是你的安全问题,而不是那些代码能做什么。
如果你可以让机器执行一些代码,就可以做很多很多事情。安全措施就是要避免那些代码进入你的应用程序。之后的都只是附带损害。
避免被这个问题入侵的方法是要避免未知代码进入你的应用程序。
首先只能在沙盒环境中执行不受信任的代码 - 正如其他帖子所说。除了加载字节码块之外,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
我并不认为重新定义 upper
是问题所在。能够查看到 os.exit
才是问题所在。
正如其他人所建议的,为你的脚本创建一个沙盒环境。每个脚本都可以获得一个新环境;然后一个人可以重新定义 upper
或者其他任何函数,他们只会影响到自己的环境。
创建 Lua 状态非常快速简单,这不会导致任何问题。
还有一件事情需要注意是无限循环。制作一个“看门狗”,在执行10000条指令后杀死脚本只需要大约10行C代码。如果你需要,我可以给你发送样例。
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
- 如何创建一个 lua 脚本以针对特定键为 fluentbit 进行限流
如果你的黑客有添加代码的能力,并且你需要让该代码调用像
os.exit
这样的东西,那你基本上已经没有什么办法了。不过,你可以限制它们的代码可以调用的函数。这取决于你仍然希望用户代码能够做什么。请参阅
setfenv
文档,以及搜索“lua沙盒”。