Spring4Shell:JavaのRCE脆弱性についてわかっていること
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で無料アカウントに登録しましょう。登録後、またはコマンドラインから、プロジェクトにSpring4Shellの脆弱性があるかどうかをテストできます。
この記事を更新するとともに、JREとTomcatのバージョン9以降でRCEを実証するPoCコードリポジトリを公開する予定です。最新情報はこちらをご確認ください。
Spring4Shellをめぐる当初の混乱を振り返る
3月30日の早朝、チームが最初に知らされたブログ記事の一つは、すでに削除されていました。この記事では、これも削除されたツイートが引用されていました。両方とも削除されていたものの、Spring Coreのデシリアライゼーションに関連するコミットへの参照は確認できました(デシリアライゼーションは、過去にもRCEにつながったことのあるJavaの機能です。Log4Shellのように)。
このコミットへのコメントには、次のように書かれていました。
その日のうちに、Spring CoreにRCEが存在する可能性があるという話題が広まりました(ただし、検証可能な事実による裏付けはほとんどありませんでした)。
コメント欄のさらに下では、Spring Coreのコミッターが別のコメントに同意し、このコミットは既知のRCEとは無関係だと確認しました。

実際、このコミットに関連するPRを見ると、最初に作成されたのは2月18日でした。
ここで重要なのは、この問題が進展する一方で、インターネット上では、まったく別のプロジェクトに存在する既知の問題、Spring Cloud Functionと混同されていたことです。混乱を広げないため、この脆弱性の詳細には触れません。Spring Cloudの脆弱性について書かれた情報を読んでいるなら、Spring4Shellについて知るには見当違いだということだけ覚えておいてください(お願いですから、別の名前にしてくれませんか?)。
要点
上記で推奨した修正方法を実施して、Spring4Shellから保護しましょう。無料のSnykアカウントに登録して、修正を始めることができます。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。



