避免Lua脚本出现宏病毒行为?

所以我正在开发一个程序,其中我将Lua脚本存储为文本文件,稍后由应用程序加载以执行(我相信doText就是这个功能),并返回一个值。我期望从Lua代码中获取一个浮点数,对浮点数进行(仅)数学运算,然后将另一个浮点数返回到C中。

我很快意识到,一个恶意行为者可以注入Lua代码到文件中,使其像Microsoft Word / Excel / PowerPoint中的宏病毒一样工作;它可以打开一个Lua文件并进行复制,或者更糟糕的是,向PE文件中注入代码,使该PE文件具有病毒性和恶意性。

有没有办法阻止用于恶意行为的Lua功能(例如文件io操作)或者实现功能以防止这种行为的出现?

点赞
用户1466970
用户1466970

我的印象是你想创建一个 Lua 沙盒,在其中运行 Lua 脚本。通过控制沙盒环境,你可以限制脚本的操作。

Stackoverflow 上有许多类似的问题。

Mozilla 提供了一个 Github,可能会对你有帮助。Lua 沙盒库

在 Lua 5.1 到 Lua 5.2 的转换中,一些老的沙盒技术可能不再适用。这里有一个针对 Lua 5.1 的描述,沙盒,然而一个被使用的函数 setfenv() 在 Lua 5.2 中不再可用。

还有 安全 Lua 可能会有所帮助。

这篇文章,从 C 中沙盒化 Lua 提到了挑选每次加载库以创建特定运行环境的方法。

这就是所提议的准沙盒的实现方式:通常情况下,在创建新的 Lua 状态之后,主机代码应该调用 luaL_openlibs() 函数来加载 Lua 语言提供的标准库,然而在某些情况下,这会让许多不必要的功能进来。因此,该沙盒通过调用 luaL_requiref() 来单独加载每个库,并利用这个函数会在 Lua 栈顶上留下一个已加载功能列表的事实。这些不需要的函数通过给它们赋值为 nil 而取消定义。

然而,也有关于这种方法的警告,可能会导致运行时错误的未知依赖项。

有关所提议的解决方案,需要提供一些最终注释:在某些情况下尚不清楚 Lua 解释程序是否会在不需要的功能以外的所有方面保持完整的功能,当加载了标准库的子集时,然而它确实适用于我的解决方案。在任何情况下都建议进行一些测试。这是因为,有些看似核心的语言功能(例如 ipairs())实际上是由基本库提供的。

最好的方法是通过锁定脚本,即使使用沙盒技术,也可以将其作为可信脚本运行。

2019-02-06 21:38:36