
CVE-2024-36401の再現可能な研究:JXPath evalインジェクションによるGeoServerの認証なしRCE。技術レポート、動作するエクスプロイト/検証ツール、および脆弱なインスタンスとパッチ適用済みインスタンスで欠陥を示すDocker環境が含まれます。
CVE-2024-36401 は、地理空間データ向けに最も広く導入されているオープンソースサーバーである GeoServer における未認証のリモートコード実行(RCE)の脆弱性です。本リポジトリは、この脆弱性の完全かつ再現可能な調査資料です。このバグは eval インジェクション です。OGC 標準のパラメータを通じて、GeoServer は攻撃者が制御する プロパティ名 を GeoTools に渡します。GeoTools では Apache Commons JXPath がそれらを XPath 式として評価し、設計上、リフレクションを介して任意の Java メソッドを呼び出すことができます。したがって、exec(java.lang.Runtime.getRuntime(),'id') のような未認証リクエストは、ホスト上でコマンドを実行します。
このリポジトリには、技術レポート、動作するエクスプロイト/検証ツール、および脆弱なインスタンスで RCE を実証し、パッチ適用済みインスタンスでは同じエクスプロイトが失敗することを示すワンコマンドの Docker 環境が含まれています。
教育目的のプロジェクトです。 大学の講義(Data Privacy and Security、LUISS DASMA)のために作成されました。すべてはローカルの隔離されたコンテナに対してのみ実行されます — 責任ある利用 を参照してください。
| 項目 | 値 |
|---|---|
| CVE (GeoServer) | CVE-2024-36401 |
| 根本原因(GeoTools) | CVE-2024-36404 |
| 種別 | 未認証リモートコード実行 |
| CWE | CWE-95、Eval インジェクション |
| CVSS v3.1 | 9.8 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| 影響を受けるバージョン | GeoServer < 2.25.2 / GeoTools < 31.2(およびそれ以前のブランチ) |
| CISA KEV | あり(2024年7月15日) |
| 調査対象バージョン | 脆弱な 2.25.1、パッチ適用済み 2.25.2 |
.
├── report/
│ ├── report.pdf # the full technical report (read this first)
│ ├── report.md # report source (Pandoc/XeLaTeX)
│ └── images/ # figures and screenshots
├── docker/
│ ├── vulnerable/Dockerfile # GeoServer 2.25.1 (vulnerable)
│ └── patched/Dockerfile # GeoServer 2.25.2 (fixed)
├── docker-compose.yml # vuln on :8080, patched on :8081
├── exploit/
│ ├── exploit.py # exploit + vuln/patched verifier (stdlib only)
│ ├── exploit.sh # curl-based PoC (GET + POST variants)
│ ├── payloads.md # payload catalogue per OGC endpoint
│ └── output/ # captured proof logs and transcripts
└── run-reproduction.sh # one command: build + exploit both + collect proofs
必要なもの: 実行中の Docker Desktop、python3、curl。
# Build both containers, run the exploit against each, and collect the proofs
chmod +x run-reproduction.sh
./run-reproduction.sh
またはステップバイステップ:
docker compose up -d --build # vuln on :8080, patched on :8081
# Vulnerable (expected: VULNERABLE, ~8s delay)
python3 exploit/exploit.py -t http://localhost:8080/geoserver --label vuln -o exploit/output
# Patched (expected: PATCHED, immediate rejection)
python3 exploit/exploit.py -t http://localhost:8081/geoserver --label patched -o exploit/output
docker compose down # when finished
2つの独立したプローブにより、結果を曖昧さなく判定できます:
java.lang.Thread.sleep(8000) が XPath を評価するスレッドをブロックするため、
HTTP レスポンスが約8秒遅延します。クライアント側から測定可能で、コンテナへの
アクセスは不要です。公式の修正テストで使われているものと同じカナリアです。exec(java.lang.Runtime.getRuntime(),'touch /tmp/<marker>')
がコンテナ内にファイルを作成します。docker exec で確認できます。脆弱なインスタンスでは、ペイロードを手動で送信すると ProcessImpl 上で ClassCastException が返ります。これは、JVM が Runtime.exec を実行し、結果の Process オブジェクトを属性として使用できなかったことを意味します。この例外こそが実行の証明です:

GeoTools のコミット e53e5170(GeoServer 2.25.2、2.24.4、2.23.6、2.22.6 に含まれる)は、このバグの両側面に対して多層防御を適用しています:
JXPathUtils.newSafeContext(...) ヘルパーが空の FunctionLibrary をインストールし、
JXPath が exec/Thread.sleep を関数として解決できなくなります。文字列は
通常のプロパティ名のままになります。FeaturePropertyAccessorFactory が SimpleFeatureType もチェックするようになり、シンプル
フィーチャーが脆弱なアクセッサに到達しなくなります。パッチ適用済みインスタンスでは、同じペイロードに対して No such attribute: ... が返り、何も実行されません。
詳細 — 影響を受けるコード(ファイル/行番号付き)、攻撃手法、緩和策の差分、および並べての再現手順 — は report/report.pdf に記載されています。
この CVE は公開されており、18か月以上前にパッチが適用され、CISA の Known Exploited Vulnerabilities カタログに掲載され、公開 PoC(Vulhub、Nuclei、Metasploit)も存在します。ここにあるコードは、localhost のみ と、このリポジトリ内の隔離された調査用コンテナを対象としています。所有していないシステムや、明示的にテストを許可されていないシステムに対して使用しないでください。
MIT © 2026 Daniele Giovanardi
Daniele Giovanardi — LUISS Guido Carli 大学 Data Science and Management(DASMA)専攻。 Data Privacy and Security の講義課題として作成。