技术的迅速崛起对熟练的开发人员提出了很高的要求。开放源码软件(OSS)已成为这支日益壮大的队伍的重要工具。目前,在各种编程语言中存在数十万个成熟的开放源码软件包。超过 90% 的开发人员在其专有应用程序中使用这些开放源码组件,凸显了开放源码软件的效率和价值主张。全球开源软件市场预计到 2030 年将达到 807 亿美元,年增长率预计为 16.7%,这进一步凸显了开源软件的重要性。
软件 是全球业务运营不可或缺的组成部分,因此经常成为威胁行为者的攻击目标。2023 年,应用安全支出约为 57.6 亿美元,预计 2024 年将达到 66.7 亿美元。在应用安全领域,软件供应链安全在过去三年中日益突出,成为增长最快的攻击类别,重大漏洞和漏洞利用事件经常成为头条新闻。
企业通常认为,大多数风险都来自面向公众的网络应用程序。然而,近年来这种观点发生了转变。由于每个应用程序中都有数十个小型组件,风险现在可能出现在代码库中的任何地方。对于企业来说,熟悉软件开发生命周期中现有和新出现的安全漏洞比以往任何时候都更为重要。在这篇博文中,我们的研究生研究员将详细介绍 CVE-2023-23924,这是一个在广泛使用的 dompdf 库中发现的关键安全漏洞,该库是一个功能强大的 PHP 工具,可通过 HTML 和 CSS 动态生成 PDF 文档。
通过全面分析,我们将探索该漏洞错综复杂的技术细节、发挥关键作用的相关技术以及利用过程的模拟。我们还将研究 OPSWAT MetaDefender Core,特别是其 软件 Bill of Materials (SBOM)引擎可用于检测和缓解这一漏洞,使软件开发人员和安全团队能够在潜在威胁面前领先一步。
CVE-2023-23924 的背景
在 dompdf 2.0.1 版中发现了一个安全漏洞,并于 2023 年初公布于众:
- 在解析 SVG 时,可以通过传递
<image>
标记为大写字母。通过 PHAR URL 封装器,该漏洞可导致任意文件删除,甚至远程代码执行,具体取决于可用的类。 - NVD 分析师将 CVE-2023-23924 的 CVSS 分值定为9.8 CRITICAL。
了解 Dompdf 漏洞
要完全理解 dompdf 中的 CVE-2023-23924 漏洞,就必须熟悉两种密切相关的技术:可缩放矢量图形 (SVG) 和 PHAR 文件。
SVG(可缩放矢量图形)是一种通用的图像格式,由于能在网络上呈现高质量的图形,同时保持轻量级和可缩放性,因此广受欢迎。与光栅图像不同,SVG 基于 XML 标记,可以精确控制线条、形状和文本等元素。SVGs 的主要优势之一是能够无缝缩放而不损失图像质量,因此非常适合响应式网页设计和高分辨率显示器。
PHAR(PHP 归档文件)类似于 JAR 文件的概念,但适用于 PHP。它可以将所有 PHP 代码和资源文件捆绑到一个存档文件中,从而方便部署。
PHAR 文件由 4 个部分组成:
- 存根:包含引导存档的代码。
- Manifest:包含存档的元数据。元数据以序列化格式存储,可用于在恶意 PHAR 文件中触发 PHP 反序列化攻击。
- 文件内容:包含存档内容,包括 PHP 代码和资源文件。
- 签名(可选):包含用于验证文件完整性的数据。
由于元数据是以序列化格式存储的,当 PHAR 封装器和 PHAR 文件的元数据组合用作 PHP 函数的输入时,有可能触发反序列化攻击,例如 file_get_contents()、fopen()、file()、file_exists()、md5_file()、filemtime()、
或 文件大小()
.这一安全漏洞可使攻击者通过 PHAR 文件执行远程代码。
Dompdf 如何生成 PDF 文件
通过分析,OPSWAT 研究生发现 dompdf 的转换过程分为三个阶段。要将 HTML 文件转换为 PDF 格式,dompdf 库首先要将输入文件解析为 DOM 树,并存储每个对象的定位和布局信息。然后,解析 CSS 样式并将其应用于每个对象。最后,重新组织对象以适应页面,并渲染成最终的 PDF 文件。
为了提高安全性,dompdf 实施了验证,以确保 URI 输入的安全性,然后再进行下一步。这一验证过程在处理 SVG 文件时非常明显。 xlink:href
属性。
如果 SVG 输入文件包含 <image>
标签下的 <svg>
标签,实施一个条件,只允许某些协议,如 http://
, https://
和 file://
为 xlink:href
field.
"(《世界人权宣言》) resolve_url()
函数将验证 URI,然后再用 drawImage()
功能。如果 URI 中的方案不在允许的协议之列,则 resolve_url()
函数将向应用程序返回一个异常。
如果 URI 通过了验证,它将被传递给 drawImage()
函数,该函数使用 file_get_contents()
函数来处理 xlink:href
属性。安全漏洞就出现在这一点上:如果攻击者绕过验证并将 PHAR 封装器传递到 URI 中,就可能触发 PHAR 反序列化攻击。
经过分析,我们发现只有在标签名称与图像完全一致时才会执行验证。
因此,只要在标签名称(如 Image)中将一个或多个字符大写,就可以轻松绕过验证。因此,特制的 SVG 文件如果使用 Image 而不是 image,就可以规避这一验证。
在随后的步骤中 drawImage()
函数,将 SVG 文件的 URI 传递给 file_get_contents()
功能。因此,结合对 PHAR 文件的验证绕过和反序列化攻击,攻击者可以执行远程代码执行。如果 SVG 文件是由存在漏洞的 dompdf 版本处理的,那么该漏洞就会为恶意攻击者通过 SVG 文件控制应用程序服务器打开大门。
Dompdf 开发模拟
为了模拟现实世界中的这种利用情况,OPSWAT 研究生研究员开发了一个网络应用程序,使用 dompdf 库 2.0.1 版将 HTML 转换为 PDF。该应用程序允许用户上传 HTML、XML 或 SVG 等文件类型,然后将其转换为 PDF 文件。
攻击者可按照以下步骤,在使用易受攻击的 dompdf 版本(2.0.1 版)的应用程序中利用此漏洞:
首先,攻击者会生成一个恶意对象,在调用析构函数时创建一个反向外壳。
其次,攻击者会创建一个包含恶意元数据对象的 PHAR 文件。当 PHAR 封装器在 file_get_content()
函数,对元数据进行反序列化,并处理指定对象。在反序列化过程中,它会触发析构函数并执行反向 shell。
最终,攻击者会将包含 PHAR 封装器的 URI 链接嵌入到 xlink:href
属性,从而绕过验证、执行恶意代码并将该恶意文件上传到应用程序。
在处理上传的恶意 SVG 文件时,应用程序会与攻击者建立反向连接,使他们能够入侵应用程序服务器。
利用OPSWAT MetaDefender Core
为了检测和缓解 dompdf 中的 CVE-2023-23924 漏洞,我们的研究生研究员使用了OPSWAT MetaDefender Core ,这是一款多层网络安全产品,提供先进的恶意软件预防和检测技术,包括 SBOM。
OPSWAT SBOM 通过为源代码和容器提供全面的组件清单来确保软件供应链的安全。通过分析 dompdf 库及其依赖关系,OPSWAT SBOM 可以快速识别存在漏洞的 2.0.1 版本,并提醒用户注意潜在风险。
此外,OPSWAT SBOM 还能检测 SVG 和 PHAR 文件等相关技术,这些技术对于了解和缓解 CVE-2023-23924 漏洞至关重要。这种对应用程序软件组件的全面了解使安全团队能够做出明智的决策,并采取适当的措施来应对已识别的风险。
除了检测存在漏洞的 dompdf 版本外,OPSWAT SBOM 还能提供有关受影响组件、其版本以及任何可用更新或补丁的宝贵信息。安全团队可以利用这些信息确定修复工作的优先次序,确保应用程序更新到安全的 dompdf 版本,从而有效解决 CVE-2023-23924 漏洞。
通过利用MetaDefender Core 中的 SBOM 引擎,企业可以主动监控其软件供应链,识别开源组件中的潜在漏洞,并及时实施缓解策略,从而确保其应用程序的整体安全性和完整性。
结束语
在 dompdf 库中发现 CVE-2023-23924 强调了在应用程序安全的动态环境中保持警惕的重要性。通过利用本篇博文中概述的见解和策略,安全团队可以有效地检测、缓解和保护其应用程序免受此类漏洞的侵害,从而确保其软件生态系统的整体安全性和完整性。