Java を利用したオープンソースの Web アプリケーション開発フレームワーク「Apache Struts」には、「Struts 1」と「Struts 2」という 2 つの主要バージョンが存在します。Struts 1 のサポートは 2008 年に終了しており、現在では 2007 年の初めにリリースされた Struts 2 が採用されています。Struts 2 への移行に際して「Struts 1プラグイン」が提供されており、Struts 1 のビジネスロジックを記述する「Action クラス」と、値を格納する「ActionForm クラス」はStruts 2 でも利用可能です。今回公表された脆弱性「CVE-2017-9791」は、「遠隔でのコード実行(Remote Code Execution、RCE)」を可能とするもので、Struts 1 プラグインで確認されました。影響を受けるバージョンは「Struts2.3.x」で、「2.5.x」に影響はありません。(「2.4.x」はリリースされていません。)
2017年3月に確認された前回の事例は、Apache Struts 2 の「Object Graph Navigation Language(OGNL)式」を利用して RCE が可能になる脆弱性でした。今回公表された CVE-2017-9791 も、OGNL 式を利用して RCE が可能になる脆弱性です。この脆弱性は、「S2-048」として公式サイトで報告されています。
■攻撃シナリオ
RCEを実施するには、Struts2を利用する脆弱なサーバに対して、パラメータに不正な値を設定したリクエストを送信する必要があります。より具体的には、Struts1 プラグインを利用しているサーバが、ユーザからの入力値を Struts 1 の Actionクラスに渡す実装をしていた場合、この脆弱性攻撃の対象になります。例えば、メッセージを処理する「ActionMessageクラス」が、不正な入力値をエラーメッセージの一部として利用するような場合がこれに該当します。
攻撃者は、HTTP リクエストの URL やボディ部にパラメータとして記述した不正なコードを、脆弱な Webアプリケーションをホストするサーバに送信し、実行することが可能です。この攻撃の有効性を実証した「Proof-of-concept(PoC、概念実証型エクスプロイト)」もすでに公開されています。
■脆弱性の解析
Struts を開発するApache の発表によると、ActionMessageクラスに対してユーザからの入力データを直接渡す代わりに、下記のようにキーの値を指定してリソースを利用することで、この脆弱性に対応することが可能です。
messages.add(“msg”, new ActionMessage(“struts1.gangsterAdded”,gform.getName()));
下記のように、入力データを直接渡してはいけません。
messages.add(“msg”, new ActionMessage(“Gangster ” + gform.getName() + ” wasadded”));
Struts 2.3.x に含まれるサンプルソースコードには、Struts 1プラグインを利用した上記の間違った使用例のコードが記述されています。このコードは、「SaveGangsterAction.java」ファイルの「execute」メソッドで確認することができます。
executeメソッドのコードを読むと、ユーザからの入力値が「gform.getName()」メソッドによって取得され、パラメータとして直接ActionMessage オブジェクトに渡されています。この時、gform.getName()メソッドは、ユーザからの入力値を無害化処理せずにそのまま返すため、フォームに入力することによって OGNL 式を埋め込むことが可能です。また、このONGL 式が埋め込まれた文字列は、「getText(msg.getKey()…)」のようなコードによって、さらに別の処理で利用することも可能です。
Apache Struts 2 のバージョン 2.3.x が、Struts 1 プラグインおよびStruts 1 の Actionを利用している場合、脆弱性が存在することが報告されています。もし、このような構成で Struts を利用している場合、Apacheの勧告に従い、ActionMessage に直接入力データを渡す代わりにキーを利用してリソースを指定してください。あるいは、Apache Struts2.5.x を利用してください。
■トレンドマイクロの対策
トレンドマイクロ製品をご利用のユーザは、この脅威から守られています。サーバ向け総合セキュリティ製品「Trend Micro Deep Security™」をご利用のお客様は、以下の DPIルールによってこの脆弱性を利用する脅威から保護されています。
- 1008490 – Apache Struts2 Struts 1 Plugin Showcase Remote Code ExecutionVulnerability (CVE-2017-9791)
ネットワークセキュリティ対策製品「TippingPoint」では、以下のMainlineDV filterにより今回の脅威をブロックします。
- 29070: HTTP: Apache Struts 2 Struts 1 SaveGangster.action Showcase SiteAccess
- 「Examining CVE-2017-9791: New Apache Struts Remote Code Execution Vulnerability」
by Govind Sarda (Vulnerability Research)
参考記事:
翻訳:澤山 高士(Core Technology Marketing, TrendLabs)