Apache Struts 2の脆弱性「CVE-2017-5638」、遠隔で任意コード実行が可能に

Apache Struts 2の脆弱性「CVE-2017-5638」、遠隔で任意コード実行が可能に

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:
図1:更新プログラムのコード差分

適切なエラーメッセージをユーザに表示するために、LocalizedTextUtil で定義された関数 “findText” を利用して、エラーキーに対応する定義されたエラーメッセージを取得します。

図3:
図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 ルールを更新しました。

参考記事:

翻訳:室賀 美和(Core Technology Marketing, TrendLabs)