防止沙箱逃逸
阻止访问 debug 库,防止滥用 rawget/rawset,并避免上值泄漏。
防止沙箱逃逸 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
逃逸问题
即使使用白名单环境,具有创造性的攻击者仍可能找到访问真实全局环境的方法。本课将介绍已知的逃逸途径,以及如何封堵这些途径。
字符串元表漏洞利用
在 Lua 中,字符串拥有一个共享元表,该元表暴露了字符串库。沙箱代码可以利用字符串获取对 string.rep 的引用,然后从那里访问其他库。
-- Escape vector (before patching):
local s = "hello"
local getenv = s.rep -- reaches string library
-- Fix: use setmetatable on all sandboxed strings (not practical)
-- Better fix: override debug.getmetatable in the sandbox通过 rawget/rawset 进行绕过
如果沙箱中包含 rawget,代码就可以利用它绕过 __index 限制,直接从真实表中读取数据。
-- Fix: exclude rawget, rawset, rawequal, rawlen from the sandbox env访问 debug 库
debug 库可以读取和修改任何上值,包括 _ENV。请将它完全排除在沙箱之外。
package.loaded 表
如果 require 或 package 可访问,沙箱代码就能访问已加载的模块,包括 os 和 io。
-- Fix: exclude require and package from the sandbox env协程与恢复
由宿主恢复的沙箱协程可能被用于泄露状态。请谨慎使用 coroutine.wrap,不要以提升后的权限恢复沙箱协程。
遍历上值
如果没有调试库,沙箱代码就无法遍历上值。但如果意外包含了 debug.getupvalue,就可能利用它访问 _G。
safeEnv 上的 __newindex
向沙箱环境的元表添加 __newindex,以防止沙箱代码创建会遮蔽安全全局变量的新全局变量。
setmetatable(safeEnv, {
__newindex = function(_, k, v)
-- allow only whitelisted keys or reject
error("Global assignment not allowed: " .. k)
end
})math 库的代理
不要直接传入真实的 math 表(它与标准库共享元表),而应创建一个只包含所需函数的浅拷贝。
自动化逃逸测试
维护一个模糊测试套件,使用已知的逃逸模式测试沙箱。每次修改沙箱代码时都运行该测试套件。
纵深防御
没有任何沙箱是绝对安全的。请分层设置防御措施:受限环境 + 指令限制 + 内存限制 + 操作系统级进程隔离(独立子进程或容器)。
操作系统级沙箱
要实现最高级别的安全性,请在带有操作系统级限制的子进程中运行 Lua:使用 seccomp(Linux)、应用沙箱(macOS),或使用只读文件系统的 Docker。
沙箱逃逸问题
为什么必须从沙箱中排除 rawget?
回顾:防止沙箱逃逸
从沙箱中排除 debug、rawget/rawset、package、require 和 load。使用 __newindex 保护沙箱环境。复制库表,而不是引用原始表。为了实现最高级别的安全性,增加操作系统级隔离。
常见问题解答
「防止沙箱逃逸」课时是免费的吗?
是的 — 「防止沙箱逃逸」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「防止沙箱逃逸」这节课中我会学到什么?
阻止访问 debug 库,防止滥用 rawget/rawset,并避免上值泄漏。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「防止沙箱逃逸」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。