所有文章 > 技术杂货铺 > Lua命令注入:示例与预防
Lua命令注入:示例与预防

Lua命令注入:示例与预防

随着互联网的发展,精明用户的数量也在增长。他们希望能够超越点击操作,定制自己的软件体验。许多高级用户希望编写代码,但他们也希望编程变得简单。因此,Lua等语言应运而生,填补了这一空白。Lua 既易于使用,又可嵌入到应用程序中。因此,它出现在从桌面应用程序和游戏到命令行实用程序和消费设备等各个领域。 

但有一个问题。当你嵌入一种编程语言时,无论它多么简单,你都会添加一个新的攻击媒介。它让你的用户能够让你的代码做一些你可能意想不到的事情。即使经过精心设计和规划,脚本语言也可能成为强大的武器。例如,Lua 可以访问内置的系统接口。所以,我们已经看到了不少 Lua 命令注入攻击的例子。 

这篇文章将介绍 Lua 语言、命令注入以及实际的 Lua 命令注入示例。最后,我们将介绍如何保护自己免受此类攻击。

什么是 Lua?

Lua是一种高级编程语言,很容易嵌入到应用程序中。

Lua 的设计者用 ANSI C 编写了解释器,因此它是跨平台的。它还将 Lua 源代码编译为字节码,使其运行速度相当快。将该语言嵌入到应用程序中的 API 非常简单,使其成为向代码添加脚本功能的绝佳选择。它占用空间也很小,对开发人员特别有吸引力。 

Lua 有大约 20 个关键字,并且非常易于使用。新手程序员很快就能掌握 Lua 的简单语法和句法。其最受欢迎的客户端应用程序之一是Roblox,这是一款儿童在线游戏。 

使用 Lua 的应用程序太多了,无法在此一一列举。它的设计者希望它能够帮助定制应用程序,他们显然成功了。但有几个例子值得指出。 

  • PowerDNS支持Lua脚本对DNS服务器进行操作。
  • 您可以用 Lua编写Pandoc 过滤器。
  • RPM 是 Redhat 的打包系统,其中有一个嵌入式 Lua 解释器。
  • Lua 是Wireshark 的过滤器和扩展语言。
  • 一些 Minecraft 模组(包括Tweaked.cc和OpenComputers)提供了使用脚本修改游戏的方法。
  • Adobe 的Lightroom Classic有一个用于插件的 Lua 接口。
  • OpenResty是一个使用 Lua 扩展 Nginx 的平台。

什么是命令注入?

命令注入会向应用程序发送意外输入。输入会在目标系统上执行任意命令。例如,如果用于评估算术表达式的应用程序未验证其输入,则可能会被强制执行 shell 命令。这种攻击可能导致严重的安全漏洞。CWE -94中有关于命令注入的详细描述。 

命令注入攻击依赖于使用未经验证或过滤的输入的应用程序。它从接受带有代码语法的输入的应用程序开始。这就为攻击者向目标应用程序提供设计者未预料到的代码提供了可能性。 

演示命令注入的最好方法是通过示例。 

Lua 命令注入示例

我们先来看一个命令注入漏洞的真实示例。NIST 于 2019 年发布了此漏洞。它涉及VeraEdge Home Controller,一款消费者智能家居中心。 

该集线器有一个 Lua 接口(现已不再可用),可用于扩展设备的功能。例如,脚本主机使编写传感器和开关驱动程序成为可能。用户可以通过 Web 界面编辑和提交脚本。但是,接受脚本的 API 端点没有授权或身份验证要求。它也没有将提交脚本的源地址列入白名单。任何客户端都可以直接向设备提交脚本,而无需登录界面。 

虽然可以不经过身份验证就提交脚本,但有一种机制可以验证脚本是否安全。不幸的是,供应商没有启用它。本文演示了一个漏洞,该漏洞使用 cURL 命令添加了新的操作系统用户。新帐户使攻击者能够直接进入集线器。 

通过 Lua 进行命令注入

让我们看一下示例漏洞。 

以下是传递给控制器​​的 Lua 代码: 

os.execute("adduser -h /root -s /bin/ash testuser");os.execute("echo -e \"test\ntest\" | passwd testuser")

此命令添加一个名为testuser的 新操作系统帐户,然后设置密码。 

Lua 的操作系统库 ( os)向底层操作系统公开了一个接口。os.execute ()调用运行系统命令。此漏洞表明控制器正在运行 Linux,并且 Lua 接口允许脚本以 root 访问权限运行任意命令。

防止 Lua 命令注入

智能家居中心的设计者可以通过多种方式避免这种攻击。 

净化输入

智能家居中枢接受用户输入并执行,但不验证其内容,可能是通过 Lua 的loadstring() API 调用。这使得可以注入启动 shell 进程并执行任意代码的系统 API 调用。 

使用 Lua 接受未经验证的输入尤其危险,因为它可以访问底层系统接口。使用os.execute() 或 io.popen()执行 shell 程序很容易,但打开套接字、创建文件和执行其他潜在的恶意任务也同样容易。

不同的 Lua 应用程序也接受来自各种来源的输入。许多开发人员使用 Lua 来定制用户界面、编写应用程序扩展和扩展视频游戏。在这些情况下,不难想象用户社区会无意中通过用户论坛或 GitHub 分享一段恶意代码。所有这些接口都需要验证 Lua 脚本不包含有害代码。

使用沙盒

虽然清理输入始终是个好主意,但更好的办法是保护您的应用程序及其运行的系统免受恶意代码的侵害。默认情况下,Lua 不在沙盒中运行,但有几种选项可以使其更安全。 

一种是使用运行时沙盒。此方法类似于净化输入,因为它具有将 Lua API 子集的访问权限列入白名单的效果。这可能是将代码中的脚本包装在保护壳中的最简单方法。 

另一种方法是修改 Lua 源代码并删除不安全的部分。在将 Lua 添加到代码之前执行此操作需要更多工作,但这也是最安全的方法。注释掉不安全的调用可以减少攻击面。 

实施适当的访问控制

即使没有清理输入或在沙箱中运行,此应用程序至少还有一种方法可以避免命令注入攻击;通过不允许 Lua 脚本具有特权访问权限。攻击依赖于运行adduser命令,然后运行​​passwd来修改另一个用户的密码条目。这些活动需要对底层操作系统的root访问权限,因此智能家居中心上的 Web 服务器很可能以root用户身份运行。对于它负责的任何任务来说,这种级别的访问权限都不是必需的。大多数现代 Linux 发行版都会创建非特权用户来运行 Web 服务器和数据库等服务。

Lua 命令注入:示例和预防图像

避免命令注入攻击

在这篇文章中,我们研究了 Lua 命令注入攻击。我们首先概述了流行的 Lua 脚本语言以及命令注入是什么。然后,我们回顾了现实世界中的 Lua 命令注入攻击。最后,我们研究了可以避免这种攻击和类似攻击的三种不同方法。 

文章来源:Lua Command Injection: Examples and Prevention

#你可能也喜欢这些API文章!