【问题标题】:Avoiding macro virus behavior with Lua scripts?使用 Lua 脚本避免宏病毒行为?
【发布时间】:2019-06-30 22:38:05
【问题描述】:

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

我很快意识到恶意行为者可以将 Lua 代码注入文件中,使其行为类似于 Microsoft Word/Excel/PowerPoint 中的宏病毒;它可以打开 Lua 文件并复制,或者更糟的是,将代码注入到 PE 文件中,例如使 PE 文件具有毒性和恶意。

有没有办法阻止对恶意行为者有用的 Lua 功能(例如文件 io 操作)或实施功能来阻止这种行为?

【问题讨论】:

  • 当然。只是不要将相关功能暴露给脚本。然后添加一个看门狗,这样就不会永远。
  • Lua 具有文件 io 功能。我正在考虑使用 C 解析与攻击者相关的函数(例如文件 io)的脚本,然后如果找到这些函数则不运行脚本。
  • 我建议你永远不要低估人们在弄清楚如何运行恶意代码时的聪明才智。我仍然很惊讶人们会打扰,但他们肯定会。我正在研究 Lua 和 JavaScript 来编写应用程序的脚本,但在决定它只是打开了太多盒子后,我把它放在一边。
  • 你能取消 Lua 库的某些部分吗?这将使这变得容易得多。是的,@RichardChambers 在我的程序中嵌入 Lua 是小学操场和迪斯尼世界之间的区别。不幸的是,迪斯尼世界需要安全......
  • @SteveMucci 这可能会有所帮助,How to drop all code and memory space of a Lua module 其中一个答案是 Lua 用户存档,该存档讨论了家庭酿造的unrequire() 函数。

标签: lua scripting virus


【解决方案1】:

我的印象是您想创建一个运行 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 解释器是否会保留完整的 在不需要的功能之外的所有方面的功能,当 仅加载了标准库的子集,但确实有效 很适合我的解决方案。无论如何,建议进行一些测试。这个到期了 事实上,一些看似核心的功能 语言(例如 ipairs())实际上是由基础库提供的。

最好的方法是锁定脚本,这样即使在使用沙盒技术时,您也可以将它们作为受信任的脚本运行。

【讨论】:

  • 我很欣赏这个彻底的答案,但我认为这个级别的沙盒游戏就像使用核武器,如果你发现我的漂移,一个瞄准良好的狙击手就可以解决问题。虽然令人难以置信的答案,仍然直奔我的脑袋。 :)
  • @SteveMucci 阻止我的是,打开我的应用程序意味着任何投掷 Lua 脚本破坏某些东西的人都会打电话给我,假设这是我的应用程序而不是他们的 Lua 脚本。所有这些电话的恐怖和不得不追逐填补漏洞的恐惧足以阻止我追求这个想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2011-03-15
  • 1970-01-01
  • 2010-10-24
  • 2023-03-28
  • 2019-04-17
相关资源
最近更新 更多