ブログトップ 記事一覧 ログイン 無料ブログ開設

piyolog RSSフィード

2014-04-24

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

| 06:49 |  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影響あり*51.2、1.3POJO 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-0094Struts2ParametersInterceptorからクラスローダーの操作を許す脆弱性JVNDB-2014-001603
CVE-2014-0112Struts2CVE-2014-0094の修正漏れによる脆弱性JVNDB-2014-000045
CVE-2014-0113Struts2CookieInterceptorからクラスローダーの操作を許す脆弱性未アサイン
CVE-2014-0114Struts1クラスローダーの操作を許す脆弱性未アサイン

確認している検証コード

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\WMBSD・LAC有効*10
(.*\.|^|.*|\[('|"))(c|C)lass(\.|('|")]|\[).*Apache Software Foundation有効
(.*\.|^)(class|Class)(\.|\[).*HP恐らく有効*11
^class\..*S2-020効果なし(抜け有り)
(.*\.|^)class\..*Apache Strutsリポジトリ効果なし(抜け有り)

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

f:id:Kango:20140425132929p:image:w640

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

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

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

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

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

被害最小化の事前準備策

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

被害最小化の詳細は辻さんのBlogが詳しいです。

攻撃観測事例

影響が出た事例

以下に掲載しています。

クラスローダーの脆弱性の対応をアナウンスしているWAF・IPS等

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

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

謝辞

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

  • 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検証結果による

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

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

*5JavaBeansに対するリフレクションと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アクセス