このブログでは、地理空間データの操作や共有に広く使用されているオープンソースの Java ベースのサーバーである GeoServer に見つかったセキュリティ脆弱性 CVE-2024-36401 について調査します。この脆弱性は、認証されていないユーザーによる RCE(リモートでのコード実行)を可能にする可能性があり、GeoServer のデプロイメントにできるだけ早くパッチを適用することの重要性を強調しています。
最新のセキュリティ分析では、2人のOPSWAT フェローがこの脅威を調査している:
- CVEの攻撃ベクトルを深く検証する
- 攻撃者がGeoServerを悪用するために利用する可能性のあるセキュリティギャップの特定
- 攻撃者がどのようにGeoServerの配備を侵害するかをシミュレートする
また、OPSWAT SBOMテクノロジーがどのようにこの脆弱性を検出するのか、さらに、攻撃者が襲いかかる前に地理空間インフラを保護するための、チームのための実用的なステップをご紹介します。

GeoServerの概要
GeoServerは、地理空間データを閲覧、編集、共有するために設計されたJavaベースのオープンソースサーバーである。2001年にTOPP(The Open Planning Project)によって開始されたGeoServerは、オープンな空間データの交換を通じて、政府や都市計画への市民の参加を向上させるために開発された。それから20年以上が経ち、GeoServerは様々な空間データ形式を扱い、様々なデータソースと統合できる堅牢なプラットフォームへと成熟した。
GeoServerは、OGC(Open Geospatial Consortium)の標準に基づいたサービスを提供しています:
CVE-2024-36401の背景
CVE-2024-36401は GeoServer の 2.25.2, 2.24.4, 2.23.6 より前のバージョンに影響します。この不具合は、複数の OGC リクエストパラメータにまたがる XPath 式としてのプロパティ名の安全でない評価に起因します。攻撃者はこの欠陥を悪用し、デフォルトの GeoServer インストールに細工した入力を注入することでRCE(リモートコード実行)を行うことができます。
GitHub Security Advisoriesによると、この脆弱性のCVSS v3.1スコアは9.8(クリティカル)です。
GeoServerのシンプルな機能と複雑な機能
GeoServer は、フラットなデータセットから複雑なネストされたデータセットまで、さまざまな地理空間データ構造に対応できるよう、単純なフィーチャタイプと複雑なフィーチャタイプの両方をサポートしています。しかし、これらのデータ型にまたがる XPath 式の取り扱いに欠陥があるため、CVE-2024-36401 が悪用されてしまうのです。
シンプルな機能
単純なフィーチャタイプはフラットなフォーマットで単純な地理空間データを表し、データベースの各行は地理空間フィーチャに対応し、各属性は XML 要素に直接マッピングされる。
例えば、id、name、locationのようなカラムを持つ企業を表すテーブルは、単純なXML機能に簡単に変換できる。
アイドル | 名称 | 場所 |
1 | OPSWAT | ポイント (10.769829, 106.685248) |
複合施設の特徴
対照的に、複雑な特徴タイプはより複雑なデータを扱う。このフィーチャタイプは、ネストされたプロパティや異なるデータセット間のリレーションシップをサポートします。これらの複雑なスキーマは自動的に生成されるのではなく、GeoServer の Application Schema 拡張機能で概説されているように、コミュニティ標準を使用して定義されます。
例
前のcompaniesテーブルの下に外部キーを追加します。 gu_id
は、企業とそれに相当する地質単位との関係を表す:
アイドル | 名称 | 場所 | gu_id |
1 | OPSWAT | ポイント (10.769829, 106.685248) | 12 |
地質単位の情報は、テーブル 地質単位
:
gu_id | 壷 | 記述 |
12 | urn:x-demo:feature:GeologicUnit:12 | 変成片麻岩 |
これらのテーブルを使うことで、会社を sa:サンプリング会社
を含む。 gsml:GeologicUnit
.この設定は、自動的に生成されたスキーマではなく、コミュニティ仕様によって定義された入れ子の型と関係を含むため、複雑な機能を生み出す。
このような柔軟性は、複雑な実世界のシナリオをモデル化するために不可欠であるが、入れ子構造を効果的に管理するためにJXPath評価のような高度な処理技術に依存するため、脆弱性も生じる。
脆弱性の発生メカニズム
GeoServer は、(Application Schema データストアにあるような)複雑なフィーチャ タイプを処理するために XPath 評価を使用するように設計されています。しかし、不適切な処理のために、単純な特徴タイプにも XPath 評価を誤って適用してしまいます。これにより、攻撃ベクトルが作成されます:
- GeoServer は、データ検索時にプロパティ名を評価するために GeoTools ライブラリに依存しています。
- について
共通jxpath
XPath式を処理するために使用されるライブラリは、適切な検証を欠いており、XPath式を処理する際に任意のコードを実行する可能性がある。 - 攻撃者は、この安全でないXPathの実行を悪用した悪意のあるリクエストを作成し、サーバーを制御することができるため、この欠陥は、すべてのGeoServerインスタンスを潜在的なRCEの脆弱性にさらすことになります。
搾取ワークフローの概要
- A
ポスト
リクエストはGetPropertyValue
オペレーションを実行する。その後、GeoServer はそのプロパティ(または値参照
)を指定する。 - 要求されたプロパティがフィーチャタイプ詳細テーブルに存在する場合、GeoServer はそれを通常通り処理します。
- しかし、プロパティがリストされていない場合、GeoServer は、そのプロパティがリストされていることを確認します。
共通jxpath
ライブラリを使用して、リクエストパラメータを XPath 式として解釈します。 - それ以来
共通jxpath
XPathから直接Javaコードを実行することを許可するこのフォールバックメカニズムは、潜在的に、リモートコード実行のためにユーザが提供するリクエストパラメータを悪用することを可能にします。簡単に言うと、攻撃者は悪意のあるコードを注入して RCE を行うことができます。
脆弱性の探索と分析
JXPathとJava実行ブリッジ
について 共通jxpath
ライブラリは、一般にJXPathと呼ばれ、XPath構文を使用してJavaオブジェクト・グラフ(JavaBeans、DOMオブジェクトなど)をナビゲートできます。たとえば、名前や住所などのプロパティを持つ単純な Employee オブジェクトがある場合、JXPath を使用すると、それらのプロパティを XML ドキュメントのノードのようにクエリできます。
拡張機能を利用する
標準関数だけでなく、JXPath は Java への橋渡しをする拡張関数もサポートしています。この「Javaへの橋渡し」は、例えばXPathクエリ内でJava関数を直接呼び出すことを可能にするため、非常に重要です:
このブリッジを経由して呼び出せるJavaメソッドにはほとんど制限がないため、攻撃者は exec()
関数(または同様の方法)を使って、サーバー上で任意のコマンドを実行することができる。
WFS GetPropertyValue
GeoServer の WFS を使用すると、ユーザーは地理空間フィーチャをクエリし、操作することができます。通常の状態では、WFS GetPropertyValue
操作は、要求されたプロパティをXML構造で返すだけである。


ワークフロー分析
- 攻撃者は /geoserver/wfs に POST リクエストを送る。
- GeoServer は一番外側の XML タグを調べます。
wfs:GetPropertyValue-。
で、どの操作を実行するかを決定する。 - GeoServer は次に、リクエストパラメータを WFS クラスの対応するメソッドに委譲します。このシナリオでは、Dispatcher はリクエストを
GetPropertyValue
メソッドを使用する。
- DefaultWebFeatureService20 (WFS)クラス内では、次のようになります。
GetPropertyValue
メソッドは、ユーザーのパラメーターを同じ名前のハンドラーに転送する。 - ハンドラーの
実行()
メソッドはリクエストを受け取る。値参照
パラメーターはユーザーによって制御される。
- 期間中
実行()
メソッドを呼び出すと、GeoServer は参照値
を呼び出す。evaluate()
関数である。
- もし
値参照
が GeoServer の定義済みプロパティと一致しない場合、GeoServer はそれをデフォルトのフィーチャープロパティアクセサ
を解釈する。値参照
をXPath式として使用する。
- について
ゲット
メソッドを使用する。共通jxpath
を使用して XPath クエリを実行します。ここでは、ユーザーの値参照
は検証なしで直接 xpath パラメータに渡される。を通してJXPathContext.newContext()
GeoServerはXPathクエリ用の環境を初期化し、XPathクエリをiteratePointers()
.
JXPath は拡張関数をサポートしているため、攻撃者は悪意のあるコードを XPath 式に注入し、GeoServer インスタンス上で任意のコードを実行させることができます。
この一連の出来事は、いかに安全でない取り扱いをしたかを示している。 値参照
パラメータは RCE につながる可能性があり、脆弱な GeoServer の配備にとっては深刻なセキュリティ脅威となる。
攻撃のシミュレーション
この悪用を実際のシナリオでシミュレートするため、OPSWAT 大学院生が GeoServer をローカルの Windows マシンに導入しました。GeoServer にアクセスすると、以下のようなインターフェイスが表示された。
サーバーが実行されると、攻撃者は、悪意のあるXPath式でPOSTリクエストを送信することにより、脆弱性を悪用することができる。 値参照
を /geoserver/wfs エンドポイントに設定する。
結果リクエスト送信後、悪意のある XPath 式がシステムコマンドを実行し、Calculator アプリケーションの起動をトリガーします。
緩和策と提言
特にGeoServerのようなオープンソースソフトウェアに依存しているプロジェクトでは、単純なエクスプロイトがソフトウェアサプライチェーン攻撃にエスカレートする可能性があります。OPSWAT SBOM(Software 部品表)技術は、コードベース内のCVE-2024-36401のような脆弱性を特定するのに役立ちます。
この例は、OPSWAT SBOMがどのように機能するかを示している:
- 脆弱性の影響を受けるソフトウェアコンポーネントを検出する。
- セキュリティ上の欠陥の重大性を評価し、ランク付けする。ここでは、GeoServer の CVE に「Critical」のフラグを付けている。
- 影響を受けるバージョンを特定する。
- 開発チームが迅速にパッチを適用したり、修正措置を講じたりできるように、修正バージョンを推奨する。
その他の推奨ステップ
- GeoServer をアップデートする:脆弱性が修正された GeoServer バージョン 2.25.2、2.24.4、または 2.23.6(またはそれ以降)にアップグレードする。
- 監査依存: OPSWAT SBOMのようなツールを定期的に使用し、古くなったライブラリを特定する(例.
共通jxpath
)を使用する。 - アクセスを制限する:ファイアウォールや認証レイヤーの背後に GeoServer を配置し、攻撃対象領域を最小化する。
- セキュリティ勧告の監視GeoServer の公式リリースノートや CVE データベースに常に目を配り、新しいパッチの最新情報を入手してください。