
GeoServer & GeoTools SQLインジェクション (CVE-2023-25157 & CVE-2023-25158)
このリポジトリには、GeoServerプラットフォームとGeoToolsライブラリで発見されたSQLインジェクションの脆弱性の詳細な説明と再現手順が含まれています。この脆弱性には、GeoServer用にCVE-2023-25157、GeoTools用にCVE-2023-25158の識別子が割り当てられています。
GeoServer は、Javaで書かれたオープンソースのソフトウェアサーバーであり、地理空間データの表示、編集、共有機能を提供します。地理情報システム (GIS) データベース、ウェブベースのデータ、個人データセットなど、さまざまなソースからの地理空間データを配布するための柔軟で効率的なソリューションとして設計されています。
GeoServerは、Web Feature Service (WFS)、Web Map Service (WMS)、Web Coverage Service (WCS) を含む、データ共有のためのOpen Geospatial Consortium (OGC) 標準に準拠しています。この標準への準拠により、GeoServerからのデータは、カスタム構築されたGISソフトウェアから既製のソリューションまで、多種多様なアプリケーションで使用できます。
GeoServerは主にSpringフレームワーク上に構築されていますが、以下のような他の多くのライブラリやフレームワークも使用しています。
GeoTools: 地理空間データのためのツールを提供するオープンソースのJavaライブラリです。GeoServerは、データの読み取り、書き込み、変換など、多くのコア機能にGeoToolsを使用しています。問題の脆弱性は、Open Geospatial Consortium (OGC) 標準で定義されたフィルタおよび関数式に深く埋め込まれています。これらの式は、地理空間データのクエリと操作のバックボーンを形成しており、GeoServerやGeoToolsのようなシステムの機能において極めて重要な役割を果たしています。
これらの脆弱性が悪用されると、深刻なセキュリティ侵害につながる可能性があります。攻撃者はデータベースに保存されている機密データにアクセスできる可能性があるため、情報の不正開示が主な懸念事項です。不正な変更も別の潜在的な結果であり、攻撃者はデータを自分たちの都合の良いように操作できます。さらに、これらの脆弱性はサービスの妨害を促進する可能性もあり、悪用が成功するとサービスが利用できなくなる可能性があります。
以下では、特定された各脆弱性の詳細な分析を提供します。各脆弱性は詳細に調査され、その具体的な特徴、発現につながる条件、および悪用の潜在的な影響について説明します。以下は、GeoServerで見つかった脆弱性の詳細な内訳です。
PropertyIsLikeフィルタ: この脆弱性は、PropertyIsLikeフィルタが、任意のリレーショナルデータベースベースのストア、エンコード機能が有効なPostGISデータストア、またはリレーショナルデータベースにインデックスが保存されたイメージモザイクと共にStringフィールドで使用された場合に存在します。strEndsWith関数: この脆弱性は、strEndsWith関数が、エンコード機能が有効なPostGISデータストアで使用された場合に発生します。strStartsWith関数: この脆弱性は、strStartsWith関数が、エンコード機能が有効なPostGISデータストアで使用された場合に見つかります。FeatureIdフィルタ: この脆弱性は、FeatureIdフィルタが、String主キー列を持つデータベーステーブルで、かつプリペアドステートメントが無効になっている場合に存在します。jsonArrayContains関数: この脆弱性は、jsonArrayContains関数がStringまたはJSONフィールドと共に、PostGISまたはOracleデータストア(GeoServer 2.22.0以降のみ)で使用された場合に見つかります。DWithinフィルタ: この脆弱性は、DWithinフィルタがOracleデータストアで使用された場合に発見されます。以下は、GeoToolsで見つかった脆弱性の詳細な内訳です。
PropertyIsLikeフィルタ:
strEndsWith関数:
strStartsWith関数:
FeatureIdフィルタ:
jsonArrayContains関数:
DWithinフィルタ:
CVE-2023-25157 GeoServer SQL Injection 脆弱性。CVE-2023-25158 GeoTools SQL Injection 脆弱性。GeoServer SQLインジェクション (CVE-2023-25157) とGeoTools SQLインジェクション (CVE-2023-25158) の両方の脆弱性に対する推奨される対処方法は、参照されたバージョン以降にアップグレードすることです。このアップグレードが完了している場合は、追加の手順は必要ありません。ただし、迅速なアップグレードが困難な方のために、Geoチームは以下の代替ソリューションを提供しています。
PostGISデータストアのエンコード機能設定を無効にして、strEndsWith、strStartsWithの脆弱性を緩和します(公開されたフィーチャタイプに文字列フィールドがある場合、likeフィルタには緩和策はありません)。
PostGISデータストアのpreparedStatements設定を有効にして、FeatureIdの脆弱性を緩和します。```java
Map<String, Object> params = new HashMap < >();
params.put("dbtype", "postgis");
params.put("host", "localhost");
params.put("port", 5432);
params.put("schema", "public");
params.put("database", "database");
params.put("user", "postgres");
params.put("passwd", "postgres");
params.put("preparedStatements", true); // mitigation
params.put("encode functions", false); // mitigation
DataStore dataStore = DataStoreFinder.getDataStore(params);
攻撃対象領域を制限するための良い習慣として、接続プールに使用されるデータベースアカウントには必要最小限の権限のみを付与することが重要です(例:WFS-T/インポーター/RESTグラニュールハーベスティングが使用されない限り読み取り専用、本番運用に必要なスキーマとテーブルにのみアクセス制限)。
- `PropertyIsLike`フィルタに対する緩和策はありません。アップグレードが可能になるまで、データベースDataStoreを無効にすることを選択しても構いません。
- Oracle DataStoreの`DWithin`に対する緩和策はありません。アップグレードが可能になるまで、Oracle DataStoreを無効にすることを選択しても構いません。
### <b>パッチ分析:GitHub Issueおよび関連コミット</b>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
以下に、GeoServerとGeoToolsの両方で見つかったSQLインジェクションの脆弱性に関連するいくつかのJIRA Issueへのリンクを提供します。これらのリンクは、これらの特定の脆弱性に関連する重要なデータ、議論、および提案された解決策へのアクセスを提供します。
- [GEOS-10842: JDBCConfig: SQLクエリ内のユーザ入力をエスケープ](https://osgeo-org.atlassian.net/browse/GEOS-10842)
- [GEOS-10839: JDBCConfig: SQLコメントとpretty-printingを無効にするJDBC設定パラメータを追加](https://osgeo-org.atlassian.net/browse/GEOS-10839)
- [GEOT-7302: SQLクエリ内のユーザ入力をエスケープ](https://osgeo-org.atlassian.net/browse/GEOT-7302)
[`geoserver/geoserver@145a8af`](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b)コミットを見ると、それぞれ以下の変更が明確に確認できます。
- [`ConfigDatabase.java`](https://github.com/geoserver/geoserver/blob/b05287608048d0f6e36c264f43fe15aa5dfb5130/src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/ConfigDatabase.java)では、プロパティフィールドの追加と、そのプロパティフィールドを含めるためのコンストラクタの変更があります。これにより、データベース設定のカスタマイズが可能になり、セキュリティ対策の強化が可能になる可能性があります。[`NamedParameterJdbcTemplate`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.html)はSpring Frameworkが提供するクラスで、従来のプレースホルダ('?')引数を使用したJDBCステートメントのプログラミングとは対照的に、名前付きパラメータを使用してJDBCステートメントをプログラミングするためのサポートを追加します。このコミットでは、`ConfigDatabase`コンストラクタが`DataSource`を受け取り、そこから`NamedParameterJdbcTemplate`を作成するように更新されています。名前付きパラメータは可読性を向上させ、引数がパラメータ化されておりSQLコマンドの一部ではないことを明確にするため、SQLインジェクション攻撃を防ぐこともできます。
> [src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/ConfigDatabase.java](https://github.com/geoserver/geoserver/commit/145a8af798590288d270b240235e89c8f0b62e?diff=split#diff-1b49bc6af3f36da2ebf7a0d8d3af3fa3697ccee91bf67a690f99837ee2730bed)```java
/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.jdbcconfig.internal;
// import some packages...
import org.geoserver.jdbcloader.JDBCLoaderProperties;
public class ConfigDatabase implements ApplicationContextAware {
public static final Logger LOGGER = Logging.getLogger(ConfigDatabase.class);
private static final int LOCK_TIMEOUT_SECONDS = 60;
private Dialect dialect;
private JDBCLoaderProperties properties;
// rest of the codebase
protected ConfigDatabase() {
//
}
public ConfigDatabase(
JDBCLoaderProperties properties,
DataSource dataSource,
XStreamInfoSerialBinding binding) {
this(properties, dataSource, binding, null);
}