摘要

本報告提供對Apache Tomcat及Apache Camel近期發現的漏洞進行深入技術分析,特別是CVE-2025-24813、CVE-2025-27636及CVE-2025-29891。本報告詳細說明這些漏洞的機制、攻擊方法,並檢查相關原始碼片段及架構圖,以闡述其底層技術缺陷。本報告旨在增進對這些關鍵安全問題及其對系統安全的影響的理解。

Apache資安破口揭秘:Tomcat與Camel漏洞如何危害你的系統 | 資訊安全新聞

1. 簡介

Apache軟體,包括Tomcat和Camel,是全球眾多網頁應用程式及整合解決方案的基礎。其廣泛採用使得任何發現的漏洞尤其關鍵,因為它們可能對各種系統產生深遠影響。2025年3月,Apache披露了三個重大漏洞:影響Apache Tomcat的CVE-2025-24813,以及影響Apache Camel的CVE-2025-27636和CVE-2025-29891 [1]。這些缺陷若被利用,可能導致遠端程式碼執行,對受影響系統的完整性和機密性構成重大風險。本報告深入探討這些漏洞的技術細節,利用原始披露的洞察,並分析提供的架構和程式碼圖表,以全面了解其性質和利用方式。

2. CVE-2025-24813: Apache Tomcat Partial PUT漏洞

2.1. 漏洞概述

CVE-2025-24813是Apache Tomcat的Partial PUT功能中的一個關鍵漏洞。此漏洞允許攻擊者覆寫磁碟上的序列化session檔案,最終可能導致任意程式碼執行。其根本原因在於未修補的Tomcat系統如何處理包含 Content-Range 標頭的Partial PUT request,特別是在設定為持久化HTTP session資料時 [1]。

Partial PUT是指旨在僅更新資源某部分的HTTP PUT request,而非完全替換資源。此機制通常使用 Content-Range 標頭來指定要修改的資源確切部分。雖然這對於增量更新很有用,但若未安全處理,Partial PUT可能被利用來覆寫特定檔案部分或繞過安全檢查 [1]。

Apache Tomcat的HTTP session管理器包含session持久化功能,旨在於伺服器關閉時將session資料儲存至檔案或資料庫,並在重新啟動時重新載入。這確保了使用者登入狀態和偏好設定在伺服器重啟後得以保留。Tomcat將此session資料序列化為位元組流,並儲存在本機檔案系統中,通常位於 $TOMCAT_HOME/webapps/ROOT/ 下。此序列化資料包括網頁應用程式使用 session.setAttribute() 明確設定的所有session屬性 [1]。

漏洞的產生是因為儲存序列化session資料的目錄也由Tomcat的 executePartialPut 功能使用。攻擊者可以操縱session ID及此目錄中快取資料的檔案名稱。通過精心設計的HTTP request,攻擊者可將session ID設定為與包含惡意程式碼的快取檔案名稱匹配。此操作可能導致快取檔案的反序列化,從而執行嵌入的惡意程式碼 [1]。

2.2. 攻擊前提條件

利用CVE-2025-24813需要在Tomcat設定中滿足特定前提條件。HTTP PUT request中包含 Content-Range 標頭至關重要,因為它向Tomcat表明僅更新資源的一部分。如果此標頭存在,Tomcat會將PUT request的內容儲存至快取位置。有漏洞的Tomcat設定的主要前提條件包括 [1]:

  • Tomcat設定檔案( $TOMCAT_HOME/conf/web.xml )中的 readonly 參數必須停用(設為 false )。這允許對目錄的寫入操作。
  • 在Tomcat設定檔案(例如 $TOMCAT_HOME/conf/context.xml )中必須啟用session持久化,通常使用 PersistentManager FileStore 進行設定。
  1. <init-param>
  2. <param-name>readonly</param-name>
  3. <param-value>false</param-value>
  4. </init-param>
  5. <manager classname="org.apache.catalina.session.PersistentManager">
  6. <store classname="org.apache.catalina.session.FileStore"></store>
  7. </manager>

2.3. 攻擊程序

利用CVE-2025-24813通常涉及兩步程序,如圖1所示 [1]:

圖1. 攻擊的兩個步驟。
圖1. 攻擊的兩個步驟 [1]。

2.3.1. 步驟1:準備序列化的惡意程式碼

第一步涉及準備惡意payload。這通過發送包含序列化惡意程式碼作為主體的HTTP PUT request實現。該 request的URI必須包含自定義的檔案名稱,以 .session 結尾。Apache Tomcat在接收到此 request後,將惡意程式碼快取為本機檔案系統上的session檔案。圖2展示了一個使用 gopan.session 作為檔案名稱的HTTP PUT request範例 [1]。

圖2. 步驟1中的Payload。
圖2. 步驟1中的Payload [1]。

此HTTP PUT request的格式通常為 PUT /_[filename]_.session HTTP/1.1 Content-Range 標頭在此至關重要,指示部分更新,觸發Tomcat對 request的漏洞處理 [1]。

2.3.2. 步驟2:觸發攻擊

第二步涉及觸發攻擊以執行準備好的惡意程式碼。這通過發送一個包含精心設計的cookie的後續HTTP GET request來完成。cookie,特別是 JSESSIONID ,必須緊跟一個點( . ),然後是步驟1中使用的自定義檔案名稱。例如,cookie行將顯示為 Cookie: "JSESSIONID=._[filename]_" 。這種特定的cookie格式導致Tomcat嘗試載入帶有前導點的session檔案,從而導致快取的惡意檔案反序列化並隨後執行任意程式碼 [1]。圖3展示了此HTTP GET request [1]。

圖3. 利用漏洞執行步驟1中發送的Payload。
圖3. 利用漏洞執行步驟1中發送的Payload [1]。

2.4. CVE-2025-24813的原始碼分析

2.4.1. Tomcat如何將PUT主體快取到檔案

漏洞的核心在於Tomcat的檔案快取機制。如圖4所示,Tomcat首先檢查其設定中的 readonly 標誌是否啟用。如果 readonly 為true,則不會將任何程式碼(包括惡意payload)寫入快取。然而,如果 readonly 被停用,Tomcat會檢查HTTP request中的 Content-Range 標頭。如果此標頭不存在,程序將終止。如果存在,Tomcat會將HTTP PUT request的session資料(例如 gopan.session )儲存在兩個不同的位置 [1]:

圖4. 第一步:從PUT到寫入檔案。
圖4. 第一步:從PUT到寫入檔案 [1]。
  • 作為不帶前導點的普通快取檔案,位於 $TOMCAT_HOME/webapps/ROOT/ 下。
  • 作為帶有前導點的暫存檔案,位於工作目錄 $TOMCAT_HOME/work/Catalina/localhost/ROOT/ 下。

圖5以視覺方式呈現這些快取session檔案位置 [1]。

圖5. 快取的session檔案。
圖5. 快取的session檔案 [1]。

關鍵的是,當Tomcat嘗試恢復session時,它也會從同一工作資料夾載入快取的session檔案。圖6和圖7展示了來自 java/org/apache/catalina/servlets/DefaultServlet.java 的相關程式碼片段,說明Tomcat在session恢復期間如何載入快取的session檔案 [1]。

圖6. Apache預設Java servlet的程式碼片段,供Tomcat使用。
圖6. Apache預設Java servlet的程式碼片段,供Tomcat使用 [1]。
圖7. Apache預設Java servlet的第二個程式碼片段,供Tomcat使用。
圖7. Apache預設Java servlet的第二個程式碼片段,供Tomcat使用 [1]。

2.4.2. 如何通過HTTP request觸發漏洞

當Tomcat接收到帶有session ID的HTTP request,且session持久化已啟用時,它首先嘗試在記憶體中定位session。如果在記憶體中找不到session,Tomcat會從儲存的快取檔案中恢復它。此時,session檔案的反序列化發生,如圖8所示 [1]。

圖8. 第二步:從sessionID到反序列化。
圖8. 第二步:從sessionID到反序列化 [1]。

圖8概述了Tomcat的session管理流程。負責定位session、從磁碟載入並反序列化其內容的程式碼主要實現在 java/org/apache/catalina/session/PersistentManagerBase.java java/org/apache/catalina/Store.java java/org/apache/catalina/session/FileStore.java 中 [1]。

圖9展示了來自 PersistentManagerBase.java 的程式碼片段,顯示Tomcat如何在session不在記憶體中時搜尋session資料檔案 [1]。

圖9. PersistentManagerBase.java的程式碼片段,用於在記憶體中找不到session時尋找session資料檔案。
圖9. PersistentManagerBase.java的程式碼片段,用於在記憶體中找不到session時尋找session資料檔案 [1]。

圖10和圖11進一步展示了來自同一 PersistentManagerBase.java 檔案的程式碼片段,詳細說明從快取檔案載入session資料的程序 [1]。

圖10. PersistentManagerBase.java的程式碼片段,用於從檔案載入session(1/2)。
圖10. PersistentManagerBase.java的程式碼片段,用於從檔案載入session(1/2) [1]。
圖11. PersistentManagerBase.java的程式碼片段,用於從檔案載入session(2/2)。
圖11. PersistentManagerBase.java的程式碼片段,用於從檔案載入session(2/2) [1]。

如圖11所示, store.load(id) 呼叫是觸發反序列化的關鍵點。此動作喚醒了攻擊者先前嵌入檔案中的惡意程式碼,導致任意程式碼執行。對原始碼的詳細分析揭示了Tomcat的session儲存機制如何與精心設計的HTTP PUT request結合,允許攻擊者儲存惡意程式碼,以及後續的HTTP GET request如何觸發其執行 [1]。

3. CVE-2025-27636和CVE-2025-29891:Apache Camel漏洞

3.1. Apache Camel概述

Apache Camel是一個開源整合框架,旨在促進不同系統之間可靠且可擴展的連線。它使開發者能夠使用各種特定領域語言定義路由和中介規則,從而整合多樣化的系統和應用程式。Camel支援廣泛的協議和技術,大多數訊息處理器以Java套件形式提供,允許開發者為其產品選擇特定組件 [1]。

3.2. 攻擊細節

HTTP,無論是否加密,都是網際網路上資料傳輸的常見方法。Apache Camel使用各種HTTP組件,例如Jetty和Netty。最終,Camel將解析的HTTP訊息返回其核心組件(即 camel-core )進行進一步處理。為管理Camel與其HTTP組件之間的資料交換,開發者使用鍵值對來儲存環境資訊,包括HTTP Response代碼。HTTP標頭也儲存在這些Key pairs中進行處理。為避免內部環境資訊與外部資料之間的衝突,Camel開發者為所有內部Context key引入了Camel前綴,並實現了一個過濾器以防止外部標頭引發問題 [1]。圖12展示了普通HTTP標頭與Apache Camel HTTP標頭的區別 [1]。

圖12. 普通HTTP標頭與Apache Camel HTTP標頭的比較。
圖12. 普通HTTP標頭與Apache Camel HTTP標頭的比較 [1]。

然而,此過濾機制的關鍵缺陷在於其對大小寫敏感。這允許攻擊者通過簡單更改標頭的大小寫來繞過過濾器,從而注入Camel原本試圖阻止的惡意標頭 [1]。

3.3. CVE-2025-27636和CVE-2025-29891的原始碼分析

預設情況下,Camel註冊了一個標頭過濾處理器,旨在忽略所有以 Camel camel org.apache.camel 開頭的標頭行。相關過濾程式碼位於 components/camel-http-base/src/main/java/org/apache/camel/http/base/HttpHeaderFilterStrategy.java 。圖13展示了此程式碼片段 [1]。

圖13. HttpHeaderFilterStrategy.java的程式碼片段,用於忽略特定標頭行。
圖13. HttpHeaderFilterStrategy.java的程式碼片段,用於忽略特定標頭行 [1]。

Camel列舉HTTP Request標頭,通過 applyFilterToExternalHeaders 函數處理它們,然後將這些標頭寫入內部映射。此程序由位於 components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpBinding.java 的程式碼處理,如圖14所示 [1]。

圖14. DefaultHttpBinding.java的程式碼片段。
圖14. DefaultHttpBinding.java的程式碼片段 [1]。

Camel的標頭過濾邏輯根據其設定使用不同的匹配策略。預設情況下,Camel使用 tryHeaderMatch 僅檢查標頭的開頭。此功能實現在 core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java 中,如圖15所示 [1]。

圖15. DefaultHeaderFilterStrategy.java的程式碼片段,顯示tryHeaderMatch。
圖15. DefaultHeaderFilterStrategy.java的程式碼片段,顯示tryHeaderMatch [1]。

漏洞源於此過濾器的大小寫敏感性。攻擊者可通過更改敏感標頭的大小寫(例如 CAmelExecCommandExecutable ,其中'A'為大寫)來繞過過濾器。如果開發者使用 camel-exec 套件, camel-exec 組件將讀取此惡意製作的標頭值並執行它。此執行通過位於 components/camel-exec/src/main/java/org/apache/camel/component/exec/impl/DefaultExecBinding.java 的程式碼進行,如圖16所示 [1]。

圖16. DefaultExecBinding.java的程式碼片段。
圖16. DefaultExecBinding.java的程式碼片段 [1]。

如果開發者設定了一個執行良性可執行檔案的端點,攻擊者可利用此漏洞將端點替換為危險命令,例如建立反向shell的命令。這允許攻擊者在有漏洞的系統上實現遠端程式碼執行 [1]。

4. 遙測與攻擊活動

2025年3月,觀察到與CVE-2025-24813(Apache Tomcat)和CVE-2025-27636、CVE-2025-29891(Apache Camel)相關的顯著攻擊活動。遙測資料識別了125,856次掃描、探測或攻擊嘗試。這些活動在2025年3月中旬漏洞披露後立即激增,並在第一週內達到高峰,如圖17所示 [1]。這些資料表明存在自動化掃描器和實際的攻擊活動。

圖17. 2025年3月檢測到的攻擊活動。
圖17. 2025年3月檢測到的攻擊活動 [1]。

4.1. 攻擊嘗試Payload

對捕獲的payload分析提供了攻擊者使用方法的洞察。對於CVE-2025-24813,初始HTTP PUT request範例顯示用於確定伺服器是否運行有漏洞的Tomcat版本的掃描或探測。如果成功,此攻擊通常導致受害伺服器嘗試聯繫外部應用程式安全測試(OAST)伺服器 [1]。圖18展示了這樣的HTTP PUT request [1]。

圖18. CVE-2025-24813攻擊的HTTP PUT  request。
圖18. CVE-2025-24813攻擊的HTTP PUT request [1]。

對於CVE-2025-27636,觀察到一個HTTP GET request payload,若成功,將使伺服器運行echo命令。此方法通常用於測試運行Apache Camel的伺服器,當攻擊者已獲得存取權並可觀察命令輸出時 [1]。圖19展示了此HTTP request [1]。

圖19. CVE-2025-27636的Apache Camel攻擊HTTP  request。
圖19. CVE-2025-27636的Apache Camel攻擊HTTP request [1]。

同樣,對於CVE-2025-29891,觀察到一個HTTP request,若成功,將促使有漏洞的伺服器聯繫OAST伺服器,類似於Tomcat攻擊 [1]。圖20展示了此HTTP request [1]。

圖20. CVE-2025-29891的Apache Camel攻擊HTTP  request。
圖20. CVE-2025-29891的Apache Camel攻擊HTTP request [1]。

4.2. CVE-2025-24813實際利用:Session名稱長度與Content-Range標頭

對CVE-2025-24813實際攻擊嘗試的進一步分析揭示了與session名稱長度和 Content-Range 標頭相關的有趣模式。此漏洞的攻擊通常在初始HTTP request中使用附加 .session 的檔案名稱,該檔案名稱包含待執行的惡意程式碼 [1]。

大多數session名稱前綴少於10個字元,最常見的長度為6個字元,如圖21所示 [1]。此模式在超過6,000次檢測中觀察到,並與 Content-Range 標頭值高度相關。

圖21. CVE-2025-24813攻擊嘗試中session名稱長度的趨勢。
圖21. CVE-2025-24813攻擊嘗試中session名稱長度的趨勢 [1]。

Content-Range 標頭是此漏洞的關鍵因素。圖22分類了在攻擊嘗試中觀察到的不同 Content-Range 值 [1]。標頭 Content-Range: bytes 0-452/457 在超過6,000次檢測中被記錄,與六字元session名稱模式直接相關。

圖22. CVE-2025-24813攻擊嘗試中觀察到的Content-Range值趨勢。
圖22. CVE-2025-24813攻擊嘗試中觀察到的Content-Range值趨勢 [1]。

這些發現與ProjectDiscovery的Nuclei Scanner在GitHub上的CVE-2025-24813模板模式一致。圖23突顯了這種相關性 [1]。攻擊者和防禦者廣泛使用此公開可用的掃描器,凸顯了這些漏洞被利用的便利性。

圖23. nuclei-templates GitHub儲存庫中的CVE-2025-24813模板片段。
圖23. nuclei-templates GitHub儲存庫中的CVE-2025-24813模板片段 [1]。

5. 結論

Apache Tomcat和Apache Camel漏洞(CVE-2025-24813、CVE-2025-27636和CVE-2025-29891)由於其遠端程式碼執行的潛力,代表了重大的安全風險。這些缺陷可通過精心設計的HTTP request利用,借助設定錯誤或標頭處理中的大小寫敏感性問題。本文提供的技術分析,包括對利用程序和相關原始碼片段的詳細檢查,突顯了這些漏洞的關鍵性質。實際觀察到的攻擊活動,經常使用公開可用的掃描工具,進一步強調了組織應用必要修補程式並實施穩健安全措施的迫切性,以減輕這些威脅並防止潛在的資料洩露或網路中的橫向移動。

Copyright © 2025 版權所有 翊天科技有限公司