🌲

Spring Frameworkの脆弱性 CVE-2016-1000027についての簡易的なまとめ

2022/05/20に公開

記事について

Spring Bootを扱っているシステムで、脆弱性スキャナーにCVSS V3 Base Score 9.8の脆弱性が引っ掛かったという報告が上がったので、調査した簡易まとめ記事となります。
https://nvd.nist.gov/vuln/detail/CVE-2016-1000027

詳細はSpring FrameworkのIssueを見た方が手っ取り早いのですが、簡易的なまとめと対策を日本語で残しておくと誰かが便利に使ってくれるかな、という用途で書いてあります。今後詳細な解説記事などが出た場合は、そちらの方が情報量多いと思うので、この記事は2022年5月20日時点の判断であることをご留意いただきながらご覧ください。

英語読むのが苦にならない方向けのIssueはこちら。
https://github.com/spring-projects/spring-framework/issues/24434

結論

対応策

  • org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter および、RMI, Spring HTTP Invokerの機能を利用している場合、利用を取りやめて、代替手段となるプロトコルでの通信を検討してください。
    • 上記以外のHTTPを介したリモート実行の機能も概ね非推奨となっているため、Spring Frameworkを利用してのリモート実行機能が必須の場合、新たなREST APIエンドポイントを作成し、エンドポイントを通じて処理を行うように変更してください。
  • HttpInvokerServiceExporter はSpring Framework 5.3以降Deprecatedとなっているため、前記バージョン以降のバージョンを利用している場合は、非推奨なメソッドコールを行っていないかを確認してください。
  • どうしてもSpring HTTP Invokerの利用が避けられない場合は、こちらのリンクを参照に、HttpInvokerServiceExporterの実態をJEP290で導入されたデシリアライズフィルターを利用するものに差し替えると良い、という記事も見つけましたが[1]、こちらに関しては自分の知見が足りないため、詳細については書きません。
  • 上記調査・対応が完了した場合、対象CVEを脆弱性スキャナのスキャン例外対象にして良いと思われます[2]

なんでこの対応?

  • Spring FrameworkのRMIやHTTP InvokerなどのHTTPを用いたMethod Invokeの機能[3]には、受け取った値をデシリアライズする際にRCE(リモートコード実行)を引き起こす危険なパターンがある。
  • だがこれはSpring Frameworkの問題ではない。「信頼できないソース・発信元からのデシリアライズ」という行為自体が危険であるため、コードの変更でどうこうできる問題ではない。
    • Issuesには「そもそもJavaのデシリアライズというものが抱える問題だし、Spring3.xからもう出てたやん?」という意見も[4]
    • HTTP Invoker等のメソッドは、バージョンアップに伴いDeprecatedとなっており、これに従っていれば回避できる問題。
  • そんな古くからある問題がいきなり脆弱性データベースで更新されたため、脆弱性スキャナが問題として拾ってきただけ。
    • SpringOneでの発表や、2022/5/19にSpring Boot 3.0.0-M3リリースの報告[5]があり、それに伴い「Deprecatedなメソッドは6系では消しちゃうね」というのを自動で拾ってきてしまったのでは……という説が自分の中で濃厚です。(ここはリリースノートや詳細しっかり見てないので憶測となります)
  • NVDでは対策として「Spring Framework 6系に上げろ」とのことですが、Java EEがJakarta EEにパッケージ変わるよーなどなど、対応JDKのバージョンによって破壊的変更が起こる可能性もあるので、Spring Frameworkのバージョンアップを一緒にやってしまう対応は避けた方が無難かと思われます。
    • メジャーアップデートはしっかり別で計画作りましょう。

まとめ

いきなりえげつないスコアが目に入ったので焦りましたが、現代のWebでRemoting HTTP Invoker使うケースはほとんど無いと思うので、脆弱性スキャンの例外化で対応は終わりだと思います。

脚注
  1. https://blog.gypsyengineer.com/en/security/detecting-dangerous-spring-exporters-with-codeql.html ↩︎

  2. 抑制例を記事で書いてる間に、Issueの方でdependency-check-mavenでの対応方法を書いてくださっている方がいたので、こっちをリンクさせてもらいます。抑制せずに無視してもいいですが、Issueの流れにある通り「ビルドパイプライン止まったぞ」という件への対応としてはこれが一番早いと思います。 https://github.com/spring-projects/spring-framework/issues/24434#issuecomment-1132621725 ↩︎

  3. 「Remoting HTTP Invoker」と呼ばれる技術ということを今回調べて初めて知りました。特定のメソッドをバイナリ形式でラップしてHTTPでクライアントに送って、クライアント側のリソース・環境でそのメソッドを実行するようなイメージで解釈しています。情報確認元はリンク先を参照。
    https://www.baeldung.com/spring-remoting-http-invoker
    https://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#remoting ↩︎

  4. https://github.com/spring-projects/spring-framework/issues/24434#issuecomment-744519525 ↩︎

  5. https://spring.io/blog/2022/05/19/spring-boot-3-0-0-m3-available-now ↩︎

Discussion