因此,我正在开发一个程序,其中我将Lua脚本作为文本存储在文件中,以供以后由应用程序加载以执行(doText是我相信的功能)并返回值。我对Lua代码的期望是从C中获取一个浮点数,对该浮点数进行(仅)数学运算,然后将另一个浮点数返回给C。
我很快意识到恶意行为者可以将Lua代码注入文件中,从而使其表现得像Microsoft Word / Excel / PowerPoint中的宏病毒一样;它可能会打开Lua文件并将其复制,或更糟糕的是,将代码注入PE文件中,例如使PE文件具有病毒性和恶意性。
有没有办法阻止Lua对恶意行为者有用的功能(例如文件io操作)或实现防止这种行为的功能?
答案 0 :(得分:4)
我的印象是,您想创建一个在其中运行Lua脚本的Lua沙箱。通过控制沙箱环境,您可以限制脚本可以执行的操作。
Stackoverflow中有许多类似的问题。
然后Mozilla有一个您可能会觉得有用的github。 Lua Sandbox Library。
从Lua 5.1到Lua 5.2似乎有所变化,这导致许多较旧的沙箱技术无法很好地工作。这是Lua 5.1的方法的描述,Sand Boxes,但是使用的功能setfenv()
在Lua 5.2中不再可用。
还有Safe Lua可能会有所帮助。
本文Sandboxing Lua from C提到了选择库来一次加载一个库以创建特定的运行环境。
这就是拟议的沙盒的实施方式:通常在 创建新的Lua状态时,主机代码应调用luaL_openlibs()函数 加载Lua语言提供的标准库,但是 将引入许多在某些情况下可能不需要的功能 情况。因此,此沙箱分别引入每个库 通过调用luaL_requiref()并利用以下事实: 在Lua堆栈的顶部保留一个已加载函数的表。的 然后通过为它们提供nil值来取消定义不需要的函数,...
但是,也有关于此方法的警告,未知的依赖关系会导致运行时错误。
有必要对建议的内容做一些最后的说明 解决方案:尚不清楚Lua解释器是否会保留完整内容 当不需要的功能之外的所有aspcts中的功能时, 仅加载了标准库的子集,但确实有效 很好,我的解决方案。无论如何,建议进行一些测试。这个到期了 事实是, 语言(例如ipairs())实际上是由基础库提供的。
最好的方法是锁定脚本,以便即使使用沙箱技术也可以将它们作为受信任的脚本运行。