Skip to main content

Spring4Shell:JavaのRCE脆弱性についてわかっていること

blog feature security alert purple

2022年3月31日

0 分で読めます

Spring4Shellについてすでにご存じですか?この記事のSpring4Shellの修正方法のセクションに進むか、Spring4Shellの詳細解説を読んで、ゼロデイのリモートコード実行(RCE)の仕組みをご確認ください。


3月30日の早朝(私にとっては)に、同僚のDeveloperSteveがSlackチャンネルに「ねえ、これ見た?」というメッセージを投稿しました。広く使われているJavaのSpringフレームワークに「おそらく」リモートコード実行(RCE)が存在するという「事前警告」でした。後になってわかったのですが、それよりも早く、削除されたツイートを見たSnyk SecurityチームがSpringの潜在的なRCEについて調査を始めていました。

当初、詳細は不明瞭でした。スクリーンショット付きのツイートはすでに削除されていました。また、プルリクエスト(PR)への言及もありましたが、実際には2月18日に作成され、3月29日にようやくマージされたものでした。

さまざまな関係者が「Spring4Shell」(あるいは単にSpringShell)という呼称を広めようとする一方で、Spring CoreのメンテナーはPRに「既知のRCEはない」とコメントしていました。

いったい何が起きていたのでしょうか。そして今、何が起きているのでしょうか?

Spring4Shellとは?

@Autowiredアノテーションを使ったり、コンストラクターインジェクションの機能を利用したりしたことがあれば、Springエコシステムにおける依存性注入を使ったことになります。

影響を受けるバージョンでは、細工したHTTP POSTリクエストを送信してClassLoaderを操作することで、RCEが可能になります。

現時点では、Java Runtime Environment(JRE)バージョン9以降とTomcatバージョン9以降を使用している場合にのみ、エクスプロイトが可能であることが確認されています。

慎重を期し、不完全な情報に基づいて行動しないよう、Snykのセキュリティ研究者は3月30日を通して状況の調査に時間を費やしました。

現時点での結論は、信頼性の高いRCEの脅威がSpring Coreのspring-beansパッケージに存在するということです。良くも悪くも、正式名称はSpring4Shellです。Springエコシステムには、すでに正規のSpring Shellプロジェクトがあるため、この名称には納得できます。

状況の進展に応じて、脆弱性データベースで引き続き最新情報をお知らせします。

Spring4Shellの修正方法

現在のエクスプロイトが機能しないSpring Frameworkの新バージョンがリリースされました。バージョンは5.2.20と5.3.18です。また、Spring Bootをお使いの場合は、Spring Frameworkとspring-beansの変更を取り込んだバージョン2.5.12と2.6.6が本日リリースされました。

推奨順に、以下の修正手順を実施してください。

  • Spring Frameworkを直接使用している場合は、バージョン5.2.20または5.3.18にアップグレードしてください。

  • Spring Bootを使用している場合は、バージョン2.15.12または2.6.6を使用してください。

  • 現時点でSpringをアップグレードできない場合は、バージョン8のJREやTomcatコンテナを使用して、問題を緩和してください。

今後、さらに(または別の)脆弱性が見つかれば、Springに追加のアップデートがリリースされる可能性があります。このような深刻度の高い問題に大きな注目が集まると、よく見られる展開です(Log4Shellのときのように)。

Snykのツールはすでに更新され、プロジェクトに脆弱性がある場合に通知するようになりました。

Snykのテスト結果を表示するターミナル。バージョン5.2.20および5.3.18で修正されたSpring Frameworkのリモートコード実行を含む、2件の脆弱性が特定されています。

Snykで無料アカウントに登録しましょう。登録後、またはコマンドラインから、プロジェクトにSpring4Shellの脆弱性があるかどうかをテストできます。

この記事を更新するとともに、JREとTomcatのバージョン9以降でRCEを実証するPoCコードリポジトリを公開する予定です。最新情報はこちらをご確認ください。

Spring4Shellをめぐる当初の混乱を振り返る

3月30日の早朝、チームが最初に知らされたブログ記事の一つは、すでに削除されていました。この記事では、これも削除されたツイートが引用されていました。両方とも削除されていたものの、Spring Coreのデシリアライゼーションに関連するコミットへの参照は確認できました(デシリアライゼーションは、過去にもRCEにつながったことのあるJavaの機能です。Log4Shellのように)。

このコミットへのコメントには、次のように書かれていました。

Since SerializationUtils#deserialize is based on Java's serialization
mechanism, it can be the source of Remote Code Execution (RCE)
vulnerabilities.

その日のうちに、Spring CoreにRCEが存在する可能性があるという話題が広まりました(ただし、検証可能な事実による裏付けはほとんどありませんでした)。

コメント欄のさらに下では、Spring Coreのコミッターが別のコメントに同意し、このコミットは既知のRCEとは無関係だと確認しました。

コミット7f7fb58、Spring CoreのRCEに関する主張、安全でないデシリアライゼーション、責任あるセキュリティ報告についての、暗い背景のGitHubディスカッションのスクリーンショット。

実際、このコミットに関連するPRを見ると、最初に作成されたのは2月18日でした。

ここで重要なのは、この問題が進展する一方で、インターネット上では、まったく別のプロジェクトに存在する既知の問題、Spring Cloud Functionと混同されていたことです。混乱を広げないため、この脆弱性の詳細には触れません。Spring Cloudの脆弱性について書かれた情報を読んでいるなら、Spring4Shellについて知るには見当違いだということだけ覚えておいてください(お願いですから、別の名前にしてくれませんか?)。

要点

上記で推奨した修正方法を実施して、Spring4Shellから保護しましょう。無料のSnykアカウントに登録して、修正を始めることができます。

CTFを始めよう

オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。

続きを読む

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSecのご紹介:AI開発のスピードに対応するセキュリティ

AI駆動型開発のスピードに、従来のセキュリティワークフローは追いついていません。SnykのAgentic AppSecは、セキュリティエージェントが脆弱性を継続的に検出、修正、検証し、人が基準を定められるようにします。

blog feature ai violet
Blog

VulnBump:AIエージェントはビルドを壊さずに脆弱な依存関係を修正できるか?

VulnBumpは、実際の依存関係アップグレード307件を対象にAIエージェントをテストします。脆弱性が解消され、ビルドとテストが成功した場合にのみ、修正としてカウントされます。

Blog

フロンティアモデルは脆弱性を発見した。攻撃者だけがエクスプロイトチェーンを見つけた。

静的解析で欠陥は見つかりましたが、ライブ攻撃テストで侵害につながる連鎖を実証できたのは唯一でした。Evo COS、Claude Security、Claude Code Securityを比較します。