Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
spring4shell-local-verification-lab — Spring Framework CVE-2022-22965 ローカル影響条件の検証、バージョンアップグレードによる修正と再テストプロジェクト | Kitploit
ツール/GitHubGitHub/meng-security/spring4shell-local-verification-lab
脆弱性分析コード分析エクスプロイトウェブセキュリティ学習と教育ラボと実践
GitHubmeng-security/spring4shell-local-verification-lab

spring4shell-local-verification-lab

Spring Framework CVE-2022-22965 ローカル影響条件の検証、バージョンアップグレードによる修正と再テストプロジェクト

リポジトリを見る
11ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Spring4Shell ローカル影響条件の検証・修正・再テストプロジェクト

プロジェクト概要

本プロジェクトは、Spring Framework CVE-2022-22965、すなわち Spring4Shell 脆弱性の影響条件、リスクの顕在化、修正方法、修正後の再テスト手順を学習・検証するためのものです。

プロジェクトは個人が構築したローカルの許可環境で実施しました。プロジェクトの重点は実際の標的への攻撃ではなく、修正前・修正後の Spring MVC テスト環境を構築し、脆弱性に関する影響条件を項目ごとに確認し、安全かつ制御可能な読み取り専用の方法で、Spring データバインディングの内部プロパティパスがバージョンアップグレード前後でどのように異なるかを観察することです。

本プロジェクトでは以下のプロセスを実施しました。

  • JDK、Maven、Apache Tomcat 環境の準備
  • Spring MVC WAR プロジェクトの構築
  • 通常機能のベースライン検証
  • 脆弱性の影響条件の確認
  • 内部プロパティパスの読み取り専用診断
  • 脆弱性の原因分析
  • Spring Framework のバージョンアップグレード
  • 修正後のセキュリティ再テスト
  • 修正後の通常機能再テスト
  • テストレポートとスクリーンショット証跡の整理

セキュリティ声明

本プロジェクトは、個人のローカル自前環境、または明確に許可されたセキュリティテスト環境のみを対象としています。

本プロジェクトは、いかなる公開ウェブサイト、サーバー、第三者業務システムに対するスキャン、プロービング、脆弱性悪用も行わず、実在のユーザーデータや実在の業務データも含みません。

テスト中に以下の操作は実行していません。

  • WebShell の書き込み
  • システムコマンドの実行
  • Tomcat 設定の変更
  • リバースシェルの確立
  • 持続的支配の確立
  • 外部システムへの影響

本プロジェクトのテスト手法を、許可されていない対象に対して使用することを禁止します。

脆弱性の背景

CVE-2022-22965 は一般に Spring4Shell と呼ばれ、Spring Framework のリクエストパラメータデータバインディング機構に関連するリモートコード実行脆弱性です。

Spring MVC は、HTTP リクエストパラメータを Java オブジェクトのプロパティに自動的にバインドすることをサポートしています。例えば、本プロジェクトでは以下の方法で名前とメールアドレスのパラメータを受け取ります。

@ModelAttribute("profile") UserProfile profile

通常、リクエストパラメータ name と email は、プロパティ名に従って UserProfile オブジェクトにバインドされます。

影響を受けるバージョンでは、一部の内部プロパティパスへのアクセス制限が十分に厳格ではありません。JDK 9 以降を使用し、特定の Servlet コンテナ、デプロイ方式、データバインディングの条件を満たす場合、外部リクエストパラメータが通常のビジネスオブジェクトから、Java Class、モジュール、クラスローダー、またはコンテナ関連の内部オブジェクトへとアクセスを続行する可能性があります。

特定の悪用可能な環境では、攻撃者がサーバー設定をさらに変更したり、サーバーファイルに書き込んだりして、リモートコード実行のリスクを生じさせる可能性があります。

本プロジェクトでは完全なリモートコード悪用は実行せず、以下のプロパティパスを用いて安全で読み取り専用の差分診断を行います。

class.module.name

プロジェクトの目標

  1. Spring MVC のリクエストパラメータデータバインディングの基本的なプロセスを理解する。
  2. ローカルに Spring MVC WAR テストプロジェクトを構築する。
  3. 通常の業務機能のベースライン検証を完了する。
  4. Spring Framework、JDK、Tomcat、WAR デプロイ、データバインディング入口などの影響条件を確認する。
  5. 読み取り専用の方法で内部プロパティパスへのアクセスの挙動を観察する。
  6. 脆弱性が生じる主な原因を分析する。
  7. Spring Framework を修正バージョンにアップグレードする。
  8. 同じ方法で修正後の再テストを完了する。
  9. バージョンアップグレードが通常の業務機能に影響を与えていないことを確認する。
  10. プロジェクトのソースコード、テストレポート、スクリーンショット証跡を整理する。

実験環境

本プロジェクトは、個人のローカル VMware 分離実験環境で実施しました。

  • ホストマシン: Windows 11
  • ターゲットマシン: Windows 10 仮想マシン
  • 仮想化ソフトウェア: VMware Workstation
  • Java 環境: Eclipse Temurin JDK 11.0.31
  • プロジェクト構築ツール: Apache Maven 3.9.16
  • Servlet コンテナ: Apache Tomcat 9.0.60
  • 修正前の Spring Framework バージョン: 5.3.17
  • 修正後の Spring Framework バージョン: 5.3.18
  • Web フレームワーク: Spring MVC
  • プロジェクトのデプロイ方式: 従来の WAR パッケージデプロイ
  • テストアドレス: 127.0.0.1

通常機能のテストデータ:

  • 名前:Alice
  • メールアドレス:[email protected]

セキュリティ診断プロパティパス:

class.module.name

プロジェクト構成

spring4shell-local-verification-lab/

  • README.md:プロジェクト紹介、テスト方針、検証結果、修正説明
  • docs/:Spring4Shell ローカル影響条件検証・修正・再テストレポート
  • images/:プロジェクト環境、テストプロセス、再テストのスクリーンショット
  • vulnerable-demo/:Spring Framework 5.3.17 を使用した修正前プロジェクト
  • fixed-demo/:Spring Framework 5.3.18 を使用した修正後プロジェクト
  • notes/:学習ノートとプロセス記録

主なソースコード構成:

  • config/:Spring MVC 設定クラスとアプリケーション初期化クラス
  • controller/:フォーム処理とプロパティパス診断コントローラー
  • model/:名前とメールアドレスのパラメータを受け取るための UserProfile クラス
  • WEB-INF/views/:ホームページ、送信結果、診断結果の JSP ページ

テストプロジェクトの説明

本プロジェクトでは、修正前と修正後の 2 つの Spring MVC アプリケーションをそれぞれ構築しました。

修正前プロジェクト

プロジェクトディレクトリ:

vulnerable-demo

使用バージョン:

Spring Framework 5.3.17

生成される WAR ファイル:

spring4shell-vulnerable-demo.war

アクセスアドレス:

http://127.0.0.1:8080/spring4shell-vulnerable-demo/

診断ページ:

http://127.0.0.1:8080/spring4shell-vulnerable-demo/binding-probe

修正後プロジェクト

プロジェクトディレクトリ:

fixed-demo

使用バージョン:

Spring Framework 5.3.18

生成される WAR ファイル:

spring4shell-fixed-demo.war

アクセスアドレス:

http://127.0.0.1:8080/spring4shell-fixed-demo/

診断ページ:

http://127.0.0.1:8080/spring4shell-fixed-demo/binding-probe

通常機能の説明

テストプロジェクトは、以下の内容を含むシンプルなユーザープロフィールフォームを提供します。

  • 名前入力欄
  • メールアドレス入力欄
  • プロフィール送信ボタン

コントローラーは以下の方法でリクエストパラメータを受け取ります。

@ModelAttribute("profile") UserProfile profile

ユーザーが名前とメールアドレスを送信すると、Spring MVC は name と email パラメータを UserProfile オブジェクトに自動的にバインドします。

結果ページはバインドされたオブジェクトを読み取り、ユーザーが送信した名前とメールアドレスを表示します。

この機能は、プロジェクトが正常に動作することを確認し、アプリケーションに有効な Spring MVC リクエストパラメータデータバインディング入口が存在することを証明するために使用します。

テスト方針

本プロジェクトは、「まず通常機能を確認し、次に影響条件を確認し、その後読み取り専用のリスク診断を行い、最後に修正して再テストする」という方針で実施します。

  1. JDK 11、Maven、Apache Tomcat をインストールして設定する。
  2. Spring Framework 5.3.17 を使用して Spring MVC プロジェクトを構築する。
  3. 名前とメールアドレスのフォームを作成する。
  4. @ModelAttribute を使用してリクエストパラメータを UserProfile オブジェクトにバインドする。
  5. Maven を使用してプロジェクトを WAR ファイルにパッケージ化する。
  6. WAR ファイルを単独で実行されている Apache Tomcat にデプロイする。
  7. ローカルの模擬ユーザープロフィールを送信し、通常機能のベースライン検証を完了する。
  8. 実際に実行されている JDK、Tomcat、Spring Framework、デプロイ方式を確認する。
  9. Spring の BeanWrapper を使用して class.module.name の読み取り専用診断を行う。
  10. Spring Framework 5.3.17 環境でのプロパティパスアクセス結果を記録する。
  11. Spring Framework を 5.3.18 にアップグレードする。
  12. 修正後のプロジェクトを再構築してデプロイする。
  13. 同じプロパティパスを使用して修正後の再テストを行う。
  14. 再度名前とメールアドレスを送信し、通常機能に影響がないことを確認する。

影響条件の確認

本プロジェクトでは、以下の影響条件を項目ごとに確認しました。

  • JDK 11.0.31 を使用しており、JDK 9 以降の条件を満たす
  • Spring Framework 5.3.17 を使用
  • プロジェクトに spring-webmvc コンポーネントが含まれる
  • Apache Tomcat 9.0.60 を使用
  • プロジェクトが従来の WAR パッケージ形式でデプロイされる
  • プロジェクトが単独で実行される Tomcat によってロードされる
  • コントローラーに @ModelAttribute に基づくデータバインディング入口が存在する

修正前プロジェクトで実際にデプロイされた Spring 依存関係は以下のとおりです。

  • spring-beans-5.3.17.jar
  • spring-core-5.3.17.jar
  • spring-web-5.3.17.jar
  • spring-webmvc-5.3.17.jar

本プロジェクトでは、Spring Framework のバージョンだけで脆弱性の有無を直接判断するのではなく、JDK、Spring MVC、Tomcat、WAR デプロイ、データバインディング入口を組み合わせて総合的に分析します。

リスク診断の方法

破壊的な脆弱性悪用の実行を避けるため、本プロジェクトでは Spring Framework が提供する BeanWrapper を使用して、以下のプロパティパスを読み取り専用で検査します。

class.module.name

このパスは以下を意味します。

  • class:現在のビジネスオブジェクトに対応する Java Class オブジェクトにアクセスする
  • module:そのクラスが属する Java モジュールにアクセスする
  • name:モジュール名を読み取る

診断プロセスでは、プロパティの読み取り可能性チェックとプロパティ値の読み取りメソッドのみを呼び出します。

  • オブジェクトのプロパティを設定しない
  • サーバー設定を変更しない
  • サーバーファイルに書き込まない
  • OS コマンドを実行しない

したがって、この診断は修正前後の内部プロパティパスへのアクセス差異を観察するためだけに使用でき、それ単独でリモートコード実行が達成されたことを証明することはできません。

検証結果

修正前の結果

修正前の環境で使用:

Spring Framework 5.3.17

確認するプロパティパス:

class.module.name

診断結果:

  • 読み取り可能か:true
  • 読み取り結果:null

true は、現在の環境が通常のビジネスオブジェクトの class プロパティに沿って module.name を引き続き解決できることを示します。

読み取り結果が null なのは、現在の WAR アプリケーションが Java の unnamed モジュールで実行されているためモジュール名が空であり、プロパティパスの読み取りが失敗したことを意味するものではありません。

修正後の結果

修正後の環境で使用:

Spring Framework 5.3.18

同じプロパティパスで再診断:

class.module.name

診断結果:

  • 読み取り可能か:false
  • 読み取り結果:Not readable

修正前後の結果は明確な対比を示しています。

  • Spring Framework 5.3.17:プロパティパスが読み取り可能
  • Spring Framework 5.3.18:プロパティパスが読み取り不可

この結果は、バージョンアップグレード後、元の診断プロパティパスへのアクセスが制限され、修正前に観察されたリスクの顕在化が再発しないことを示しています。

修正措置

本プロジェクトでは、Spring Framework のバージョンをアップグレードする方法で修正しました。

修正前の設定:

<spring.version>5.3.17</spring.version>

修正後の設定:

<spring.version>5.3.18</spring.version>

修正プロセスでは以下の操作を完了しました。

  1. 修正前プロジェクトを fixed-demo にコピーする。
  2. Controller、データモデル、JSP ページのビジネスロジックを変更しない。
  3. Spring Framework を 5.3.17 から 5.3.18 にアップグレードする。
  4. Maven を使用して修正バージョンの依存関係を再ダウンロードする。
  5. 再コンパイルして修正版 WAR ファイルを生成する。
  6. 修正版 WAR を Apache Tomcat にデプロイする。
  7. 修正プロジェクトで実際にデプロイされた Spring JAR のバージョンを確認する。
  8. 元のプロパティパスを使用してセキュリティ再テストを完了する。
  9. 名前とメールアドレスの送信機能を再テストする。

修正後プロジェクトで実際にデプロイされた Spring 依存関係は以下のとおりです。

  • spring-beans-5.3.18.jar
  • spring-core-5.3.18.jar
  • spring-web-5.3.18.jar
  • spring-webmvc-5.3.18.jar

この結果は、修正バージョンが再構築され実際にデプロイされたことを証明しており、pom.xml のバージョン番号を変更しただけではないことを示しています。

修正後の通常機能再テスト

Spring Framework 5.3.18 にアップグレード後、修正プロジェクトのホームページに再度アクセスし、以下のテストデータを送信しました。

  • 名前:Alice
  • メールアドレス:[email protected]

送信後も、ページは正常に表示されました。

  • ユーザープロフィールの送信成功
  • 名前が Alice
  • メールアドレスが [email protected]

この結果は、バージョンアップグレードがプロジェクト本来の正常なリクエストパラメータバインディングとページ表示機能に影響を与えていないことを示しています。

脆弱性の原因

Spring MVC の自動データバインディング機構は、HTTP リクエストパラメータ名に基づいて Java オブジェクトのプロパティにアクセスできます。

通常の業務パラメータ name と email は、UserProfile 内の対応する通常のプロパティにアクセスするだけです。

しかし、Spring のプロパティアクセス機構は、ドット付きのネストされたプロパティパスもサポートしています。影響を受けるバージョンでは、一部の内部プロパティパスへの制限が十分に厳格ではなく、外部パラメータが特定の環境では通常のビジネスオブジェクトから Java Class、モジュール、クラスローダー、または Servlet コンテナ関連オブジェクトへとアクセスを続行する可能性があります。

内部オブジェクトにサーバー設定やファイルシステムに影響を与えられる書き込み可能なプロパティが存在し、アプリケーションが JDK、Tomcat、WAR デプロイ、データバインディングなどの条件を同時に満たす場合、さらにリモートコード実行のリスクが生じる可能性があります。

この脆弱性は name や email プロパティ自体に問題があるからではなく、また Spring MVC を使用するすべてのプロジェクトが必ず悪用可能というわけでもありません。脆弱性が成立するには、通常、複数の条件が同時に存在する必要があります。

修正の推奨事項

実際の業務システムでは、以下の対策を推奨します。

  • 実際に実行されている Spring Framework と Spring Boot のバージョンを確認する
  • 公式サポートが継続しているセキュリティバージョンへのアップグレードを優先する
  • アップグレード後にアプリケーションを再構築してデプロイする
  • 最終デプロイパッケージ内の実際の Spring JAR バージョンを確認する
  • Controller のデータバインディング範囲を制限する
  • 通常の業務で必要なフィールドのみバインドを許可する
  • 専用のリクエストデータオブジェクトを使用して外部パラメータを受け取る
  • データベースエンティティや内部の複雑なオブジェクトを外部パラメータに直接公開しない
  • フロントエンド検証に依存してセキュリティ制限を完了しない
  • 直ちにアップグレードできないシステムには一時的な緩和策を講じる
  • 一時的な緩和策は正式なバージョンアップグレードの代わりにはならない
  • 低権限アカウントで Tomcat と Java サービスを実行する
  • アプリケーションディレクトリと設定ディレクトリに最小限の必要な権限を設定する
  • 異常なリクエストパラメータとサーバーファイルの変更を監視する
  • 修正後はセキュリティ再テストと通常業務機能の再テストを同時に実施する

主要スクリーンショット証跡

環境とデプロイ

JDK 11 バージョン確認

Maven バージョン確認

Apache Tomcat 9.0.60 起動成功

Maven パッケージング成功

WAR プロジェクトデプロイ成功

通常機能ベースライン

テストプロジェクトホームページ正常アクセス

通常機能ベースライン検証成功

修正前の検証

Spring Framework 5.3.17 依存関係確認

修正前の内部プロパティパス読み取り可能

修正と再テスト

修正バージョンパッケージング成功

修正後の内部プロパティパス読み取り不可

修正後の通常機能再テスト成功

修正後の Spring Framework 5.3.18 依存関係確認

現在の進捗

  • プロジェクトディレクトリの作成
  • README の作成
  • テストレポートの作成
  • JDK、Maven、Tomcat 環境の準備
  • Spring MVC テストプロジェクトの構築
  • WAR プロジェクトのパッケージングとデプロイの完了
  • 通常機能ベースライン検証の完了
  • 脆弱性影響条件の確認の完了
  • ローカル読み取り専用リスク診断の完了
  • 脆弱性原因分析の完了
  • Spring Framework バージョンアップグレードの完了
  • 修正後セキュリティ再テストの完了
  • 修正後通常機能再テストの完了
  • 修正後の実際の依存バージョンの確認
  • テストレポートとスクリーンショット証跡の整理

プロジェクト総括

本プロジェクトは、ローカル分離環境で Spring Framework CVE-2022-22965 の影響条件確認、リスク顕在化の診断、バージョンアップグレードによる修正、修正後の再テストを完了しました。

修正前プロジェクトは Spring Framework 5.3.17 を使用しました。JDK 11、Spring MVC、Apache Tomcat 9.0.60、従来の WAR デプロイ環境において、class.module.name プロパティパスは読み取り可能と判断されました。

修正後プロジェクトは Spring Framework を 5.3.18 にアップグレードしました。同じプロパティパスは読み取り不可になり、同時に名前とメールアドレスの通常のデータバインディング機能は引き続き使用できます。

本プロジェクトでは完全なリモートコード悪用は実行せず、安全で制御可能な読み取り専用の方法で修正前後の差分検証を完了しました。

プロジェクトは以下の能力を重点的に示しています。

  • Java と Spring MVC の基本環境構築
  • Maven プロジェクトのビルド
  • Tomcat WAR アプリケーションのデプロイ
  • Spring データバインディング機構の理解
  • 脆弱性影響条件の分析
  • セキュリティテストプロセスの設計
  • コンポーネントのバージョンアップグレード
  • 修正後の再テスト
  • 通常機能のリグレッションテスト
  • セキュリティテストレポートの作成
  • スクリーンショット証跡と GitHub プロジェクトの整理
ツールをダウンロード