AI 驅動的網路攻擊:如何偵測、預防及抵禦智慧型威脅

立即閱讀
我們利用人工智慧進行網站翻譯,雖然我們力求準確性,但它們可能並不總是 100% 精確。感謝您的理解。

開放原始碼 GeoServer 中的 CVE-2024-36401 暴露系統於遠端執行程式碼的風險

by OPSWAT 發布
分享此文章
OPSWAT 研究員計畫參加者的頭像
OPSWAT 研究員計畫參與者

在這篇文章中,我們將探討 CVE-2024-36401--一個在 GeoServer 中發現的安全漏洞,GeoServer 是一個基於 Java 的開放原始碼伺服器,廣泛用於地理空間資料處理與分享。此漏洞可能允許未驗證使用者執行 RCE (遠端程式碼執行),這強調了儘快修補 GeoServer 部署的重要性。 

在我們最新的安全分析中,兩位OPSWAT 研究員透過以下方式調查此種威脅:

  • 深入檢視 CVE 的攻擊向量 
  • 找出攻擊者可能利用來攻擊 GeoServer 的安全漏洞 
  • 模擬攻擊者如何入侵GeoServer 部署 

我們也會分享OPSWAT SBOM 技術如何偵測此漏洞,並提供可實施的步驟,讓團隊在攻擊者襲擊前保護其地理空間基礎架構。

表示 GeoServer 弱點分析的插圖

GeoServer 概觀

GeoServer是基於 Java 的開放源碼伺服器,專為檢視、編輯與分享地理空間資料而設計。GeoServer 最初於 2001 年由 TOPP(The Open Planning Project,開放式規劃專案)推出,旨在透過開放式空間資料交換,提升大眾對政府與都市規劃的參與。二十多年後的今天,GeoServer 已經發展成為一個強大的平台,能夠處理各種空間資料格式,並與不同的資料來源整合。

GeoServer 提供基於OGC(開放地理空間聯盟)標準的服務,包括

  • WFS (Web Feature Service) - 可使用HTTP 建立、修改及交換向量格式地理資訊。 
  • WCS (Web Coverage Service) - 方便存取光柵資料 (例如衛星影像),以進行複雜的建模與分析
  • WMS (Web 地圖服務) - 提供簡單的 HTTP 介面以要求地圖影像

CVE-2024-36401 的背景

CVE-2024-36401會影響 2.25.2、2.24.4 及 2.23.6 之前的 GeoServer 版本。此漏洞是由於在多個 OGC 請求參數中,以 XPath 表達式不安全地評估屬性名稱所引起。攻擊者可透過在預設的 GeoServer 安裝中注入精心製作的輸入,利用此漏洞建立 RCE (遠端執行程式碼)。

 根據 GitHub 安全公告,此漏洞的 CVSS v3.1 得分為 9.8 (Critical)。 

用於評估軟體弱點的 CVSS Base Score Metrics 螢幕截圖

GeoServer 的簡單與複雜功能比較

GeoServer 支援簡單與複雜的特徵類型,以容納不同的地理空間資料結構,從平面到複雜的嵌套資料集。然而,這些資料類型的 XPath 表達式處理上的缺陷,使得 CVE-2024-36401 容易被攻擊。

簡單功能

簡單特徵類型以平面格式表示直接的地理空間資料,其中資料庫中的每一行對應一個地理空間特徵;而每一屬性則直接映射至 XML 元素。 

舉例來說,代表公司的表格有 id、name 和 location 等欄位,可以輕鬆轉換成簡單的 XML 功能。

id姓名地點
1OPSWAT 發布點 (10.769829, 106.685248)
GeoServer 從資料庫行到 XML 元素的簡單特徵映射

複雜功能

相比之下,複雜特徵類型可處理更複雜的資料。這種特徵類型支援巢狀屬性以及不同資料集之間的關係。這些複雜模式不是自動產生的,而是使用社群標準定義的,如 GeoServer 的應用程式模式擴充概述。

例: 

在之前的公司表下,我們新增一個外鍵 gu_id 來描述公司與其相對應的地質單位之間的關係:

id姓名地點gu_id
1OPSWAT 發布點 (10.769829, 106.685248)12

地質單位資訊單獨儲存於表 地質單位:

gu_id描述
12urn:x-demo:feature:GeologicUnit:12變質片麻岩

透過這些表格,我們可以將公司映射到 sa:取樣公司,其中包含一個嵌套的 gsml:地質單位.此設定會產生複雜的功能,因為它涉及由社群規格定義的巢狀類型和關係,而非自動產生的模式。

GeoServer 複合地貌中的嵌套地質單元關係

這樣的靈活性對於建模複雜的真實世界場景是不可或缺的,但也會因其依賴先進的處理技術 (如 JXPath 評估) 來有效管理巢狀結構而引入漏洞。

漏洞如何產生

GeoServer 的設計是使用 XPath 評估來處理複雜的特徵類型(例如 Application Schema 資料庫中的特徵類型)。但由於處理不當,它也錯誤地將 XPath 評估應用於簡單的特徵類型。這造成了攻擊向量,因為

  1. GeoServer 依賴 GeoTools 函式庫在資料擷取過程中評估屬性名稱。
  2. 共通-jxpath 函式庫,用於處理 XPath 表達式,缺乏適當的驗證,在處理 XPath 表達式時可能執行任意程式碼。
  3. 此漏洞使所有 GeoServer 實體暴露於潛在的 RCE 漏洞,因為攻擊者可以製作惡意請求,利用此不安全的 XPath 執行來控制伺服器。

開發工作流程概述

  • 一個 職位 請求被傳送到 GetPropertyValue 操作。然後,GeoServer 嘗試擷取該屬性(或 值參考) 為一個給定的特徵。  
  • 如果請求的屬性存在於地物類型詳細資料表中,GeoServer 會正常處理該屬性。
GeoServer 回退至 commons-jxpath 以在表格中進行 XPath 評估
  • 但是,如果沒有列出該屬性,GeoServer 會返回到 共通-jxpath 函式庫將請求參數詮釋為 XPath 表達式。
  • 共通-jxpath 允許直接從 XPath 執行 Java 程式碼,這個回退機制可能會讓使用者提供的請求參數被利用來執行遠端程式碼。簡單來說,攻擊者可以注入惡意程式碼來達成 RCE。
說明 GeoServer GetPropertyValue 作業與攻擊流程的工作流程圖

漏洞開發與分析

JXPath 與 Java 執行橋接器

在 GeoServer 中使用 Commons-jxpath 處理惡意 XPath 表達式

共通-jxpath 函式庫,通常稱為 JXPath,可讓您使用 XPath 語法瀏覽 Java 物件圖形 (JavaBeans、DOM 物件等)。舉例來說,如果您有一個簡單的 Employee 物件,其中有姓名和地址等屬性,JXPath 可讓您像查詢 XML 檔案中的節點一樣查詢這些屬性。

JXPath 使用 XPath 語法瀏覽 Java 物件圖形

開發擴充功能

除了標準函數之外,JXPath 也支援延伸函數,作為連結 Java 的橋梁。這個「Java 橋樑」非常重要,因為它允許在 XPath 查詢中直接呼叫 Java 函式:

JXPath 查詢 Java Employee 物件的屬性

由於可透過此橋接器呼叫的 Java 方法限制不多,因此攻擊者可利用 exec() 函數 (或類似的方法) 在伺服器上執行任意指令。

銜接 XPath 與 Java 方法的擴充函式調用

WFS GetPropertyValue

GeoServer 的 WFS 可讓使用者查詢和操作地理空間特徵。在正常情況下,WFS GetPropertyValue 作業只會以 XML 結構傳回所要求的屬性。

返回 XML 屬性的 WFS GetPropertyValue 操作
WFS GetPropertyValue XML 回應結構

工作流程分析

  1. 攻擊者傳送 POST 請求到 /geoserver/wfs。
  2. GeoServer 檢查最外層的 XML 標籤wfs:GetPropertyValue-來決定執行哪個作業。
  3. 然後,GeoServer 將請求參數委託給 WFS 類中的相應方法。在這種情況下,Dispatcher 會將請求直接指向 GetPropertyValue 方法。
GeoServer Dispatcher 將要求導向 GetPropertyValue 方法
  1. 在 DefaultWebFeatureService20 (WFS) 類中,此 GetPropertyValue 方法會將使用者的參數轉寄給同名的處理程式。
  2. 處理者的 執行() 方法收到請求,包括關鍵的 值參考 參數由使用者控制。
處理程式 run() 方法接收使用者要求,並包含 valueReference 參數
  1. 期間 執行() 方法,GeoServer 會檢索 參考值 並調用其 評估() 功能。
GeoServer 擷取 referenceValue 並呼叫 evaluate() 函式
  1. 如果 值參考 與 GeoServer 預定義的屬性不一致時,GeoServer 會將其預設為 功能屬性繼承者,它解釋 值參考 作為 XPath 表達式。
FeaturePropertyAccessor 將 valueReference 詮釋為 XPath 表達式
  1. 獲得() FeaturePropertyAccessor 中的方法使用 共通-jxpath 來執行 XPath 查詢。在此,使用者的 值參考 會直接傳入 xpath 參數,而不經過驗證。透過 JXPathContext.newContext(),GeoServer 會初始化 XPath 查詢的環境,然後透過 iteratePointers().
Commons-jxpath 使用使用者提供的 valueReference 執行 XPath 查詢

由於 JXPath 支援擴充函式,攻擊者可以在 XPath 表達式中注入惡意程式碼,在 GeoServer 實體上引發任意程式碼執行。

攻擊者透過 XPath 表達式為 RCE 注入惡意程式碼

這一連串的事件顯示了如何不安全地處理 值參考 參數會導致 RCE,對易受攻擊的 GeoServer 部署造成嚴重的安全威脅。

模擬攻擊

為了模擬在真實世界情境中的開發,我們的OPSWAT 畢業研究員將 GeoServer 部署在本地 Windows 機器上。存取 GeoServer 時會顯示以下介面。

在 Windows 機器上進行漏洞模擬的 GeoServer 介面截圖

一旦伺服器開始執行,攻擊者可透過以下方式利用漏洞:傳送含有惡意 XPath 表達式的 POST 請求 值參考 到 /geoserver/wfs 端點。

利用 GeoServer 中的 valueReference 發出惡意 POST 請求的 XML 程式碼片段

結果:傳送要求後,惡意 XPath 表達式會執行系統指令,並觸發計算機應用程式的啟動。

成功進行 RCE 攻擊後啟動計算器應用程式的螢幕截圖

緩解措施與建議

一個簡單的漏洞攻擊就可能升級為軟體供應鏈攻擊,尤其是在依賴 GeoServer 等開放原始碼軟體的專案中。OPSWAT SBOM(軟體物料清單)技術有助於識別程式碼庫中的漏洞,例如 CVE-2024-36401。

本範例說明OPSWAT SBOM:

  1. 偵測受漏洞影響的軟體元件。
  2. 評估安全漏洞的嚴重性並將其排序 - 在此,GeoServer CVE 被標記為 "Critical"。
  3. 識別受影響的版本。
  4. 建議固定版本,以便開發團隊能及時套用修補程式或採取修復措施。
OPSWAT SBOM 偵測到 GeoServer 套件有嚴重漏洞的儀表板截圖
OPSWAT SBOM軟體物料清單)技術可偵測出有關鍵漏洞的 GeoServer 套件。

其他建議步驟

  1. 更新 GeoServer:升級至已修補漏洞的 GeoServer 版本 2.25.2、2.24.4 或 2.23.6(或更新版本)。
  2. 稽核依賴: 定期使用OPSWAT SBOM 等工具找出過時的程式庫 (例如、 共通-jxpath) 在您的環境中。
  3. 限制存取:將 GeoServer 部署在防火牆或驗證層之後,以盡量減少攻擊面。
  4. 監控安全公告:密切注意官方 GeoServer 發行公告與 CVE 資料庫,隨時更新新的修補程式。

關於OPSWAT SBOM

OPSWAT SBOM 支援最熱門的程式語言,提供軟體開發團隊對第三方開放原始碼程式庫、其相關相依性以及最新可用升級版本的可視性。開發人員可將OPSWAT SBOM 整合至其原始碼與容器服務,例如 GitHub、BitBucket、GitLab、Amazon ECR、DockerHub 等。進一步瞭解 SBOM

立即與專家討論,瞭解如何將OPSWAT 工具和解決方案與您現有的基礎架構和工作流程整合:

隨時瞭解OPSWAT 的最新資訊!

立即註冊,即可收到公司的最新消息、 故事、活動資訊等。