security - Lua 中有没有办法避免这个安全问题?

标签 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)

有什么想法吗?

最佳答案

首先也是最重要的是,仅在沙盒环境中执行不受信任的代码 - 正如其他发帖者所说。除了加载字节码 block 之外,Lua 还允许涵盖所有其他沙箱问题。 (字节码 block 问题一旦发现就会立即得到修复。)

参见Lua Live Demo举个沙盒的例子。来源可用here .

您的元表具体问题可以通过设置 __metatable 来解决字段:

If you set a __metatable field in the metatable, getmetatable will return the value of this field, whereas setmetatable will raise an error.

– Roberto Ierusalimschy, Programming in Lua 1st edition, 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

关于security - Lua 中有没有办法避免这个安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/325323/

相关文章:

lua - 一个Lua "Class"的两个实例是相同的 "object"

c++ - 如何从Lua运行进程中读取变量值(获取进程变量值)?

java - 我应该担心密码安全吗?

lua - 如何清除 Lua 解释器中的多行命令?

security - WSO2 ESB 安全代理端点

ios - iOS 中的 SQLite 数据库安全

sorting - Lua - 按字母顺序对表格进行排序

windows - Lua - io.open() 最多只有 2 GB?

java - 防止 Java 中的 SSL 证书验证

java - 如何在代码中的任意位置访问 JAAS 角色?