Strutsの脆弱性CVE-2014-0094

最終更新日時:2014-05-19 00:00:00
Java

概要


Struts2 によいて、クラスローダーの操作を許してしまう脆弱性が CVE-2014-0094 の内容となりますが、これは Struts2 の全てのバージョンにとどまらず、同様の脆弱性が Struts1 にもあるこが分かっています。
クロスローダーが操作されてしまうと、以下のようなことが起きる可能性があります。

・ Web アプリケーションの範囲内での情報の取得
・ アプリケーションを一時的に使用不可にする
・ 任意の場所にファイルを作成
・ 上記のファイルを含めて、任意のファイルを Web アプリケーションの実行権限での実行

つまり、全てのバージョンで Tomcat の実行権限で任意のコードが実行出来てしまうという、かなり重大な問題となります。

様々なサイトで解説されていますが、以下は、それらを私なりにまとめたものとなります。
詳細は各サイトの解説をどうぞ。

http://www.ipa.go.jp/security/ciadr/vul/20140417-struts.html
http://d.hatena.ne.jp/Kango/20140424/1398376155
http://ameblo.jp/smeokano/entry-11835988431.html
http://boscono.hatenablog.com/entry/2014/05/03/094534#fn-29e0a68c
http://qiita.com/ykare@github/items/9c7a244cb20345b7731c


なお、SAStruts や Grails 等、Struts を使用しているフレームワークの場合には、影響の有無が使われ方により異なるようなので、各フレームワークにより検証が必要のようです。

経緯


IPA のサイトで詳しく書かれています。
http://www.ipa.go.jp/security/ciadr/vul/20140417-struts.html

念のため要約した同じ内容のものを貼り付けておきます。

日付概要
2014/03/05Apache Software Foundationが、CVE-2014-0094 の脆弱性の対策をした Apache Struts 2.3.16.1 を公開
2014/04/16NTT-CERT から IPA に、CVE-2014-0094 の脆弱性を攻撃するコードが公開されているという情報提供あり
2014/04/17IPA が CVE-2014-0094 の脆弱性について注意を喚起
2014/04/18NTT-CERT から IPA に、CVE-2014-0094 の脆弱性について、Apache Struts 2.3.16.1 に対策漏れがあるという届出あり
JPCERT/CC 経由で Apache Software Foundation へ情報通知
2014/04/22セキュリティベンダから、Apache Struts 2.3.16.1 に対策漏れ(CVE-2014-0112 の脆弱性)があるという注意喚起あり
2014/04/24セキュリティベンダから、Apache Struts 1 系にも類似の脆弱性が存在するという注意喚起あり
Apache Software Foundation から、Apache Struts の設定による回避策および近日中に対応する旨のアナウンスあり
2014/04/25JPCERT/CC、IPA が共同で運用する JVN にて、脆弱性対策情報(回避策)を公開
Apache Software Foundation から、CVE-2014-0112 および CVE-2014-0113 の脆弱性の対策をした、Apache Struts 2.3.16.2 を公開


実は経緯はあまり重要ではなく、重要なのは、CVE-2014-0094 の脆弱性を対策したはずの 2.3.16.1 というバージョンでは不完全であるということです。
バージョンアップで対応する場合には、2.3.16.2 にする必要があります。

対策方法


一番良いのは、上記で書いたように、2.3.16.2 のバージョンアップすることです。
これで、脆弱性は消滅します。

しかし、場合によってはバージョンアップすることが厳しい状況もあるでしょう。
※私がそのパターンの最たるものですが(/_\*)
特に、Struts1 からは Struts2 へは簡単にはバージョンアップ出来ないですし。

といったわけで、回避策が重要になるケースも多々あるかと思います。

Struts2 での回避策


Apache Struts がアナウンスしている excludeParams で不正な表現をフィルタリングしてしまうのが良いようです。

http://struts.apache.org/development/2.x/docs/s2-021.html

 <interceptor-ref name="params">
  <param name="excludeParams">(.*\.|^|.*|\[('|"))(c|C)lass(\.|('|")]|\[).*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param>
 </interceptor-ref>


※上記 URL の記述には一部ミスがありますので注意 (2014/05/19 現在)

Struts1 での回避策


以下のサイトが良くまとまっていると思うのですが、どれもこれも既存のコードに手を入れないといけないので、簡単に、、、とはいかないようですね。

http://boscono.hatenablog.com/entry/2014/05/03/094534#fn-29e0a68c

それでも Struts2 にバージョンアップすることを考えれば、十分現実的ですが(^_^;
今のところスタンダードな対応方法というのは無さそうですが、Redhat の Struts1 脆弱性対応について以下のサイトで分かりやすく解説されているので、参考になるかと思います。

http://qiita.com/ykare@github/items/9c7a244cb20345b7731c


攻撃例


詳しく解説してしまうと良からぬ輩が真似してしまうので参考 URL を挙げておくだけに留めます。

http://sec.baidu.com/index.php?research/detail/id/18

Tomcat のバージョンにも左右されるのですが、いわゆる webroot を変更するのはどのバージョンでも簡単に出来そうですね。。。
ひどい(-_-#

お問い合わせは 掲示板 にて。