Kubernetes 中的命令注入漏洞-CVE-2023-3676

admin 2024年5月19日01:27:14评论76 views字数 2497阅读8分19秒阅读模式

Kubernetes 中的命令注入漏洞-CVE-2023-3676

执行摘要

  • Akamai 安全研究员 Tomer Peled 最近在 Kubernetes 中发现了一个高严重性漏洞,该漏洞被分配为 CVE-2023-3676,CVSS 评分为 8.8。

  • 这一发现导致了另外两个漏洞的识别,因为它们具有相同的根本原因:不安全的函数调用和缺乏用户输入清理。

  • 该漏洞允许在 Kubernetes 集群内的所有 Windows 端点上以 SYSTEM 权限远程执行代码。要利用此漏洞,攻击者需要在集群上应用恶意YAML文件。

  • 此漏洞可在 Kubernetes 的默认安装上被利用,并针对本地部署和 Azure Kubernetes 服务进行了测试。

介绍

YAML(YAML Ain't Markup Language)是一种类似于 JSON 的数据序列化语言,主要用于配置文件。因此,它在 Kubernetes 这一新兴的无处不在的容器编排系统中发挥着重要作用,可帮助组织自动部署、扩展和管理容器化应用程序。Kubernetes 框架基本上使用 YAML 文件来处理所有事情——从配置容器网络接口到 Pod 管理,甚至秘密处理。

Kubernetes 中的 YAML 文件一直是近年来的研究主题。考虑到 Kubernetes 依赖 YAML 进行集群配置,这个研究主题特别值得深入研究。

YAML 和 Kubernetes 之前是如何被利用的?

2022 年,在 SnakeYAML(一种已知的 YAML 文件解析器)的构造函数中发现了CVE-2022-1471 。该漏洞允许创建不安全的对象,这可能导致在使用该对象的易受攻击的应用程序上执行代码。另一个展示 YAML 文件可能影响的示例可以在Kubernetes 安全团队编写的有关 CVE-2021-25749 的CVE 公告中看到。此漏洞允许攻击者通过在 YAML 文件中拼写错误的姓名来绕过对谁可以以 root 身份运行的验证。

作为 Kubernetes 研究的一部分,我们遇到了CVE-2017-1002101和CVE-2021-25741。这些漏洞演示了攻击者如何将竞争条件和符号链接与 YAML 文件中的subPath子属性结合使用,以获取对容器外部特权数据的访问权限。 

过去的这些漏洞启发了我们在 Kubernetes 代码库中追求路径处理的方向,最终导致了我们今天讨论的漏洞的发现。

在这篇博文中,我们将演示具有“应用”权限(与 Kubernetes API 交互所需的权限)的攻击者如何注入将在具有 SYSTEM 权限的远程 Windows 计算机上执行的代码。

漏洞详情

创建 Pod 时,用户可以选择在 Pod 和主机之间创建共享目录。例如,当通过 Pod 中的容器为网站提供服务时,此功能(称为卷)非常有用。我们可能想从与主机共享的目录中共享站点文件;这样,我们就可以根据需要更改站点布局,而无需每次都重新编译包含该站点的图像。

启用卷是通过在 Pod 的 YAML 文件中包含卷参数来完成的。mountPath(容器中的位置)和hostPath(主机上的位置)中列出了卷的安装位置。

对我们来说最重要的是,我们可以使用 subPath 子属性将共享目录或文件挂载到选定的位置。体积的所有相关属性如图 1 所示。

Kubernetes 中的命令注入漏洞-CVE-2023-3676

图 1:YAML 卷配置

YAML 文件的解析由kubelet执行,kubelet 是 Kubernetes 中的一个中央服务,负责在节点上运行容器化应用程序。作为 CVE-2021-25741 补丁的一部分,kubelet 验证 YAML 文件中的每个参数,并通过调用内部函数“ isLinkPath ”确保不会因使用 subPath 参数而创建符号链接。该函数如图 2 所示。

Kubernetes 中的命令注入漏洞-CVE-2023-3676

图 2:检查符号链接路径的 subPath 函数

该函数将用户在 YAML 文件中提供的 subPath 作为参数。然后,它使用此路径创建一个 PowerShell 命令,用于确定路径类型(即是否是符号链接)。然后,“ exec.Command ”函数调用立即调用格式化的 PowerShell 命令。

“ exec.Command ”的存在与未经净化的用户提供的输入相结合,强烈暗示存在命令注入机会。

PowerShell 允许用户在使用字符串内的值之前对其进行评估。例如,可以通过将 $(< experssion_to_be_evaluated >) 添加到字符串中来完成此操作(图 3)。

Kubernetes 中的命令注入漏洞-CVE-2023-3676

图 3:PowerShell 计算字符串内表达式的示例

这个示例非常简单,但实际上任何PowerShell 命令都可以插入到括号之间并且将被计算 - 例如 $( Start-Process cmd )、$( Invoke-Expression exp ) 和其他 PowerShell 处理。

攻击者可以滥用此子路径评估来访问易受攻击的代码,并使用系统权限(kubelet 自己的上下文)从远程节点执行他们想要的任何命令,并获得对集群中所有 Windows 节点的控制。图 4 显示了恶意 subPath 值。

Kubernetes 中的命令注入漏洞-CVE-2023-3676

图 4:在 subPath 参数内进行命令注入的 YAML 文件

展示 CVE-2023-3676 的概念证明

概念证明只是一个包含 PowerShell 命令评估的YAML 文件。您可以在我们的 GitHub 存储库中找到此文件以及展示正在启动的终端的视频。

此 CVE 导致发现并修复了更多命令注入漏洞。它们的编号分别为 CVE-2023-3955 和 CVE-2023-3893。

补丁分析

Kubernetes 团队选择通过从环境变量而不是用户输入传递参数来修补此类漏洞(图 5)。通过以这种方式传递值,参数将被视为字符串 - 因此,它们不会被 PowerShell 视为表达式进行计算。

Kubernetes 中的命令注入漏洞-CVE-2023-3676

图 5:CVE-2023-3676 的修补函数

结论

CVE-2023-3676 需要较低的权限,因此为攻击者设置了较低的门槛:他们所需要的只是访问节点并应用权限。正如我们在这篇博文中所讨论的,成功利用此漏洞将导致在具有 SYSTEM 权限的计算机上的任何 Windows 节点上远程执行代码。

高影响力加上易于利用通常意味着组织更有可能看到此攻击(以及类似的攻击)。事实上,该漏洞的唯一限制因素是其范围——它仅限于 Windows 节点,而如今 Windows 节点还不太流行。

可点击阅读原文-跳转到原文地址

原文始发于微信公众号(Ots安全):Kubernetes 中的命令注入漏洞-CVE-2023-3676

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月19日01:27:14
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Kubernetes 中的命令注入漏洞-CVE-2023-3676https://cn-sec.com/archives/2037048.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息