Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Apache Struts 2 RESTプラグインにおける、@StrutsParameterの制限が@JsonAnySetterに適用されない問題

2026年10月29日に「JVN」が公開したITニュース「Apache Struts 2 RESTプラグインにおける、@StrutsParameterの制限が@JsonAnySetterに適用されない問題」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Apache Struts 2のRESTプラグインに脆弱性が見つかった。入力データの制限機能が、特定のデータ処理方式に対して適用されない問題だ。これにより、通常なら拒否される不正なデータがシステムに入力され、セキュリティ上のリスクが生じる可能性がある。

ITニュース解説

このニュース記事では、Webアプリケーションを開発するためのフレームワークである「Apache Struts 2」の特定の機能に、セキュリティ上の問題が見つかったことについて述べている。この問題は、外部から送られてくるデータをアプリケーションがどのように受け入れるか、という部分に関わるものである。

まず、Apache Struts 2とは何だろうか。これはJavaというプログラミング言語を使ってWebアプリケーションを効率的に開発するための、いわば「骨組み」を提供するソフトウェアである。ユーザーがWebブラウザを通じて何か操作をする際、そのリクエストを受け取り、内部で処理を行い、最終的に結果をWebページとしてユーザーに返す、という一連の流れをスムーズに構築するための様々な機能が用意されている。

次に、「RESTプラグイン」について説明する。Struts 2には、Webアプリケーションに特定の機能を追加するための「プラグイン」という仕組みがある。その一つがRESTプラグインで、これは「RESTful API」という種類のWeb APIをStruts 2アプリケーションで簡単に構築できるようにする機能を提供する。RESTful APIとは、異なるシステム間でデータをやり取りするための、シンプルで統一されたルールの通信方式のことである。例えば、スマートフォンのアプリがサーバーから情報を取得したり、データを送信したりする際によく利用される。

このRESTプラグインは、データを交換する際に「JSON」という形式のデータを利用することが多い。JSONはJavaScript Object Notationの略で、人間にとっても読みやすく、コンピューターにとっても扱いやすいデータの表現形式である。Struts 2のRESTプラグインは、このJSON形式のデータをJavaプログラム内で扱うために、「Jackson」というライブラリを使用している。Jacksonは、JSONデータをJavaのオブジェクト(プログラム内で扱うデータのまとまり)に変換したり、逆にJavaのオブジェクトをJSONデータに変換したりする役割を担う。

問題の中心となる二つの「アノテーション」について解説する。「アノテーション」とは、プログラムのコードの中に付加する特別な情報のようなもので、そのコードがどのように振る舞うべきか、特定のツールがどのように処理すべきかなどを指示する役割を持つ。

一つ目は「@StrutsParameter」である。これはApache Struts 2の機能の一つで、HTTPリクエスト(Webブラウザからサーバーへ送られる要求)を通じてアプリケーションに送られてくるパラメータのうち、どのパラメータをアプリケーションが受け入れて処理してもよいかを制限するために使われる。例えば、Webフォームからユーザー名やメールアドレスといった特定の情報だけを受け取るべき場合に、このアノテーションを使って「これらの情報だけを受け入れる」と指定する。これにより、悪意のあるユーザーがアプリケーションの内部設定を不正に変更しようとするような、想定外のパラメータを送り込んできても、それを拒否し、アプリケーションのセキュリティを保護する役割がある。つまり、アプリケーションが受け取るデータの種類や範囲を制限することで、不正な操作を防ぐための「門番」のような働きをする。

二つ目は「@JsonAnySetter」である。これは先ほど説明したJacksonライブラリで使われるアノテーションである。通常、JSONデータをJavaオブジェクトに変換する際には、JSONデータ内の各項目(プロパティ)が、Javaオブジェクト内の対応するフィールド(データを保持する変数)にマッピングされる。しかし、@JsonAnySetterは、JSONデータの中にJavaオブジェクトのクラス定義には存在しない「未知のプロパティ」が含まれていた場合に、それらの未知のプロパティを特定のフィールドやメソッドでまとめて受け入れるための機能を提供する。これは、将来的にJSONのデータ形式が拡張され、新しい項目が追加されたとしても、プログラムを修正することなく柔軟に新しいデータを受け取れるようにするために便利に使われることがある。例えば、未知の項目をまとめてマップ(キーと値のペアでデータを保持する構造)として受け取る、といった利用方法が考えられる。

今回の問題は、まさにこの「@StrutsParameter」と「@JsonAnySetter」の組み合わせによって発生する。Apache Struts 2のRESTプラグインが、JSON形式のデータをJacksonライブラリを使って処理する際に、@StrutsParameterによるパラメータ受け入れ制限が、@JsonAnySetterが付与されたフィールドやメソッドに対しては適切に適用されない、という状況である。

具体的には、開発者は@StrutsParameterを使って「このアプリケーションは特定のパラメータしか受け入れない」と明示的に指示しているにもかかわらず、もしそのアプリケーションが@JsonAnySetterも利用している場合、@JsonAnySetterが付与された箇所では@StrutsParameterの制限が無視されてしまう。つまり、アプリケーションの「門番」である@StrutsParameterが、@JsonAnySetterという特別な経路を通ってきたデータに対しては、その役割を果たせない状態になる。

この問題が引き起こす具体的な危険性としては、開発者が想定していなかった、あるいは拒否すべきだと考えていた「意図しないデータ」が、@JsonAnySetterを通じてアプリケーションの内部に受け入れられてしまう点がある。例えば、攻撃者がアプリケーションの内部設定を操作するための特別なパラメータや、データベースの情報を不正に読み出すためのコマンドなどをJSONデータに含めて送り込んできた場合、@StrutsParameterの制限を回避して、それらの不正なパラメータがアプリケーション内部のオブジェクトに設定されてしまう可能性がある。

このような事態が発生すると、情報漏洩(機密データが外部に漏れる)、データの改ざん(アプリケーションが管理するデータが不正に変更される)、さらにはシステムの乗っ取り(攻撃者がアプリケーションを自由に操作できるようになる)といった、非常に深刻なセキュリティ脆弱性につながる危険性がある。開発者が@StrutsParameterで安全を確保していると信じていても、@JsonAnySetterを併用している箇所では、その安全が保障されないという状況に陥るため、予想外の経路から攻撃を受けてしまう恐れがあるのだ。

この問題に対しては、ソフトウェアの提供元であるApache Software Foundationがすでに問題を認識しており、修正版のソフトウェアが提供されている。Apache Struts 2を利用してWebアプリケーションを開発・運用しているシステムエンジニアは、この脆弱性によるリスクを回避するために、速やかにStruts 2を修正版のバージョンに更新する必要がある。ソフトウェアを最新の状態に保ち、セキュリティパッチを適用することは、Webアプリケーションを安全に運用する上で非常に重要な対策である。

関連コンテンツ

関連IT用語