作者:xxhzz@星闌科技PortalLab
原文鏈接:https://mp.weixin.qq.com/s/zS2TBfBsK1gzkLxs5u3GmQ

項目介紹

Apache Flume 是一個分布式的,可靠的,并且可用于高效地收集,匯總和移動大量日志數據的軟件。它具有基于流數據流的簡單而靈活的體系結構。它具有可調的可靠性機制以及許多故障轉移和恢復機制,并且具有健壯性和容錯性。它使用一個簡單的可擴展數據模型,該模型允許進行在線分析應用程序。

漏洞描述

在7月22日,Apache發布安全公告,修復了一個存在于Apache Flume中的遠程代碼執行漏洞,CVE編號為CVE-2022-34916。當攻擊者控制目標 LDAP 服務器時,如果配置使用帶有 JNDI LDAP 數據源 URI 的 JMS 源,Apache Flume 版本 1.4.0 到 1.10.0 很容易受到遠程代碼執行 (RCE) 攻擊。

利用范圍

1.4.0 <= Apache Flume <= 1.10.0

漏洞分析

環境搭建

從GitHub上下載1.10.0版本,導入IDEA。

項目jdk使用1.8,然后修改TestIntegrationActiveMQ 測試類中的DESTINATION_NAME,因為destinationName是由DESTINATION_NAME 定義;修改JNDI_PREFIX為ldap://

圖片

在JMSMessageConsumerTestBase.java中將destinationLocator = JMSDestinationLocator.CDI;修改為destinationLocator = JMSDestinationLocator.JNDI;

圖片

最后運行TestIntegrationActiveMQ 測試類即可。

漏洞原理

根據Apache Flume漏洞描述,可以確定問題是出現在了JMSMessageConsumer中。

圖片

查看DIff(https://github.com/apache/flume/commit/7fe9af49) 記錄發現,修復方式是在JMSMessageConsumer中的else分支下,在initialContext.lookup(destinationName)前新增了對destinationName的校驗。

圖片

那么漏洞觸發點已經很明確了,在沒有增加校驗前,只要進入JMSMessageConsumer中else分支,控制destinationName參數,即可實現JNDI注入。

代碼分析

知道了漏洞原理后,分析一下代碼。

首先在TestJMSMessageConsumer#testCreateDurableSubscription 初始化了 JMSMessageConsumer 并傳入 destinationLocator

圖片

destinationLocator的定義是在JMSMessageConsumerTestBase.java中。

圖片

在搭建環境時,我們是將destinationLocator = JMSDestinationLocator.CDI;修改為了destinationLocator = JMSDestinationLocator.JNDI;圖片

這樣配置,是為了在JMSMessageConsumer中不滿足if條件后,能夠進入到else,到達漏洞觸發點。

而在官方提供的測試類中,TestIntegrationActiveMQ 類存在 testQueueLocatedWithJndi,將作為source點傳入參數。

圖片

修改DESTINATION_NAME為惡意JNDI地址,將JNDI_PREFIX修改為ldap://

圖片

通過參數的傳入,經過如上分析的流程,到達else后,由于沒有校驗,直接觸發initialContext.lookup,造成JNDI注入,從而執行惡意遠程代碼。

漏洞復現

圖片

修復建議

官方已發布安全版本,請盡快更新至安全版本,下載鏈接:https://flume.apache.org/download.html

參考材料

1.https://github.com/apache/flume/commit/7fe9af49

2.https://issues.apache.org/jira/browse/FLUME-3428


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1976/