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

本記事は2022年3月30日（米国時間）/2022年3月31日（日本時間）に公開した英語ブログ[Spring4Shell: What we know about the Java RCE vulnerability](https://snyk.io/blog/is-there-such-a-thing-as-spring4shell/) (当初は “Is There any Such Thing as Spring4Shell?” 「Spring4Shellなんてあるんですか？」として公開) を日本語化した内容です。(最終更新: 英語版 2022年4月1日0時、日本語版 2022年4月2日13時)

[![logo-solid-background.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/0f4b5668-62d5-e55e-2ce2-5a6cc5a49196.png)](https://snyk.io/jp)

# Spring4Shell: このJavaのRCE脆弱性について分かったこと

もうSpring4Shellについてよくご存知ですか？本記事の[Spring4Shellへの対応策](https://qiita.com/SnykSec/items/8d6892d856b80505570d#spring4shell%E3%81%B8%E3%81%AE%E5%AF%BE%E5%BF%9C%E7%AD%96)の項目へ進むか、[Spring4Shellの解説記事](https://qiita.com/SnykSec/items/e612511db7adc4537ab9)をご覧になり、このゼロデイのリモートコード実行 (RCE) の仕組みを確認してください。

---

米国時間の3月30日の未明、同僚の[DeveloperSteve](https://twitter.com/DeveloperSteve)がslackチャンネルに「なあ、これ見たことある？」と書きました。それは、大人気のJava の Springフレームワークで『起こりうる』リモートコード実行（RCE）の「事前警告」でした。後で知ったのですが、それより前にSnyk のセキュリティチームは動きはじめていたそうです。後に消去されたツイートをきっかけにして、SpringのRCE脆弱性らしきものの調査を行っていました。

当初の時点では、詳細はよくわからないようでした。スクリーンショット付きのツイートがありましたが、削除されていました。プルリクエスト（PR）への言及がありましたが、分かったのは、最初にアップされたのが2月18日で、マージされたのは3月29日ということでした。

“Spring4Shell” (または単に”SpringShell”) というニックネームを定着させようとする人たちがいて、その一方でSpring Coreのメンテナー（管理者）は「既知のRCEは存在しない」というコメントをPRに残していました。

では、一体何が起きていて、今はどうなっているのでしょうか？


# Spring4Shellとは？

もしあなたが ＠Autowired アノテーションを使用したり、コンストラクタ注入の魔法を利用したことがあるなら、Springのエコシステムで依存性注入に遭遇したことがあるはずです。

影響を受けるバージョンでは、HTTP POSTリクエストを作り込むことでClassLoaderを操作し、RCEを実行することができます。

現時点では、Java Runtime Environment (JRE) バージョン9以上およびTomcatバージョン9以上 * の組み合わせでのみ、この悪用が可能であることが確認されています。

(* 訳注 この脆弱性対応としてTomcatの新バージョンがリリースされています。[Spring Framework RCE, Mitigation Alternative](https://spring.io/blog/2022/04/01/spring-framework-rce-mitigation-alternative)) 

Snykのセキュリティ研究者は、不完全な情報に基づいて行動したくないため、3月30日は一日中、状況を確認することに時間を費やしました。

現時点での我々の結論は、[Spring Coreのspring-beansパッケージ](https://snyk.io/vuln/maven%3Aorg.springframework%3Aspring-beans)には[RCEの脅威](https://security.snyk.io/vuln/SNYK-JAVA-ORGSPRINGFRAMEWORK-2436751)が確かに存在する、というものです。脆弱性には正式にSpring4Shellという名前がついています。Springエコシステムには公式な[Spring Shell](https://spring.io/projects/spring-shell)というプロジェクトが存在するので、（以前一部で使われていたSpring Shellではなく）この呼び方は理にかなっています。

状況の進展に応じて、[Snyk脆弱性データベース](https://security.snyk.io/vuln/SNYK-JAVA-ORGSPRINGFRAMEWORK-2436751)を通じて最新情報を引き続き提供します。


# Spring4Shellへの対応策

これまでの攻撃を防ぐことができるSpring Frameworkの新バージョンがリリースされました。バージョン`5.2.20`と`5.3.18`です。

もしSpring Bootを使っているなら、ちょうどバージョン`2.5.12`と`2.6.6`がリリースされました。Spring Frameworkとspring-beansへの変更が含まれています。

以下は修正方法のリストです。より望ましい方法から列記しています。

* 直接Spring Frameworkを使っている場合は、バージョン`5.2.20`または`5.3.18`にアップグレードしてください
* Spring Bootを使っていれば、バージョン`2.5.12`または`2.6.6`を使ってください。
* Springをアップグレードできない場合、JREのバージョン8とTomcatのバージョン8の両方、またはいずれかを使って問題を防いでください **

(** 訳注・再掲 この脆弱性対応としてTomcatの新バージョンがリリースされています。[Spring Framework RCE, Mitigation Alternative](https://spring.io/blog/2022/04/01/spring-framework-rce-mitigation-alternative)) 

Springに対してより多くのアップデートが行われるかもしれないことを申し添えます。追加で、別の脆弱性が見つかる可能性があるからです。今回のような深刻度の高い問題には注目が集まるため、このようなことが起こりがちです ([Log4Shell](https://snyk.io/blog/find-fix-log4shell-quickly-snyk/)を思い出してください)。

Snykのツールはすでにアップデートされており、あなたのプロジェクトに脆弱性があればそれを報告します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/ea8677c0-008d-58c5-5111-4bae91e0202a.png)

[Snyk](https://app.snyk.io/login?cta=sign-up&loc=nav&page=homepage)の無料アカウントにサインアップしてください。そこから (またはコマンドラインで) 自身のプロジェクトをテストして、Spring4Shellの影響を調べることができます。

このブログ投稿を更新し、JREとTomcatのバージョン9以上でのRCEを実証するPoCコードのリポジトリを作成する予定です。最新情報は弊社のブログやSNSでご確認ください。


# 当初の錯綜についての考察

3月30日早朝、私たちのチームが当初確認したブログ記事のうちの一つが、その後、[削除されました](https://web.archive.org/web/20220330130620/https://bugalert.org/content/notices/2022-03-29-spring.html)。この投稿は、同じく削除されたツイートを参照していました。二重の削除にもかかわらず、デシリアライゼーション（以前にもRCEを引き起こしたJavaの機能 - Log4Shell、聞き馴染みがありますね？）に関連するSpring Core関連の[コミット](https://github.com/spring-projects/spring-framework/commit/7f7fb58dd0dae86d22268a4b59ac7c72a6c22529#diff-6c2618839eda075efe4491842d3673eab8fe1e342f6d9ddc2bbda8556e595864L153)への検証可能な参照がありました。

このコミットのコメントにはこうあります。

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

**日本語訳:**
SerializationUtils#deserialize はJavaのシリアライゼーションの仕組みを使うため、リモートコード実行 (RCE) の脆弱性の原因となる可能性がある。

時間が経つにつれ、Spring CoreでRCEが発生しているのではないかという話題が増えました（検証可能な事実はほとんどありませんが）。

さらにコメント欄で、Spring Coreのコミッターが、このコミットは既知のRCEとは無関係であることを述べた別のコメントを肯定しました。

![pasted image 0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/9eb9fefe-7dad-6025-a8a8-250f9d459578.png)

そして実際、[このコミットが解決したPR](https://github.com/spring-projects/spring-framework/pull/28075)を見ると、最初にオープンされたのは2月18日です。

さて、ここで重要なことがあります。この問題が起きている間、インターネット上ではこの現在進行系の問題と、全く別のプロジェクトの別の既知の問題とが混同されていたのです。[Spring Cloud Function](https://security.snyk.io/vuln/SNYK-JAVA-ORGSPRINGFRAMEWORKCLOUD-2436645)です。この混乱を避けるため、私はこの脆弱性の詳細には触れません。Spring4Shellについて知りたいと思ってSpring Cloudの脆弱性について何か読んでいるのなら、見当違いと言えるでしょう。


# 要点

この記事で紹介した[修正策・緩和策](https://qiita.com/SnykSec/items/8d6892d856b80505570d#spring4shell%E3%81%B8%E3%81%AE%E5%AF%BE%E5%BF%9C%E7%AD%96)を実施して、Spring4Shellから身を守ってください。Snykのフリーアカウントに[サインアップ](https://app.snyk.io/login?cta=sign-up&sect=body&page=spring4shell-what-we-know-about-the-java-rce-vulnerability)すれば、すぐに修正に取りかかることができます。


:::note info
ブログを読んで、Snykを使ってみたい！と思われた方は、ぜひ[無料トライアル](https://snyk.co/qiita)をお試しください。トライアル中の技術的なご質問は、[サポート](https://support.snyk.io/hc/en-us)に**日本語で**お寄せください。
:::

:::note info
[Snyk](https://snyk.io/jp)では、セキュアなコーディングのための情報や脆弱性の最新情報などを発信しています。ぜひ[Twitter](https://twitter.com/snykjp)や[Facebook](https://www.facebook.com/snykJP/)や[ブログ](https://qiita.com/organizations/snyk)のフォローをお願いします。
:::