CVE-2022-29800 微软发现新的Linux提权漏洞Nimbuspwn

CVE-2022-29800 微软发现新的Linux提权漏洞Nimbuspwn

Microsoft 发现了几个漏洞,统称为 Nimbuspwn,可能允许攻击者在许多 Linux 桌面端点上将权限提升为 root。这些漏洞可以链接在一起以在 Linux 系统上获得 root 权限,从而允许攻击者部署有效负载,如 root 后门,并通过执行任意 root 代码执行其他恶意操作。此外,更复杂的威胁(如恶意软件或勒索软件)可能会利用 Nimbuspwn 漏洞作为 root 访问的载体,从而对易受攻击的设备产生更大的影响。

我们通过侦听系统总线上的消息发现了这些漏洞,同时对以 root 身份运行的服务执行代码审查和动态分析,注意到一个名为networkd-dispatcher的 systemd 单元中的奇怪模式。审查networkd-dispatcher的代码流揭示了多个安全问题,包括目录遍历、符号链接竞争和检查时间-使用时间竞争条件问题,这些问题可用于提升权限和部署恶意软件或执行其他恶意活动。我们通过Microsoft 安全漏洞研究(MSVR)通过协调漏洞披露(CVD)与相关维护人员共享这些漏洞。这些漏洞的修复,现在确定为CVE-2022-29799CVE-2022-29800已由网络调度程序的维护者 Clayton Craft 成功部署。我们要感谢克莱顿在解决这些问题方面的专业精神和合作。鼓励 networkd-dispatcher 的用户更新他们的实例。

随着组织环境继续依赖于各种设备和系统,他们需要全面的解决方案来提供跨平台保护和安全态势的整体视图,以减轻威胁,例如 Nimbuspwn。Linux 环境中越来越多的漏洞强调了对平台操作系统及其组件的强大监控的必要性。Microsoft Defender for Endpoint 使组织能够获得这种必要的可见性并检测Linux 设备上的此类威胁,从而使组织能够跨不同平台(包括 Windows、Linux、Mac、iOS 和 Android)检测、管理、响应和修复漏洞和威胁。

在这篇博文中,我们将分享一些有关受影响组件的信息,并检查我们发现的漏洞。详细说明我们的跨域可见性如何帮助我们发现新的和未知的威胁以不断提高安全性,我们还与更大的安全社区分享我们研究的细节,以强调保护平台和设备的重要性。

背景-D-Bus

D-Bus (“Desktop-Bus”的缩写)是由freedesktop.org项目开发的一种进程间通信通道(IPC)机制。D-Bus 是一种软件总线,它允许同一端点上的进程通过传输消息和响应消息进行通信。D-Bus 支持两种主要的通信方式:

  1. Methods——用于请求-响应通信。
  2. Signals ——用于发布/订阅通信。

使用 D-Bus 的一个例子是通过流行的视频会议应用程序接收视频聊天——一旦建立了视频,视频会议应用程序可以发送 D-bus 信号发布呼叫已经开始。收听该消息的应用程序可以做出适当的响应——例如,将其音频静音。

在流行的 Linux 桌面环境中默认提供了许多 D-Bus 组件。由于这些组件以不同的权限运行并响应消息,因此 D-Bus 组件对攻击者来说是一个有吸引力的目标。事实上,过去曾出现过与有缺陷的 D-Bus 服务相关的有趣漏洞,包括USBCreator Elevation of Privilege、 Blueman Elevation of Privilege by command injection以及其他类似情况。

D-Bus 公开了一个全局系统总线和一个每会话会话总线。从攻击者的角度来看,系统总线更具吸引力,因为它通常具有以 root 身份运行的服务来监听它。

D-Bus 名称所有权

当连接到 D-Bus 时,组件被分配了一个唯一的标识符,这可以减轻滥用 PID 回收的攻击。唯一标识符以冒号开头,其中包含用点分隔的数字,例如“:1.337”。组件可以使用 D-Bus API 来拥有可识别的名称,例如“org.freedesktop.Avahi”或“com.ubuntu.SystemService”。为了让 D-Bus 允许这种所有权,必须在 D-Bus 配置文件下允许请求的进程上下文。这些配置文件/usr/local/share/dbus-1/system.conf/usr/local/share/dbus-1/session.conf 在某些系统上的/usr/local/dbus-1直接)。具体来说,默认的system.conf除非在其他包含的配置文件(通常在/etc/dbus-1/system.d下)中另有说明,否则不允许所有权。

CVE-2022-29800 微软发现新的Linux提权漏洞Nimbuspwn
图 1:系统总线和会话总线的不同所有权策略

此外,如果请求的名称已经存在——在拥有进程释放该名称之前,该请求将不会被授予。

漏洞搜寻

我们的团队已经开始枚举以 root 身份运行的服务,并在系统总线上侦听消息,执行代码审查和动态分析。因此,我们报告了两个信息泄露问题:

  1. Blueman 中的目录信息披露
  2. PackageKit 中的目录信息泄露 (CVE-2022-0987)

虽然这些很有趣,但它们的严重性很低——攻击者可以列出需要高权限才能列出文件的目录下的文件。然后我们开始注意到一个名为networkd-dispatcher的systemd 单元中的有趣模式。networkd-dispatcher的目标是调度网络状态变化,并根据新状态选择执行不同的脚本。有趣的是,它以 root 身份在启动时运行:

CVE-2022-29800 微软发现新的Linux提权漏洞Nimbuspwn
图 2:以 root 身份运行的 networkd-dispatcher

网络调度程序的代码流

在检查 networkd-dispatcher源代码后,我们注意到一个有趣的流程:

  1. 注册函数为系统总线上的服务“ org.freedesktop.network1 ”注册一个新的信号接收器,信号名称为“ PropertiesChanged ”。
  2. “ _receive_signal ”信号处理程序将对正在发送的对象类型执行一些基本检查,根据正在发送的对象路径总结更改的网络接口,然后总结其新状态——“ OperationalState ”和“ AdministrativeState ”——每个都从数据。对于这些状态中的任何一个——如果它们不为空——“ handle_state ”方法将被调用。
  3. “ handle_state ”方法只是为这两个状态中的每一个调用“ _handle_one_state ”。
  4. “ _handle_one_state ” 验证状态不为空,并检查它是否与之前的状态不同。如果是,它将更新新状态并调用“ _run_hooks_for_state ”方法,该方法负责发现和运行新状态的脚本。
  5. “ _run_hooks_for_state ”实现如下逻辑:
    • 通过调用“ get_script_list ”方法(以字符串形式获取新状态)发现脚本列表。该方法简单地调用“ scripts_in_path ”,旨在返回“/etc/networkd-dispatcher/<state>.d”下的所有文件,这些文件属于root用户和root组,并且是可执行的。
    • 对脚本列表进行排序。
    • 使用subprocess.Popen运行每个脚本,同时提供自定义环境变量。
CVE-2022-29800 微软发现新的Linux提权漏洞Nimbuspwn
图 3:_run_hooks_for_state 源代码——为简洁起见省略了一些部分

第 5 步有多个安全问题:

  1. 目录遍历CVE-2022-29799 ):流程中的任何函数都不能清理OperationalStateAdministrativeState。由于状态用于构建脚本路径,因此状态可能包含目录遍历模式(例如“ ../../ ”)以从“ /etc/networkd-dispatcher ”基本目录中逃脱
  2. 符号链接竞赛:脚本发现和subprocess.Popen都遵循符号链接。
  3. Time-of-check-time-of-use ( TOCTOU ) 竞争条件 ( CVE-2022-29800 ):在发现脚本和运行脚本之间有一定的时间。攻击者可以利用此漏洞将networkd-dispatcher认为属于root 的脚本替换为不属于root 的脚本。
CVE-2022-29800 微软发现新的Linux提权漏洞Nimbuspwn
图 4:在“scripts_in_path”方法中构建脚本列表,包括“subdir”中毒的易受攻击的代码。

Exploitation(利用)

让我们假设一个对手有一个可以发送任意信号的恶意 D-Bus 组件。因此,攻击者可以执行以下操作:

  1. 准备一个目录“ /tmp/nimbuspwn ”并植入一个符号链接“ /tmp/nimbuspwn/poc.d ”以指向“ /sbin ”。之所以选择“/sbin”目录,是因为它有许多 root 拥有的可执行文件,如果在没有附加参数的情况下运行,这些可执行文件不会阻塞。这将滥用我们之前提到的符号链接竞争问题。
  2. 对于root拥有的“ /sbin ”下的每个可执行文件名,在“ /tmp/nimbuspwn ”下植入相同的文件名。例如,如果“ /sbin/vgs ”是可执行文件并归根用户所有,则使用所需的有效负载植入一个可执行文件“ /tmp/nimbuspwn/vgs ”。这将帮助攻击者赢得TOCTOU漏洞强加的竞争条件。
  3. 发送带有OperationalState “../../../tmp/nimbuspwn/poc”的信号。这滥用了目录遍历漏洞,逃逸了脚本目录。
  4. networkd-dispatcher 信号处理程序启动并从目录“/etc/networkd-dispatcher/../../../tmp/nimbuspwn/poc.d”构建脚本列表,这实际上是符号链接(“/ tmp/nimbuspwn/poc.d”),它指向“/sbin”。因此,它创建了一个由 root 拥有的许多可执行文件组成的列表。
  5. 快速将符号链接“ /tmp/nimbuspwn/poc.d”更改为指向“ /tmp/nimbuspwn ”。这滥用了TOCTOU 竞争条件漏洞——脚本路径在 networkd -dispatcher不知情的情况下发生变化。
  6. 调度程序开始运行最初位于“ /sbin ”但实际上位于“ /tmp/nimbuspwn ”目录下的文件。由于调度程序“相信”这些文件由 root 拥有,它以 root 身份使用 subprocess.Popen 盲目地执行它们。因此,我们的攻击者成功地利用了该漏洞。

请注意,为了高概率赢得TOCTOU竞争条件,我们植入了许多可能运行的文件。我们的实验表明,3 次尝试足以赢得TOCTOU比赛条件

CVE-2022-29800 微软发现新的Linux提权漏洞Nimbuspwn
图 5:三个阶段的攻击流程图

由于我们不希望每次以root身份运行时都运行exploit,因此我们最终实现的payload会留下一个root后门:

  1. 将/bin/sh复制到/tmp/sh
  2. 将新的/tmp/sh转换为Set-UID (SUID) 二进制文件
  3. 运行/tmp/sh -p。“ -p ”标志是必要的,因为现代 shell 在设计上放弃了特权。

拥有bus名称

精明的读者会注意到,假设我们的漏洞利用代码可以拥有“ org.freedesktop.network1 ”总线名称,整个漏洞利用会提升特权。虽然这听起来不简单,但我们发现了几个发生这种情况的环境。具体来说:

  1. 在许多环境(例如 Linux Mint)中,通常拥有“ org.freedesktop.network1 ”总线名称的服务systemd-networkd默认情况下不会在引导时启动。
  2. 使用Microsoft Defender for Endpoint 中的高级搜索,我们能够发现多个进程作为systemd-network用户(允许拥有我们需要的总线名称)从世界可写位置运行任意代码。其中包括几个gpgv插件(在apt-get安装或升级时启动)以及允许在某些情况下运行任意代码的 Erlang Port Mapper Daemon ( epmd )。

我们使用的查询也可以由 Microsoft Defender 为 Endpoint 客户运行:

DeviceProcessEvents
| where Timestamp > ago(5d)
    and AccountName == "systemd-network"
    and isnotempty(InitiatingProcessAccountName)
    and isnotempty(FileName)
| project DeviceId, FileName, FolderPath, ProcessCommandLine

因此,我们能够利用这些场景并实现我们自己的漏洞利用:

CVE-2022-29800 微软发现新的Linux提权漏洞Nimbuspwn
图 6:我们的漏洞利用实现并赢得了 TOCTOU 比赛

虽然能够以 root 身份运行任意脚本,但我们的漏洞利用将/bin/sh复制到/tmp目录,将/tmp/sh设置为Set-UID (SUID) 可执行文件,然后调用“ /tmp/sh -p ”。请注意,“ – p ”标志对于强制 shell 不放弃特权是必要的

加固设备安全与检测策略

尽管不断演变的威胁环境会定期提供新的威胁、技术和攻击能力,但攻击者仍会继续专注于识别和利用未修补的漏洞和错误配置,作为访问系统、网络和敏感信息以用于恶意目的的媒介。这种跨越广泛平台、设备和其他领域的持续轰炸式攻击强调了对全面和主动的漏洞管理方法的需求,该方法可以进一步识别和缓解以前未知的漏洞利用和问题。

Microsoft 的威胁和漏洞管理功能可帮助组织监控其整体安全状况,通过持续的漏洞发现、情境化智能优先级和无缝的一键式漏洞修复提供对风险的实时洞察。利用我们对 Nimbuspwn 漏洞的研究来改进解决方案,我们的威胁和漏洞管理已涵盖 CVE-2022-29799 和 CVE-2022-29800,并在Microsoft Defender for Endpoint的威胁和漏洞模块中指出此类易受攻击的设备。

为了解决具体的漏洞,Microsoft Defender for Endpoint 的端点检测和响应 (EDR)功能检测利用 Nimbuspwn 所需的目录遍历攻击。此外,Microsoft Defender for Endpoint 检测团队对可疑的 Set-UID 进程调用进行了通用检测,该检测在没有先验知识的情况下检测到我们的漏洞利用。

CVE-2022-29800 微软发现新的Linux提权漏洞Nimbuspwn
图 7:Microsoft Defender for Endpoint 检测到我们的漏洞利用中使用的可疑 SUID 进程

防御不断变化的威胁形势需要保护和保护用户计算体验的能力,无论是 Windows 还是非 Windows 设备。Microsoft 通过每天保护所有主要平台上的用户和组织的强大研究不断丰富我们的保护技术。该案例展示了通过专家跨行业协作来协调此类研究的能力对于有效缓解问题至关重要,无论使用的易受攻击的设备或平台如何。通过分享我们的研究和其他形式的威胁情报,我们可以继续与更大的安全社区合作,努力为所有人建立更好的保护。

Jonathan Bar Or

Microsoft 365 Defender Research Team

from

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注