Apache Struts 2 の脆弱性 (S2-045) に関する注意喚起
https://www.jpcert.or.jp/at/2017/at170009.html
概要
Apache Software Foundation が提供している Apache Struts 2 には脆弱性(S2-045/CVE-2017-5638) が存在します。遠隔の攻撃者が、細工した HTTP リクエストを送信することで、Apache Struts 2 を使用するアプリケーション (Strutsアプリケーション) を実行しているサーバにおいて、任意のコードを実行する可能性があります。脆弱性の詳細については、Apache Software Foundation の情報を確認してください。
本脆弱性の実証コードが公開されており、JPCERT/CC にて実証コードを用いて検証した結果、Struts アプリケーションを実行しているユーザの実行権限 で任意のコードが実行されることを確認しました。
本脆弱性は、Struts 2 で標準で使用される Jakarta Multipart parser *1の処理に起因し、Struts の設定ファイル (struts.xml など) で使用するパー サを特に指定していない場合は、本脆弱性の影響を受けることを JPCERT/CCで確認しています。
- 1 Jakarta Multipart parser
multipart/form-data 形式のリクエストを処理するために Struts 2 に標準で組み込まれているパーサ。デフォルトでは、本パーサが使用される。
https://cwiki.apache.org/confluence/display/WW/File+Upload#FileUpload-AlternateLibraries
Apache Software Foundation から、本脆弱性に対する修正済みソフトウェアが提供されています。影響を受けるバージョンのソフトウェアを利用してい る場合には、「V. 対策」を参考に、早期の対応を行うことを強く推奨します。
想定される攻撃シナリオ
Struts アプリケーションに対して、細工した HTTP リクエストを送信することで、Struts アプリケーションを実行しているサーバ上で任意のコードが実行されます。
対象
本脆弱性の影響を受ける製品は以下の通りです。
- Apache Struts 2.3.5 から 2.3.31 まで
- Apache Struts 2.5 から 2.5.10 まで
JPCERT/CC による検証結果
JPCERT/CC では、本脆弱性に対する実証コードを用いて、以下の検証を実施しました。
【検証内容】
Struts アプリケーションを Apache Tomcat 上に配備し、実証コードを用いて、細工した HTTP リクエストを送ることで、Struts アプリケーションを実行しているサーバ上で任意のコードが実行されるか確認しました。
【検証環境】
- CentOS 7.1
- Apache Tomcat 8.5.11
- Java 1.8.0_121
【検証結果】
- 本脆弱性の影響を受けるバージョンの Apache Struts 2 を利用している場合、任意のコード実行が可能なことを確認しました。
- 本脆弱性が修正されたバージョンの Apache Struts 2 を利用している場合、任意のコードが実行されないことを確認しました。
- 使用するパーサをデフォルトの Jakarta Multipart parser からJakartaStreamMultiPartRequest に変更した場合、任意のコードが実行されないことを確認しました。
○:実証コードが動作しないことを確認
×:実証コードが動作し、任意のコード実行が可能であることを確認
- Apache Struts 2.3.31 : ×
- Apache Struts 2.3.31 (使用するパーサ変更時) : ○
- Apache Struts 2.3.32 : ○
- Apache Struts 2.5.10 : ×
- Apache Struts 2.5.10.1 : ○
なお、JPCERT/CC では、サーブレットフィルタ*2 を用いて不正なリクエストの制限を行った場合でも、実証コードが動作しないことを確認しています。
- サーブレットフィルタ
Web アプリケーション (サーブレット) に対するリクエストの前処理を行うための機能。
http://otndnld.oracle.co.jp/document/products/as10g/1013/doc_cd/web.1013/B28596-01/filters.htm
対策
Apache Software Foundation より、本脆弱性を修正したバージョンが公開されています。十分なテストを実施の上、修正済みバージョンを適用することを強くお勧めします。
- Apache Struts 2.3.32
- Apache Struts 2.5.10.1
また、Apache Software Foundation は、パーサをデフォルトの Jakarta Multipart parser (JakartaMultiPartRequest) から変更することも対策とし て呼びかけています。速やかなアップデートが難しい場合は、本対策の適用をご検討ください。
他のパーサとして、Struts 2.3.18 から標準で組み込まれているJakartaStreamMultiPartRequest や、追加のプラグインとして Pell Multipart Plugin が挙げられており、Struts の設定ファイル (struts.xml など) で”struts.multipart.parser” パラメータを設定することで変更が可能です。
設定方法などの詳細は、以下を参照してください。
https://cwiki.apache.org/confluence/display/WW/File+Upload#FileUpload-AlternateLibraries
参考情報
- Apache Struts 2 Documentation
Version Notes 2.3.32
https://struts.apache.org/docs/version-notes-2332.html - Apache Struts 2 Documentation Version Notes 2.5.10.1
https://struts.apache.org/docs/version-notes-25101.html - Apache Software Foundation
Download a Release of Apache Struts
https://struts.apache.org/download.cgi - Apache Struts 2 Documentation
S2-045 : Possible Remote Code Execution when performing file upload based on Jakarta Multipart parser.
https://struts.apache.org/docs/s2-045.html - Apache Struts 2 Documentation
Alternate Libraries
https://cwiki.apache.org/confluence/display/WW/File+Upload#FileUpload-AlternateLibraries - 独立行政法人情報処理推進機構 (IPA)
Apache Struts2 の脆弱性対策について(CVE-2017-5638)(S2-045)
https://www.ipa.go.jp/security/ciadr/vul/20170308-struts.html - JVNVU#93610402
Apache Struts2 に任意のコードが実行可能な脆弱性
https://jvn.jp/vu/JVNVU93610402/
備考
最終更新日 2017.03.13