如何解决Debug.setlocal() 安全问题
debug.setlocal 是否有任何安全问题?如果可以,请告诉我它到底是如何工作的。
解决方法
Lua 线程运行在“栈”之上,栈是构成语言中大部分内存的项目列表。一切,从“全局”变量到表格,都在这个列表中。
当你创建一个局部变量并执行你的代码时,堆栈看起来像这样:
local a = "the letter a"
STACK
+---+----------------+
| 1 | "the letter a" |
+---+----------------+
现在,假设我们是恶意代码。我们知道下面的代码是用来运行我们的程序的:
local isAdministrator = false
local Code = "malicious code here!"
loadstring(Code)()
嗯,这意味着 loader 的堆栈看起来像这样:
+---+-------+
| 1 | false | isAdministrator
+---+-------+----------------+
| 2 | "malicious code here!" | Code
+---+---------------------+--+
| 3 | function loadstring |
+---+---------------------+--+
| 4 | function MaliciousCode |
+---+------------------------+
现在,假设更改 isAdministrator
对我们有一定的价值。让我们看看我们将如何做到这一点。
1
我们需要得到 lua 来修改我们函数上方的“堆栈”。想象 lua 是一棵树,就像这样:
otherScript
+ loader
+ maliciousCode
这棵树中的每一步都有自己的堆栈,多亏了 debug
库,它上面的堆栈中的每个变量都可以“访问”到它下面的堆栈。
如果我们当前所在的“堆栈”是堆栈 #1(始终为真) 然后调用当前函数的函数在栈 #2(这几乎总是正确的)
现在,查看我们要更改的函数的堆栈,isAdministrator
位于第一个插槽 1
中。所以,为了改变这一点,我们 juuuust:
debug.setlocal(2,1,true)
还有呸。 isAdministrator
现在是 true
。我们可以随意破坏您的计算机!
不要担心 - 有一种方法可以阻止这种情况。拿走调试库真的很容易:
local func = loadstring("malicious code!")
setfenv(func,{
-- Here we insert what functions our baby function can use. Let's give it the string,table,and math libraries- which are pretty safe
math = math,table = table,string = string,-- Oh,and let's give it the `os.time` function as well.
os = { time = os.time }
})
func()
现在,func 无法访问调试库,您可以放心地使用您愚蠢的 isAdministrator
本地人了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。