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

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
進行設定。
- <init-param>
- <param-name>readonly</param-name>
- <param-value>false</param-value>
- </init-param>
- <manager classname="org.apache.catalina.session.PersistentManager">
- <store classname="org.apache.catalina.session.FileStore"></store>
- </manager>
2.3. 攻擊程序
利用CVE-2025-24813通常涉及兩步程序,如圖1所示 [1]:

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

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]:

-
作為不帶前導點的普通快取檔案,位於
$TOMCAT_HOME/webapps/ROOT/
下。 -
作為帶有前導點的暫存檔案,位於工作目錄
$TOMCAT_HOME/work/Catalina/localhost/ROOT/
下。
圖5以視覺方式呈現這些快取session檔案位置 [1]。

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


2.4.2. 如何通過HTTP request觸發漏洞
當Tomcat接收到帶有session ID的HTTP request,且session持久化已啟用時,它首先嘗試在記憶體中定位session。如果在記憶體中找不到session,Tomcat會從儲存的快取檔案中恢復它。此時,session檔案的反序列化發生,如圖8所示 [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]。

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

然而,此過濾機制的關鍵缺陷在於其對大小寫敏感。這允許攻擊者通過簡單更改標頭的大小寫來繞過過濾器,從而注入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]。

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

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

漏洞源於此過濾器的大小寫敏感性。攻擊者可通過更改敏感標頭的大小寫(例如
CAmelExecCommandExecutable
,其中'A'為大寫)來繞過過濾器。如果開發者使用
camel-exec
套件,
camel-exec
組件將讀取此惡意製作的標頭值並執行它。此執行通過位於
components/camel-exec/src/main/java/org/apache/camel/component/exec/impl/DefaultExecBinding.java
的程式碼進行,如圖16所示 [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]。這些資料表明存在自動化掃描器和實際的攻擊活動。

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

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

同樣,對於CVE-2025-29891,觀察到一個HTTP request,若成功,將促使有漏洞的伺服器聯繫OAST伺服器,類似於Tomcat攻擊 [1]。圖20展示了此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
標頭值高度相關。

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

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

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