
ローカルなGeoServer/PostGISラボで、脆弱、パッチ適用済み、および緩和策適用済みのA/Bテストモードを備え、OGC Filter SQLインジェクション(CVE-2023-25157/25158)を再現します。
この Lab は GeoServer/PostGIS を使用して、ローカル環境で OGC Filter SQL injection を研究するためのもので、operator/setup モードと attacker モードが明確に分離されています。
GeoServer 2.22.0 は脆弱な GeoTools を組み込んでいる。GeoServer 2.22.2 はパッチ済みの GeoTools を組み込んでいる。Lab は同じ schema/request を維持し、バージョン、緩和策、権限境界の A/B テストを可能にする。
| Mode | Surface | 目的 |
|---|
| Setup/operator REST | cve-operator internal container | REST セットアップ、検証、バックエンドログの確認 |
| Single gateway | 127.0.0.1:8889 | operator UI と各 OWS ルートのための単一ポート |
| Operator Web UI | 127.0.0.1:8889/geoserver/web/ | 運用者向け GeoServer UI、Basic Auth プロキシあり |
| Attacker vulnerable | 127.0.0.1:8889/vuln/geoserver/ows | 脆弱な WFS/OWS、DB エラーがレスポンスに表示される |
| Attacker patched | 127.0.0.1:8889/patched/geoserver/ows | GeoServer 2.22.2 / GeoTools 28.2 |
| Attacker realistic | 127.0.0.1:8889/realistic/geoserver/ows | 脆弱な WFS/OWS だが gateway がエラー詳細を除去 |
| Mitigation function | 127.0.0.1:8889/mit-functions/geoserver/ows | GeoServer 2.22.0、encode functions=false |
| Mitigation FeatureId | 127.0.0.1:8889/mit-featureid/geoserver/ows | GeoServer 2.22.0、preparedStatements=true |
PostgreSQL/PostGIS はホストにポートを公開しない。GeoServer はポート 8080 をホストに直接公開しない。ホストからは 127.0.0.1:8889 上の cve-gateway のみが見える。cve-attacker コンテナは attacker-net にのみ存在し、PostgreSQL や GeoServer の内部サービスへのルートを持たない。REST セットアップは geoserver-net 上の内部コンテナ cve-operator を経由する。
ブラウザで開く:
http://127.0.0.1:8889/geoserver/web/
2 層のログイン:
operator / operator_labadmin / geoserverすべてが同じ gateway 8889 を経由するため、多くのポートを覚える必要はない。Burp はデフォルトプロキシ 127.0.0.1:8080 を維持できる。
.\lab.ps1 reset all
.\lab.ps1 validate
powershell -ExecutionPolicy Bypass -File .\verify-lab.ps1
powershell -ExecutionPolicy Bypass -File .\negative-controls.ps1
powershell -ExecutionPolicy Bypass -File .\attack-chain.ps1
管理コマンド:
.\lab.ps1 start vulnerable
.\lab.ps1 start patched
.\lab.ps1 start mitigated
.\lab.ps1 start worstcase
.\lab.ps1 reset all
.\lab.ps1 stop
.\lab.ps1 status
シードテーブル:
cities: integer primary key、name text カラム、strStartsWith/strEndsWith に使用。sensors_text: text primary key、FeatureId injection に使用。sensors_int: integer primary key、FeatureId の negative control。events: JSONB research layer。internal_assets: 非公開、リセットごとに新しい LAB-CANARY-<UUID> を格納。local_points: 非 JDBC の shapefile negative control。Role:
geoserver_readonly: CONNECT、USAGE schema、公開テーブルのみ SELECT。geoserver_impact: アプリ DB ユーザの過剰権限を実証するため internal_assets への SELECT を追加。geoserver_worstcase: 専用プロファイル、pg_read_server_files を持ち、偽の canary ファイル /lab/flag.txt を読み取る。attack-chain.ps1 は以下を実行する:
GetCapabilities の偵察。DescribeFeatureType による schema 列挙。encode functions=false による CVE-2023-25157 の確認。preparedStatements=true による CVE-2023-25158 の確認。internal_assets を遮断すること、impact ブランチが canary を漏洩すること、patched/realistic が canary を開示しないことの証明。Evidence は evidence/attack-chain-* に保存される。現在のフォルダは散らかるのを避けるため、最新の pass evidence のみを保持する。
このプロファイルはメインシナリオには含まれない:
.\lab.ps1 start worstcase
powershell -ExecutionPolicy Bypass -File .\worstcase-demo.ps1
これは偽の canary ファイル /lab/flag.txt のみを読み取り、/etc/passwd は読まず、ハッシュのダンプもパスワードクラックも行わない。