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を利用しており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つの正規表現は全てにマッチしました。
また、フィルタを実装する場合は次の点に注意が必要です。
回避策(2) WAF/IPSで特定パラメータを拒否する
WAF/IPSで上記のリクエストを受け取った場合にこれを遮断することで影響を緩和できます。各製品の対応状況・設定方法については個別に確認が必要です。また対応をうたっている場合も、フィルタ同様にクエリストリング以外でリクエストを受けた場合も同様に対応しているかは特に確認が必要です。
回避策(3) BeanUtilsの呼び出し箇所の実装を修正する
Struts1はBeanUtilsを呼び出している箇所の実装方法(リクエストをチェック無しで使用している)に起因してこの問題が発生しているため、これにチェックを組み込むというものです。サンプルコードをkawashimaさんが公開しています。
被害最小化の事前準備策
今回の修正漏れの様に、今後も似たような脆弱性が発生するかもしれません。万一攻撃を受けた際の被害が深刻とならないよう、事前に被害最小化の準備をすることも重要です。
被害最小化の詳細は辻さんのBlogが詳しいです。
攻撃観測事例
脆弱性関連トピックのタイムライン
クラスローダーの脆弱性に関連するトピックについて時系列に整理をします。
- 2014/03/05
- 2014/03/06
- FullDisclosureにS2-020では修正が十分ではないとの指摘が投稿
- 2014/03/31
- Apache Strutsのリポジトリでクラスローダー対応のパターン改善のコミットが行われる
- 2014/04/03
- JSPを使ったリモートから任意のプログラムを実行させる検証コードが中国のWebサイト上で公開
- 2014/04/04
- 2014/04/16
- NTT-CERTがIPAにCVE-2014-0094の検証コードが公開されていると情報提供
- 2014/04/17
- IPAがNTT-CERTからの情報提供を受け、CVE-2014-0094の注意喚起情報を公開
- 2014/04/18
- 2014/04/20
- FullDisclosureにMBSDがS2-020にはCVE-2014-0094のバイパスが存在する指摘を投稿
- 2014/04/22
- MBSDがCVE-2014-0094のバイパスについて注意喚起情報を公開
- 2014/04/23
- MBSDが発見したゼロデイへの暫定対応としてサーブレットフィルタを公開
- 2014/04/24
- 2014/04/25
- Struts1の原因となっているBeanUtilsを使用しているFWとして、S2Strutsが影響を受けることが判明
- LACがJSOCにおいて国外からのアクセスによる脆弱性を悪用する攻撃を6件観測したと発表
- 国税庁WebサイトがStruts1を使用していることから対応完了までサービス停止
- 2014/04/27
- Apache Software FoundationがStruts2の修正版2.3.16.2をリリース
- 2014/04/28
- 2014/04/30
- Apache Software FoundationがStruts1について修正版、回避策の提供の可能性についてアナウンス。
謝辞
このまとめは次の皆様の情報を元に修正・追加を行っています。ありがとうございます!
- 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)を許可している必要あり
*9:私の環境ではTomcat5では検証コードが動きませんでしたが、属性一覧にはdocBaseがあるのでもしかすると検証方法が悪いのかもしれません。
*11:未検証
*12:サイト構築ソフトに欠陥 官公庁などサイバー攻撃の恐れ,日本経済新聞,2014/04/25アクセス:魚拓
*13:サイト構築ソフトに欠陥 官公庁などサイバー攻撃の恐れ,日本経済新聞,2014/04/29アクセス:魚拓
*14:(PDF)Apache Struts2 の脆弱性を狙ったアクセスの検知について,警察庁,2014/04/28アクセス