Apache Struts は、オープンソースのフレームワークで、Java の Webアプリケーションを構築するために用いられます。過去に Apache Struts で確認された「リモートでコードが実行される脆弱性(Remote Code Execution、RCE)」をトレンドマイクロが調査したところ、ほとんどで「Object Graph Navigation Language(OGNL)」のプログラミング式が利用されていました。Apache Struts のプロセスの多くが OGNLを利用しているため、これを利用することで遠隔でのコード実行が容易になります。
OGNLを利用しリモートでコードが実行される脆弱性が Apache Struts 2 に新たに確認されました。この脆弱性には「CVE-2017-5638」として CVE識別番号が割り当てられています。この脆弱性を利用した攻撃は既に報告されています。トレンドマイクロの調査および監視からも、この脆弱性を利用した攻撃が確認されています。
■攻撃のシナリオ
この特殊な脆弱性は、サーバがファイルのアップロードリクエスト処理に ”Jakarta” のプラグインを利用している場合に悪用される恐れがあります。攻撃者は、まず、サーバにファイルをアップロードさせるよう細工したリクエストを送信します。
そして、Content-Typeヘッダに不正なコードを送信し、問題の脆弱性を抱えるサーバにコマンドを実行することが可能となります。実際に有効な攻撃ができることを実証している攻撃コード「Proof-of-concept(PoC、概念実証型エクスプロイト)」が公開されています。
■脆弱性の分析
さらに理解を深めるため、脆弱性の更新プログラムを解析したところ、開発者は、“FileUploadInterceptor.java” からクラス “LocalizedTextUtil” の利用を削除したことが確認できました。これは、マルチパートの HTTPリクエストを使ったファイルアップロードが成功しなかった場合、ユーザにエラーメッセージを表示するためのものです。
図1:更新プログラムのコード差分
適切なエラーメッセージをユーザに表示するために、LocalizedTextUtil で定義された関数 “findText” を利用して、エラーキーに対応する定義されたエラーメッセージを取得します。
図2:Apache Struts の File Upload関数のエラーメッセージの定義
findText関数の定義は次のとおりです。
public static String findText(Class aClass, String aTextName,
Locale locale, String defaultMessage, Object[] args )
この関数は、変数 “aTextName” に渡されたエラーキーに対応する、ローカルに保存されたテキストメッセージを検索します。パラメータは次のとおりです。
- aClass:FileUploadInterceptor は、エラーメッセージ検索の開始点として使用するエラークラスを渡します。
- aTextName:対応するエラーメッセージ検索に利用されるエラーキー
- ロケール:各エラーキーに対応するエラーメッセージが保存される場所
- defaultMessage:どのリソースバンドルにもテキストメッセージが見つからない場合に返されるメッセージ
- args:エラー引数のリソースバンドル
エラーメッセージが見つかると、それらは OGNL として判断され、処理されます。従って、攻撃者が Content-Typeヘッダに “multipart/form-data” が含まれる OGNL を渡すと、その値が処理され、任意のコードをリモートで実行するために利用可能になります。
この問題を解決するために、開発者は、攻撃者への出力に利用される “java.io.File” と、クラス “LocalizedTextUtil” と “java.io.File” を削除しました。
影響を受ける Apache Strutsのバージョンは、Struts 2.3.5 から Struts 2.3.31まで、および Struts 2.5 から Struts 2.5.10までです。Jakarta Multipart parser を使用している場合は、Apache Strutsバージョン2.3.32または2.5.10.1へ更新してください。または、別の実装に切り替えることが提案されています。
■トレンドマイクロの対策
トレンドマイクロ製品をご利用のユーザは、この脅威から守られています。サーバ向け総合セキュリティ製品「Trend Micro Deep Security™」をご利用のお客様は、脆弱性を利用する脅威から保護されています。また、弊社のネットワーク挙動監視ソリューション「Deep Discovery™」のサンドボックスやファイル解析エンジンにより、他のエンジンやパターンの更新がなくても、この脅威をその挙動で検出することができます。
サーバ向け総合セキュリティ製品「Trend Micro Deep Security™」をご利用のお客様は、以下の DPIルールによってこの脆弱性を利用する脅威から保護されています。
- 1008207 – Apache Struts2 Remote Code Execution Vulnerability (CVE-2017-5638)
ネットワーク型対策製品「Deep Discovery™ Inspector」は、以下の DDIルールによってこの脅威を検知します。
- 2348 – CVE-2017-5638 – APACHE STRUTS EXPLOIT – HTTP (Request)
- 2352 – CVE-2017-5638 – APACHE STRUTS EXPLOIT – HTTP (Request) – Variant 2
ネットワークセキュリティ対策製品「TippingPoint」では、以下のCustom Shield Writer (CSW) および MainlineDVフィルタにより今回の脅威をブロックします。
- CSW: HTTP: Apache Struts Content-type Command Injection Vulnerability (CVE-2017-5638)
- 27410: HTTP: Apache Struts Content-type Command Injection Vulnerability (CVE-2017-5638)
【更新情報】
2017/3/14 | 11:50 | 本文の一部を修正しました。 |
2017/9/25 | 12:45 | DDI ルールを更新しました。 |
参考記事:
- 「CVE-2017-5638: Apache Struts 2 Vulnerability Leads to Remote Code Execution」
by Suraj Sahu (Vulnerability Research Engineer)
翻訳:室賀 美和(Core Technology Marketing, TrendLabs)