2026年、Strutsの脆弱性は「EOL版に修正が来ない」ことが最大の問題
2026年にはApache Strutsで複数の脆弱性が公表されました。本記事では、EOLとなったStruts 2.5系への影響が確認されている主要7件を取り上げます。なかでも10月公表のCVE-2026-104711は、条件次第で認証なしのリモートコード実行(RCE)につながるおそれがあります。Apache公式の最大深刻度はModerateですが、HeroDevsはCriticalと評価しています。
やっかいなのは、OSS版の修正がStruts 6.xと7.xにしか提供されない点です。Struts 2.5や2.3はすでにEOL(サポート終了)のため、コミュニティからパッチは出ません。
この記事では、次の3点を整理します。
- 本記事で取り上げるStruts脆弱性7件の内容と、自分のアプリが該当するかの見分け方
- すぐに取れる暫定回避策
- アップグレードが難しい場合の選択肢である、HeroDevsの「NES for Apache Struts」
要点だけ先にまとめると、次のとおりです。
- Struts 6.x / 7.x を利用中:6.12.0 または 7.4.0 以降に上げれば、本記事で扱う7件の修正を含みます(利用構成と他の脆弱性も別途確認してください)。
- Struts 2.5.x / 2.3.x を利用中:OSS版の修正はありません。6.x以降への移行か、NESのような延長サポートの導入が必要です。
-
restfulアクションマッパーを有効にしている:最優先でCVE-2026-104711の影響を確認してください。
2026年に公開されたApache Strutsの主要な脆弱性7件
以下は2026年に公表された脆弱性のうち、Struts 2.5系への影響が確認されている主要7件です。2026年のStruts脆弱性を網羅した一覧ではありません。深刻度は評価主体によって異なるため、表ではHeroDevsの評価を示し、Apache公式の評価は別途確認できるようにしています。7件すべてが2.5系に影響し、うち6件が2.3系にも影響します。
| CVE | 公開日 | 種別 | 深刻度(HeroDevs) | 対象パッケージ | 影響を受けるバージョン | OSS修正版 | NES修正版 |
|---|---|---|---|---|---|---|---|
| CVE-2026-104711 | 2026年10月5日 | RCE(OGNLインジェクション) | Critical | struts2-core | 2.0.0〜2.3.37、2.5.0〜2.5.33、6.0.0〜6.11.0、7.0.0〜7.3.0 | 6.12.0 / 7.4.0 | v2.5.41 |
| CVE-2026-104712 | 2026年10月5日 | DoS | High | struts2-core | 2.5.14〜2.5.33、6.0.0〜6.11.0、7.0.0〜7.3.0 | 6.12.0 / 7.4.0 | v2.5.41 |
| CVE-2026-104713 | 2026年10月5日 | DoS | Medium | struts2-rest-plugin | 2.1.8〜2.3.37、2.5.0〜2.5.33、6.0.0〜6.11.0、7.0.0〜7.3.0 | 6.12.0 / 7.4.0 | v2.5.41 |
| CVE-2026-104714 | 2026年10月5日 | 情報漏えい(競合状態) | High | struts2-core | 2.0.0〜2.3.37、2.5.0〜2.5.33、6.0.0〜6.11.0、7.0.0〜7.3.0 | 6.12.0 / 7.4.0 | v2.5.41 |
| CVE-2026-73633 | 2026年8月14日 | DoS | High | struts2-json-plugin | 2.1.8〜2.3.37、2.5.0〜2.5.33、6.0.0〜6.10.0、7.0.0〜7.2.1 | 6.11.0 / 7.3.0 | v2.5.40 |
| CVE-2026-73635 | 2026年8月14日 | DoS | High | struts2-core | 2.0.0〜2.3.37、2.5.0〜2.5.33、6.0.0〜6.10.x、7.0.0〜7.2.x | 6.11.0 / 7.3.0 | v2.5.40 |
| CVE-2025-68493 | 2026年1月11日 | XXE | High | struts2-core | 2.0.0〜2.3.37、2.5.0〜2.5.33、6.0.0〜6.1.0 | 6.1.1以降 | v2.5.39 |
10月の4件(CVE-2026-104711〜104714)はNES 2.5.41(2026年10月7日公開)で修正されています。日付はApache公式の公表日を採用しています。HeroDevsの脆弱性ディレクトリに表示される掲載日とは異なる場合があります。CVE-2025-68493は2025年採番ですが、2026年1月に公表されました。参考:Apache公式アナウンス、NESリリースノート。
各脆弱性の技術解説と暫定回避策
7件のうち、デフォルト構成のまま全アプリが該当するものは多くありません。それぞれに「該当条件」があるので、自分のアプリが当てはまるかを順に確認していきましょう。
CVE-2026-104711:restful アクションマッパーのOGNLインジェクション(RCEの可能性)
本記事で優先的に確認したい脆弱性の一つです。Apache公式の最大深刻度はModerate、HeroDevsの評価はCriticalです。レガシーな restful アクションマッパーを使っていると、URLパスに埋め込んだOGNL式が評価され、認証なしのリモートコード実行につながるおそれがあります。
原因は RestfulActionMapper.getMapping にあります。パスの1つ目と2つ目のスラッシュの間の文字列を、検証せずにアクション名として扱ってしまいます。DefaultActionMapper と違い、struts.allowed.action.names によるチェックも通りません。
たとえば次のようなパスでは、%{1+1} がそのままアクション名になります。
/%{1+1}/x
該当条件
-
struts.mapper.classにrestfulを指定しているアプリが対象です。 - デフォルトのマッパー、
restful2マッパー、Struts RESTプラグインを使っているアプリは影響を受けません。 - Struts 7は、デフォルトのOGNL許可リストを無効化している場合に限って悪用可能です。
対策:6.12.0 / 7.4.0 へアップグレードするか、2.5系はNESの修正版を適用します。Apache公式の暫定回避策は、レガシーな restful マッパーを使わず、デフォルトマッパー、restful2、またはRESTプラグインへ移行することです。ルーティングの互換性を検証してください。まずは struts.xml と struts.properties を restful で検索し、マッパー設定を確認してください。
CVE-2026-104712:BigDecimalの文字列変換によるDoS(High)
わずか9文字の入力で、約10万文字の文字列をサーバーに生成させられる脆弱性です。StringConverter.convertToString が小数部の最大桁数を Integer.MAX_VALUE に設定しているため、BigDecimal がフルスケールで出力されます。
1E-100000
該当条件:リクエストパラメータを BigDecimal 型のプロパティにバインドし、それをStrutsタグで描画しているアプリだけが対象です。金額や数量を扱う業務アプリは要確認です。
暫定回避策:スケールに上限を設けた BigDecimal 用のカスタム型コンバーターを作り、struts-conversion.properties(2.5系では xwork-conversion.properties)に登録します。
CVE-2026-104713:RESTプラグインのリクエストボディによるDoS(Medium)
RESTプラグインが、リクエストボディをサイズ無制限でメモリに読み込んでしまう問題です。ContentTypeInterceptor が確認するのは Content-Length が正の値かどうかだけで、ハンドラーが読み込む文字数に上限がありません。巨大なボディを送るだけでJavaヒープを枯渇させられます。
該当条件:struts2-rest-plugin でリクエストボディを受け取っているアプリは、デフォルト構成で該当します。
暫定対策:リバースプロキシやサーブレットコンテナなどアプリケーションの前段で、リクエストボディのサイズを制限します。これはStruts本体の修正を代替する恒久対策ではありません。
CVE-2026-104714:MessageFormatの競合による情報漏えい(High)
あるユーザーの日付・時刻の値が別のユーザーのレスポンスに表示されたり、フォーマット処理が失敗してサーバーエラーが発生したりする脆弱性です。特別に細工した入力がなくても、同時アクセスで発生する可能性があります。
ローカライズ用のテキストプロバイダーは、パターンとロケールごとに MessageFormat インスタンスをキャッシュし、全リクエストで共有します。しかし MessageFormat はスレッドセーフではありません。日付や時刻をフォーマットするメッセージでは、並行リクエストが同じ Calendar に値を書き込んでしまいます。
該当条件:リソースバンドルのメッセージに {0,date} や {0,time} のような日付・時刻の書式指定があるアプリが対象です。
暫定回避策:日付・時刻はアプリ側のコードで先に文字列化し、メッセージには書式指定なしで埋め込みます。
CVE-2026-73633:JSONプラグインのリクエストボディによるDoS(High)
1回の巨大なJSONリクエストでJVMヒープを使い切らせることができる脆弱性です。JSONInterceptor が渡したリーダーを、JSONUtil.deserialize(Reader) がサイズ上限なしで StringBuilder に読み込みます。2.5系ではさらに toString() でコピーをもう1つ作るため、メモリ消費が倍になります。
行単位で読み込む実装のため、改行を含まないボディは最初の1回で全量がバッファされます。この欠陥は2009年のStruts 2.1.8から存在していました。
該当条件:JSONプラグインでリクエストボディを受け取っているアプリが対象です。レスポンスのシリアライズにしか使っていない場合は影響を受けません。
暫定回避策:不要なアクションではJSONリクエストボディの処理を無効化し、リバースプロキシかサーブレットコンテナでリクエストボディの最大サイズを制限します。JSON入力長のStruts設定だけでは、読み込み段階でのメモリ消費を十分に防げない場合があります。
CVE-2026-73635:Accept-Languageヘッダーによるキャッシュ肥大化DoS(High)
Accept-Language ヘッダーを変えながらリクエストを送り続けるだけで、OutOfMemoryError を引き起こせる脆弱性です。テキストプロバイダーが、リソースバンドルやメッセージフォーマットを削除の仕組みがないキャッシュにため込んでしまうことが原因です。
struts.locale が未設定だと、ロケールはヘッダーの値が検証なしで使われます。型変換やバリデーションに失敗する入力と組み合わせると、ロケールごとにキャッシュエントリが増え続けます。この欠陥は2006年のStruts 2.0.0から存在していました。
暫定回避策:struts.locale でロケールを固定します。固定しているアプリはこの攻撃経路の影響を受けません。修正版の6.11.0 / 7.3.0以降では、関連キャッシュのサイズ制限も導入されています。
struts.locale=ja_JP
CVE-2025-68493:XWorkのXMLパーサーにおけるXXE(High)
XWorkコンポーネントのXML設定パーサーが、外部エンティティを処理してしまう脆弱性です。任意ファイルの読み取り、SSRF、DoSに悪用されるおそれがあります。
暫定回避策:xwork.saxParserFactory に外部エンティティを無効化したカスタムファクトリーを指定するか、JVMのシステムプロパティで外部エンティティをブロックします。
暫定回避策はあくまで応急処置です。CVE-2026-104711にはマッパー切り替え、CVE-2026-104713には前段でのリクエストサイズ制限という回避策がありますが、いずれも互換性や適用範囲を検証し、修正版の適用を優先してください。
Struts 2.5 / 2.3 / 1.x はEOL:OSS版では修正が提供されない
2026年の7件のうち、OSS版で修正されたのはStruts 6.xと7.xだけです。2.5系以前はコミュニティサポートが終了しており、脆弱性が見つかってもパッチはリリースされません。
| バージョン系統 | 最終リリース | 状況 | 2026年の脆弱性へのOSS修正 |
|---|---|---|---|
| Struts 1.x | 1.3.10 | 2013年4月にEOL | なし |
| Struts 2.3.x | 2.3.37 | EOL | なし |
| Struts 2.5.x | 2.5.33 | 2023年10月にEOL告知、約6か月の追加セキュリティ対応期間を経て2024年4月末に終了 | なし |
| Struts 6.x | 継続中 | サポート対象 | 6.11.0 / 6.12.0 |
| Struts 7.x | 継続中 | サポート対象 | 7.3.0 / 7.4.0 |
EOL日はHeroDevsの製品ページとリリース一覧の記載に基づきます。
「それなら6.xに上げればいい」と言うのは簡単ですが、現場ではそうもいきません。
- 2.5から6.xへの移行では、OGNLの制限強化やパッケージ構成の変更に伴う改修と回帰テストが発生します。
- Struts 1.xからの移行は、実質的にアプリの作り直しです。
- 長年安定稼働している業務システムほど、改修の予算と体制を確保しにくいのが実情です。
一方で、パッチの当たっていないフレームワークを動かし続けることは、SOC 2、HIPAA、PCIなどの要件に抵触するとHeroDevsは指摘しています。脆弱性スキャナーが出す「EOL/Obsolete Software: Apache Struts 2.3.x Detected」といった警告も、EOL版を使っていることを示すものです。
「移行はすぐにできない。でも脆弱性は放置できない」。このギャップを埋めるのが、次に紹介する延長サポートです。
NES for Apache Strutsとは:EOL版Strutsにセキュリティパッチを届け続ける延長サポート
NES for Apache Strutsは、HeroDevsが提供する商用の延長サポート(Never-Ending Support)です。EOLを迎えたStrutsに対して、脆弱性を修正した互換ビルドを継続的に提供します。今回紹介した7件についても、Struts 2.5系向けのNES修正版が公開されています。
サービスの特長
- ドロップインで置き換え可能:既存のStruts依存関係をNES版に置き換えて導入できます。通常はアプリケーションコードの変更を伴いませんが、利用プラグインや依存関係、実行環境によって調整・回帰テストが必要です。
- 継続的なセキュリティ修正:脆弱性が発見・検証・修正されるたびに、新しいNESリリースが提供されます。
- 依存ライブラリもカバー:Struts本体に加え、対象製品に含まれる一部の依存ライブラリの修正にも対応します。具体的な対象は製品・契約内容とリリースノートで確認してください。
- 専門チームによる保守:Javaとセキュリティのシニアエンジニアがメンテナンスを担当します。
対応バージョン
ドキュメントには、次のバージョン系統向けのセットアップガイドが用意されています。
| 系統 | 提供内容 |
|---|---|
| Struts 1.0 / 1.1 / 1.2 / 1.3 | セキュリティ修正版(1.1〜1.3はトライアル用セットアップあり) |
| Struts 1.3 Forward Compatibility | 新しいサーバー環境でStruts 1.3を動かすための互換版 |
| Struts 2.5 | セキュリティ修正版(トライアル用セットアップあり) |
製品ページには幅広いバージョンへの対応が案内されていますが、公開セットアップガイドに掲載されていない2.3系などについては、提供可否・対象リリース・契約条件をHeroDevsに確認してください。
SLAとコンプライアンス
- 対応時間は深刻度に応じて決まり、セキュリティ問題とアプリが動かなくなる問題が最優先で扱われます。
- パッチ提供までの目標期間については、脆弱性の深刻度、起算日、対象製品などの条件を含め、正式なSLA文書で確認してください。
- 継続的な脆弱性修正はSOC 2、PCI DSS、HIPAA、ISO 27001、FedRAMPなどに関連するセキュリティ管理を支援し得ます。ただしNESの導入だけで各規格・制度への準拠が保証されるわけではありません。
ライセンスと価格
- サポートサービスに対する商用ライセンスで、対象リポジトリにコードをコミットするユーザー数に基づいて料金が決まります。
- ユーザーは記名式ではなく、チームメンバー間で振り替えられます。
- 具体的な金額は公開されておらず、価格ページからの問い合わせが必要です。
Forward Compatibility:古いStrutsを新しいサーバーで動かす
別オファリングとして、レガシーなStrutsアプリをリファクタリングなしで新しいアプリケーションサーバーに載せるための互換版もあります。Servlet 5.0以降の javax.* から jakarta.* への名前空間変更に対応したものです。
| サーバー | 移行先 | 移行元 |
|---|---|---|
| Tomcat | 10.0以降 | 7〜9 |
| Jetty | 11以降 | 10 |
| WildFly | 27以降 | 10〜26 |
| GlassFish | 6.2以降 | 5.x |
「Strutsが足かせでミドルウェアを上げられない」というケースで検討できる選択肢です。
導入手順:ビルド設定の変更と動作確認
導入は「認証情報の設定」「レジストリの追加」「依存関係の差し替え」を基本とします。通常はアプリケーションコードの変更を伴いませんが、リビルド後の動作確認が必要です。ここではStruts 2.5をMavenで使っている場合を例に、公式セットアップガイドの流れを紹介します。前提はJava 8以降です。
-
認証情報を設定する
~/.m2/settings.xmlに、NESレジストリ用のサーバー設定を追加します。パスワードにはHeroDevsから発行されたNESアクセストークンを指定します。<servers> <server> <id>herodevs-nes-registry</id> <username>any_text_here_not_used</username> <password>YOUR_NES_ACCESS_TOKEN</password> </server> </servers> -
リポジトリを追加する
pom.xmlにNESレジストリを追加します。<repositories> <repository> <id>herodevs-nes-registry</id> <url>https://registry.nes.herodevs.com/maven</url> </repository> </repositories> -
依存関係をNES版に差し替える
Strutsの依存関係をNES版の座標とバージョンに変更します。利用中のプラグイン(
struts2-json-pluginやstruts2-rest-pluginなど)も同じバージョンにそろえます。<dependency> <groupId>com.herodevs.nes.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.33-struts2-2.5.41</version> </dependency> -
リビルドして動作確認する
mvn clean package
バージョン文字列の 2.5.33-struts2-2.5.41 は、「OSS版 2.5.33 をベースにしたNESリリース 2.5.41」を表しています。本記事の執筆時点では、これがセットアップガイドに記載されたバージョンです。ビルド後は起動、主要画面・API、使用プラグインの動作を確認し、依存ライブラリの衝突と回帰テストを実施してください。
補足として、次の点も押さえておきましょう。
-
Gradleの場合:
~/.gradle/gradle.propertiesにレジストリURL・ユーザー・トークンを定義し、build.gradleのrepositoriesにBasic認証つきのMavenリポジトリとして追加します。 -
ファイアウォール:CI環境やビルドサーバーから
registry.nes.herodevs.comとassets.nes.herodevs.comへの通信を許可してください。 - トライアル:Struts 1.1〜1.3と2.5にはトライアル用のセットアップガイドがあり、契約前に自社アプリで動作を確認できます。
- 最新バージョンの確認:利用できるアーティファクトと最新バージョンはMavenパッケージ一覧で確認できます。
よくある質問(FAQ)
Struts 2.5はまだサポートされていますか?
いいえ。Struts 2.5系は2.5.33を最終リリースとしてEOLとなっており、コミュニティからセキュリティ修正は提供されません。2026年の脆弱性も、OSS版の修正対象は6.xと7.xだけです。
2026年のStruts脆弱性で、最優先で対応すべきものはどれですか?
CVE-2026-104711です。Apache公式評価はModerateですが、認証なしのリモートコード実行につながるおそれがあり、優先的に確認すべき脆弱性です。ただし対象は restful アクションマッパーを使っているアプリに限られるため、まずマッパー設定を確認してください。
自分のアプリがどのStrutsバージョンを使っているか、どう確認すればよいですか?
Mavenなら依存ツリーを出力するのが確実です。直接依存だけでなく、他のライブラリ経由で入っているStrutsも見つけられます。
mvn dependency:tree -Dincludes=org.apache.struts
NESを導入するとき、アプリのコード修正は必要ですか?
通常は不要です。MavenまたはGradleの設定と依存関係を変更してリビルドします。ただし、アプリ固有の依存関係やプラグインによって調整が必要な場合があるため、回帰テストを省略しないでください。
Struts 1も対象ですか?
はい。Struts 1.0〜1.3向けのNESが提供されています。Struts 1が依存するApache Commonsなどのライブラリの脆弱性もあわせて修正されます。
アップグレードとNES、どちらを選ぶべきですか?
6.x / 7.xへ無理なく移行できるなら、アップグレードが基本です。移行に時間がかかる場合や、リプレースまで数年の延命が必要な場合は、NESで安全を確保しながら計画的に移行を進めるのが現実的です。両者は二者択一ではなく、移行期間を守る手段として併用できます。
まとめ:EOL版Strutsを使い続けるなら、パッチの入手経路を確保する
本記事で取り上げた主要7件は、すべてStruts 2.5系に影響し、OSS版では2.5系以前に修正が提供されません。取るべきアクションは次の3つです。
- 利用中のStrutsバージョンと、
restfulマッパー・RESTプラグイン・JSONプラグインの利用有無を棚卸しする。 -
struts.localeの固定やリクエストボディのサイズ制限など、すぐにできる暫定回避策を入れる。 - 6.12.0 / 7.4.0へのアップグレード、またはNES for Apache Strutsの導入で、修正版を適用する。
Strutsの脆弱性は、過去にもCVE-2017-5638のように大規模な被害につながってきました。「動いているから触らない」ではなく、「動かし続けるためにパッチを当て続ける」体制を整えましょう。
NES for Apache Strutsの詳細や見積もりは、HeroDevsの製品ページから確認できます。導入手順の詳細は公式ドキュメントをご覧ください。
NESについてのご質問やお見積もりは、日本語でもご問い合わせいただけます。気軽にお問い合わせください。
参考情報・出典
本記事の脆弱性情報、影響バージョン、回避策、製品仕様は、以下の公開資料を参照しています(確認日:2026年11月14日)。各CVEの詳細やパッチ適用判断は、リンク先の最新情報も確認してください。
Apache Software Foundation(一次情報)
- Apache Struts:2026年の公式アナウンス — 脆弱性の公表日と公式発表
- Apache Struts:Security Bulletins — S2-075〜S2-078などの技術解説、影響条件、回避策、修正バージョン
HeroDevs(脆弱性・製品情報)
- CVE-2026-104711
- CVE-2026-104712
- CVE-2026-104713
- CVE-2026-104714
- CVE-2026-73633
- CVE-2026-73635
- CVE-2025-68493
- NES for Apache Struts:製品概要 — サポート対象・サービス概要
- NES for Apache Struts:リリースノート — NESの修正履歴
- Struts 2.5:セットアップガイド — Mavenによる導入手順
- NES Mavenパッケージ一覧 — 利用可能なアーティファクト
- NESリリース一覧 — リリース情報
- HeroDevs価格案内 — 見積もり窓口