piyolog

piyokangoの備忘録です。セキュリティの出来事を中心にまとめています。このサイトはGoogle Analyticsを利用しています。

Strutsの脆弱性CVE-2014-0094について改めてまとめてみた

Struts2においてクラスローダーの操作を許してしまう脆弱性(CVE-2014-0094)について先日調べたのですが、その後のセキュリティベンダの調査により当初に比べて影響範囲が変わってきていることから、再度整理をかねてまとめます。尚、これら情報はpiyokangoが全て検証したわけではないためご注意ください。また当然ながら悪用することは厳禁です。

Apache Software Foundationより、当該脆弱性情報に関するアナウンスが出ました。

クラスローダーが操作される脆弱性の影響範囲

NTT-CERTやMBSD、LACの調査により次のStrutsのバージョンが影響を受けることが判明しています。またBeanUtilsを使ってリクエストパラメータをJavaBeansにセットしているフレームワークであれば、同様の問題が起こるのではないかとの指摘があります。*1

フレームワーク 影響有無 バージョン 特記事項
Struts1 影響あり 1.1、1.2.9、1.3.10*2
それ以前のバージョンも影響を受ける可能性
原因はBeanUtilsを使ってリクエストパラメータをチェックなくJavaBeansにセットしていたため*3
Struts2 影響あり 2.3.16.1以前  
SAStruts 影響なし*4  
S2Struts 影響あり*5 1.2、1.3 POJO ActionFormを使用している場合に影響を受ける
POJO Actionは影響を受けない(参考)
Teeda 影響なし  
S2JSF 影響なし  
Grails 影響ない模様*6  

クラスローダーが操作される脆弱性とは何か

外部からJavaのクラスローダーの操作を許してしまう脆弱性です。クラスローダーを操作して何が出来るかはStrutsが動作するアプリケーションサーバーに依存します。
IPAでは次の影響を受ける可能性を報告しています。

  • Webアプリケーションの動作権限内で情報の窃取や特定ファイルの操作出来る
  • Webアプリケーションを一時的に使用不可に出来る
  • 攻撃者が操作したファイルに Java コードが含まれている場合、任意のコードが実行される

何故Javaであるにも関わらず任意のコードが実行できてしまうのかについては、金床さんが書かれたBlog記事が詳しいです。

S2-020でCVE-2014-0094として修正が行われましたが、その後修正漏れがあったとしてCVE-2014-0112としてCVE番号が割り当てられています。またCookieを使って行うことも可能とのことで、CVE-2014-0113が割り当てられています。さらにStruts1向けにCVE-2014-0114の割り当てが行われています。

CVE 対象 内容 JVN
CVE-2014-0094 Struts2 ParametersInterceptorからクラスローダーの操作を許す脆弱性 JVNDB-2014-001603
CVE-2014-0112 Struts2 CVE-2014-0094の修正漏れによる脆弱性 JVNDB-2014-000045
CVE-2014-0113 Struts2 CookieInterceptorからクラスローダーの操作を許す脆弱性 アサイ
CVE-2014-0114 Struts1 クラスローダーの操作を許す脆弱性 アサイ

確認している検証コード

piyokangoはCVE-2014-0094を使ったTomcat上で動作する次の検証コードの存在を確認しています。どれもTomcatの設定情報を変更して行われるものです。未検証ですが、GETだけでなくPOSTやcookieを使って同じようにクロスローダーを操作できる様です。

Strutsを動かしているTomcatバージョンごとの影響

検証コードではTomcatの設定変更を行っていますが、Tomcatのバージョンごとに設定可能な項目が変わるようです。なお、どの項目が設定可能かについては中国のWebサイトで解説があったJSPファイルを使って確認しました。

Tomcatバージョン docBase アクセスログ関係 検証に使ったStrutsバージョン docBaseの設定変更検証 アクセスログの設定変更検証 リソース一覧
5.5.36 有り 確認できず 1.3.10 動作せず*9 動作せず 属性一覧(pastebin)
6.0.39 有り 確認できず 2.3.16.1 可能 動作せず 属性一覧(pastebin)
7.0.53 有り 確認できず 2.3.16.1 可能 動作せず 属性一覧(pastebin)
8.0.5 有り 有り 2.3.16.1 可能 可能 属性一覧(pastebin)

JBoss等、その他のアプリケーションサーバーでStruts脆弱性が悪用された場合にどのような影響があるかについてはそれぞれ確認が必要です。

対策

  • Struts1
    • 2013年4月5日にサポート終了のため修正版リリースは現在行われていません。回避策の適用検討が必要です。ただし修正版、または回避策の提供をする可能性についてApache Software Foundationよりアナウンスが出ています。
  • Struts2
    • 2.3.16.2へアップデートする
    • 2.3.16.2の変更点はこちらのBlogが詳しかったです。

回避策

システムに影響が及ぶため更新がすぐにはできない、Struts1を利用しておりEOLとなっている等、修正版の適用が出来ないケースにおいては影響を緩和するために回避策の適用を検討する必要があります。

回避策(1) 特定パラメータのフィルタ機能を実装する

次の正規表現に該当する文字列がパラメータとして指定された場合、これを拒否するフィルタ機能を実装することで影響を緩和できます。複数の正規表現がCVE-2014-0094の回避策として提示されているため整理します。

正規表現 公開元 影響緩和の有効性 注釈
(^|\W)[cC]lass\W MBSD・LAC 有効 *10
(.*\.|^|.*|\[('|"))(c|C)lass(\.|('|")]|\[).* Apache Software Foundation 有効
(.*\.|^)(class|Class)(\.|\[).* HP 恐らく有効 *11
^class\..* S2-020 効果なし(抜け有り)
(.*\.|^)class\..* Apache Strutsリポジトリ 効果なし(抜け有り)

上2つの正規表現は全てにマッチしました。

また、フィルタを実装する場合は次の点に注意が必要です。

  • web.xmlでの定義順序でStrutsのフィルタよりも先に定義されているか
  • GET以外のリクエスト(POST,cookie,mulitpart/form-dataのPOST)に対しても機能するか
回避策(2) WAF/IPSで特定パラメータを拒否する

WAF/IPSで上記のリクエストを受け取った場合にこれを遮断することで影響を緩和できます。各製品の対応状況・設定方法については個別に確認が必要です。また対応をうたっている場合も、フィルタ同様にクエリストリング以外でリクエストを受けた場合も同様に対応しているかは特に確認が必要です。

回避策(3) BeanUtilsの呼び出し箇所の実装を修正する

Struts1はBeanUtilsを呼び出している箇所の実装方法(リクエストをチェック無しで使用している)に起因してこの問題が発生しているため、これにチェックを組み込むというものです。サンプルコードをkawashimaさんが公開しています。

被害最小化の事前準備策

今回の修正漏れの様に、今後も似たような脆弱性が発生するかもしれません。万一攻撃を受けた際の被害が深刻とならないよう、事前に被害最小化の準備をすることも重要です。
被害最小化の詳細は辻さんのBlogが詳しいです。

脆弱性関連トピックのタイムライン

クラスローダーの脆弱性に関連するトピックについて時系列に整理をします。

謝辞

このまとめは次の皆様の情報を元に修正・追加を行っています。ありがとうございます!

  • 2014/04/25 Exploitについて未反映情報を教えていただいた@kitagawa_takujiさん
  • 2014/04/30 URL掲載誤りのご指摘と未反映情報について教えていただいた@hack_japanさん。
  • 2014/04/30 Struts1修正版・回避策の提供の可能性について情報を教えていただいた@kitagawa_takujiさん

更新履歴

  • 2014/04/25 AM 新規公開
  • 2014/04/25 AM 一部誤字、及び誤解を招きそうな箇所を修正
  • 2014/04/25 AM 検証コードで出来ることを更新
  • 2014/04/25 AM S2-021の情報を反映
  • 2014/04/25 PM 正規表現の検証結果を追加
  • 2014/04/25 PM SAStrutsは影響を受けないことを追記
  • 2014/04/25 PM Seasar2フレームワークの影響有無(ひがさんのBlog情報)を反映
  • 2014/04/25 PM 最新情報を反映
  • 2014/04/26 AM 最新情報を反映、BeanUtilsの箇所を修正
  • 2014/04/27 AM 2.3.16.2リリースに伴い情報を反映
  • 2014/04/27 PM S2-021のリンクを正式版へ修正
  • 2014/04/28 AM 警察庁の注意喚起を追記
  • 2014/04/28 PM WAF対応状況を追記
  • 2014/04/29 PM 影響を受けたシステムを追記
  • 2014/04/30 PM 影響を受けたシステムを追記
  • 2014/04/30 PM Struts1対応の可能性についての言及を追記。

*1:BeanUtilsを使用していると影響を受けるとの表現とも取れるため、4/26表現を修正しました。

*2:LAC検証結果による

*3:S2-020類似攻撃のStruts1での対策方法 - Qiita,2014/04/25アクセス

*4:StrutsのClassLoader脆弱性はSAStrutsに影響しません - ひがやすを blog,2014/04/25アクセス

*5:JavaBeansに対するリフレクションとClassLoader脆弱性 - ひがやすを blog,2014/04/25アクセス

*6:公式情報ではありません。

*7:Outboundでファイルとプリンターの共有(139,445/tcp)を許可している必要あり

*8:北河さんから情報を頂きました。ありがとうございます。

*9:私の環境ではTomcat5では検証コードが動きませんでしたが、属性一覧にはdocBaseがあるのでもしかすると検証方法が悪いのかもしれません。

*10:\をエスケープしてしまっていたため、4/25修正

*11:未検証

*12:サイト構築ソフトに欠陥 官公庁などサイバー攻撃の恐れ,日本経済新聞,2014/04/25アクセス:魚拓

*13:サイト構築ソフトに欠陥 官公庁などサイバー攻撃の恐れ,日本経済新聞,2014/04/29アクセス:魚拓

*14:(PDF)Apache Struts2 の脆弱性を狙ったアクセスの検知について,警察庁,2014/04/28アクセス