人工智能黑客--黑客如何在网络攻击中使用人工智能

立即阅读
我们利用人工智能进行网站翻译,虽然我们力求准确,但不一定总是 100%精确。感谢您的理解。

在 Spring 中保护 Apache Kafka 免受反序列化攻击

OPSWAT
分享此贴
Nguyen Phu Hung 和 Tran Anh Huy 的专业形象,代表他们与 HUTECH 和胡志明市科学大学的关系。

反序列化攻击--未经授权操纵序列化数据以执行恶意代码--会给企业带来严重损害。开发人员和安全团队必须主动识别关键漏洞,以揭示攻击发生的方式、时间和地点。  

这种威胁的最近一个例子是 CVE-2023-34040,这是 Spring for Apache Kafka 中的一个反序列化攻击向量,可导致 RCE(远程代码执行)。事实上,OWASP Top 10 列表强调了反序列化漏洞的普遍性,该列表将 "不信任数据的反序列化 "列为十大最关键网络应用程序安全风险之一。  

OPSWAT MetaDefender Core™等工具及其 SBOM软件 物料清单)引擎对于检测和预防反序列化攻击至关重要。这些工具使开发人员能够高效地扫描和分析他们的代码,确保不会忽略任何漏洞。  

在本博客中,我们的研究生研究员将讨论 CVE-2023-34040 的细节及其利用方法,以及如何保护开源组件免受类似威胁。 

关于 CVE-2023-34040

CVE-2023-34040 揭示了 Spring for Apache Kafka 中的一个反序列化攻击向量,当应用异常配置时可利用该向量。该漏洞允许攻击者在其中一个反序列化异常记录头中构建恶意序列化对象,从而导致 RCE。该漏洞影响 Spring for Apache Kafka 2.8.1 至 2.9.10 版和 3.0.0 至 3.0.9 版。

显示漏洞 CVSS 3.x 严重性评分的截图,其中包括 NIST 和 VMware 提供的高风险和中等风险级别。

具体来说,在以下特定配置和条件下,应用程序/消费者容易受到攻击: 

  • 未针对记录的键和/或值配置 ErrorHandlingDeserializer 类。 
  • 消费者的 checkDeserExWhenKeyNull 和/或 checkDeserExWhenValueNull 属性被设置为 true。 
  • 允许不受信任的来源发布到 Kafka 主题。

Apache Kafka

Apache Kafka 由 Apache软件 基金会开发,是一个分布式事件流平台,旨在捕获、处理、响应和路由来自数据库、传感器和mobile 设备等各种来源的实时数据流。 

例如,它可以向对客户活动(如完成产品结账或付款)做出反应的服务发送流式通知。

基于 Apache Kafka 的数据处理管道图,将产品微服务与短信、推送通知和电子邮件微服务连接起来。

在 Apache Kafka 中,事件(也称作记录或消息)是一个数据单元,每当数据被读取或写入时,它就代表应用程序中发生的事件。每个事件包括键、值、时间戳和可选的元数据头。

二进制密钥
(可以为空)
二进制值
(可以为空)
压缩类型
[无、gzip、snappy、lz4、zstd]
页眉(可选)
钥匙价值
钥匙价值
分区 + 偏移
时间戳(系统或用户设置)

事件被持久存储并组织成主题。向 Kafka 主题发送(写入)事件的客户端应用程序称为生产者,而订阅(读取和处理)事件的客户端应用程序称为消费者。 

流程图显示用户输入如何通过生产者处理、记录、消费并传送到终端。

Spring for Apache Kafka

要将 Apache Kafka 与 Spring 生态系统连接起来,开发人员可以使用 Spring for Apache Kafka,它可以简化 Java 应用程序中的集成。  

Spring for Apache Kafka 提供了强大的工具和应用程序接口,简化了使用 Kafka 发送和接收事件的过程,使开发人员无需进行大量复杂的编码即可完成这些任务。

一个显示 Spring Boot 和 Apache Kafka 徽标的图形,标志着事件驱动型应用程序的集成。

序列化和反序列化

序列化是一种将对象状态转换为字符串或字节流的机制。与此相反,反序列化是一个相反的过程,在这个过程中,序列化数据被转换回其原始对象或数据结构。序列化允许对复杂数据进行转换,以便将其保存到文件中、通过网络发送或存储到数据库中。序列化和反序列化对分布式系统中的数据交换至关重要,可促进软件应用程序各组件之间的通信。在 Java 中,writeObject() 用于序列化,readObject() 用于反序列化。

显示数据对象如何序列化到内存、文件或数据库,然后再反序列化回对象的技术图表。

由于反序列化允许将字节流或字符串转换为对象,如果处理不当或缺乏对输入数据的适当验证,就会造成严重的安全漏洞,可能导致 RCE 攻击。

脆弱性分析

根据 CVE 描述,OPSWAT 研究员将checkDeserExWhenKeyNullcheckDeserExWhenValueNull配置为 true,以触发安全漏洞。通过发送键/值为空的记录,并在消费者从生产者接收 Kafka 记录时调试消费者进行详细分析,我们的研究生发现了记录处理过程中的以下工作流程: 

步骤 1:接收记录(信息)

接收到记录后,消费者会调用invokeIfHaveRecords()方法,然后调用invokeListener()方法来触发已注册的记录监听器(使用@KafkaListener注解注解的类),以便对记录进行实际处理。 

定义 Kafka 消息监听器容器的 Java 代码截图,该容器用于处理事件驱动系统中的记录。

invokeListener()会调用invokeOnMessage()方法。

步骤 2:检查记录

invokeOnMessage()方法中,会根据记录值和配置属性对几个条件进行评估,然后确定要执行的下一步。

高亮显示的 Java 代码片段,演示了 Kafka 消费者中消息反序列化的异常处理。

如果记录的键或值为空,且checkDeserExWhenKeyNull和/或checkDeserExWhenValueNull属性被明确设置为true,则会调用checkDeser()方法来检查记录。

步骤 3:从标头检查异常

checkDesr() 中,消费者会不断调用getExceptionFromHeader()从记录的元数据(如果存在)中获取任何异常,并将结果存储在一个名为exception 的变量中。

Java 方法 checkDeser 调用 getExceptionFromHeader 来处理 Kafka 消息处理过程中的反序列化异常。

步骤 4:从标头中提取异常

getExceptionFromHeader()方法用于从 Kafka 记录的头中提取并返回异常。它首先检索记录的头,然后获取头的值,该值存储在一个字节数组中。

Java 方法 getExceptionFromHeader 从 Kafka 报文头中提取反序列化异常

随后,它会将标头值的字节数组转发给byteArrayToDeserializationException()方法,以便进一步处理。 

步骤 5:数据反序列化

byteArrayToDeserializationException() 中,resolveClass()函数被重载,以限制只对允许的类进行反序列化。这种方法可以防止对任何未明确允许的类进行反序列化。头的字节数组值只有在满足resolveClass() 中设置的条件时,才能在byteArrayToDeserializationException () 中进行反序列化,而 resolveClass() 只允许对DeserializationException类进行反序列化。

Java 方法 byteArrayToDeserializationException 将字节数组转换为反序列化异常

然而,DeserializationException类扩展了标准异常类,并包含一个有四个参数的构造函数。最后一个参数是cause,表示触发DeserializationException 的原始异常,如IOExceptionClassNotFoundException

DeserializationException 的 Java 构造函数,包含消息、数据、关键标志和可抛出原因的参数

Throwable类是 Java 中所有可作为异常或错误抛出的对象的超类。在 Java 编程语言中,ThrowableExceptionError等异常处理类可以安全地进行反序列化。在对异常进行反序列化时,Java 允许加载和实例化Throwable类的父类,其检查要求比普通类要低。 

根据工作流程和综合分析,如果序列化数据对应的恶意类继承自父类Throwable,则可能绕过条件检查。这样就可以反序列化恶意对象,从而执行有害代码,并可能导致 RCE 攻击。

剥削

从攻击者注入恶意数据到远程代码执行的网络攻击利用过程示意图

如分析所示,利用该漏洞需要生成通过 Kafka 头记录发送给消费者的恶意数据。首先,攻击者必须创建一个扩展Throwable类的恶意类,然后利用小工具链实现远程代码执行。小工具是应用程序中可利用的代码片段,通过将它们串联在一起,攻击者可以达到触发有害操作的 "汇小工具"。 

以下是一个恶意类,可用于利用 Spring for Apache Kafka 中的这一漏洞: 

Java 类 CustomExceptionClass 演示了使用 PowerShell 命令执行有效载荷的漏洞

然后,创建恶意类的实例,并将其作为参数传递给DeserializationException类构造函数中的原因参数。然后,DeserializationException 实例被序列化为字节流,随后被用作恶意 Kafka 记录头部的值。

用于构建恶意序列化对象以进行反序列化利用的 Java 类
Java 方法 sendMessage 构建并发送 Kafka 消息,如果 key 和 data 均为空,则注入恶意序列化有效载荷

如果攻击者成功欺骗受害者使用他们的恶意生产者,他们就能控制发送到消费者的 Kafka 记录,从而有机会入侵系统。 

用于发送 Kafka 消息的用户界面,显示消息表单和从两个生产者收到的消息

当有漏洞的消费者从恶意生产者处接收到包含空键和空值的 Kafka 记录以及记录头中的恶意序列化实例时,消费者就会处理该记录,包括反序列化过程。这最终会导致远程代码执行,使攻击者能够入侵系统。

终端和 Kafka 消息发送器用户界面,演示在 Windows 环境中通过执行命令注入消息

利用MetaDefender Core中的 SBOM 缓解 CVE-2023-34040

为了有效降低与 CVE-2023-34040 相关的风险,企业需要一个全面的解决方案,对其开源组件提供可见性和控制。  

SBOM 是MetaDefender Core 的一项基础技术,它提供了一个强大的答案。SBOM 是所有使用中的软件组件、库和依赖关系的综合清单,它使企业能够以积极有效的方式跟踪、保护和更新其开源组件。

显示被封堵的 XML 文件的仪表板截图,该文件存在严重和高危漏洞

借助 SBOM,安全团队可以

  • 快速定位易受攻击的组件:立即识别受反序列化攻击影响的开源组件。这可确保迅速采取行动,修补或替换易受攻击的库。 
  • 确保主动修补和更新:通过 SBOM 持续监控开源组件,提前发现反序列化漏洞。SBOM 可以检测过时或不安全的组件,从而及时更新并减少遭受攻击的风险。 
  • 保持合规性和报告:随着监管框架对软件供应链透明度的要求越来越高,SBOM 可帮助企业满足合规性要求。

结束语

反序列化漏洞是一个重大的安全威胁,可被用于利用各种应用程序。这些漏洞发生在应用程序反序列化恶意数据时,允许攻击者执行任意代码或访问敏感信息。Spring for Apache Kafka 中的 CVE-2023-34040 漏洞就是对反序列化攻击危险性的有力提醒。 

为防止反序列化攻击,必须实施OPSWAT MetaDefender Core 及其 SBOM 技术等先进工具。企业可以深入了解其软件供应链,确保及时修补漏洞,并保护自己免受不断变化的威胁。主动保护开源组件不仅是最佳实践,也是保护现代系统免遭潜在利用的必要条件。


标签

通过OPSWAT 了解最新信息!

立即注册,即可收到公司的最新动态、 故事、活动信息等。